动手动脑二

一丶

int value=100;
MyClass obj = new MyClass();
这两种方式定义的变量是不一样的,第一种是原始数据类型定义的变量,而第二种是通过引用类名创建一个对象obj出来,obj称为对象变量。

二丶对象变量判断相等

int value1=100;

intvalue2=100;

System.out.println(value1==value2);//true

对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等
但是对于对象变量,无法用“==”来进行判断。

public class ClassAndobject {
    public static void main(String[] args) {
        MyClass obj1=new MyClass();
        MyClass obj2=new MyClass();
        System.out.println(obj1==obj2);//false
    }

class MyClass {
    int value=100;

}

引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

如果要比较两个对象的内容是否一致,就意为字段一致的内容,用equals

如上述内容可以把输出语句改为     

 

 1 package test3;
 2 
 3 public class ObjectEquals {
 4 
 5     public static void main(String[] args) {
 6         MyTestClass obj1=new MyTestClass(100);
 7         MyTestClass obj2=new MyTestClass(100);
 8         System.out.println(obj1.equals(obj2));
 9         System.out.println(obj1.Value);
10         System.out.println(obj2.Value);
11     }
12 
13 }
14 class MyTestClass
15 {
16     public int Value;
17     public boolean equals(MyTestClass obj)
18     {
19         return obj.Value==this.Value;
20     }
21     public MyTestClass(int initValue)
22     {
23         Value=initValue;
24     }
}
三丶构造函数
   public MyTestClass(int initValue)
    {
        Value=initValue;
    }
这个是类的构造函数,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”


上述自定义了一个构造函数,那么系统就不会再提供默认的构造函数,所以错了。
四丶类字段的初始化顺序
package test3;
public class InitializeBlockDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        InitializeBlockClass obj=new InitializeBlockClass();
        System.out.println(obj.field);
        
        obj=new InitializeBlockClass(300);
        System.out.println(obj.field);
    }

}

class InitializeBlockClass{
    //下面这句在初始化块之前与之后,会影响到field字段的初始值
    public int field=100;
    {
        field=200;
    }
    //public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
        
    }
}
结果是:
200
300
五丶
package test3;


class Root
{
    static{
        System.out.println("Root的静态初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    public Root()
    {
        System.out.println("Root的无参数的构造器");
    }
}
class Mid extends Root
{
    static{
        System.out.println("Mid的静态初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid()
    {
        System.out.println("Mid的无参数的构造器");
    }
    public Mid(String msg)
    {
        //通过this调用同一类中重载的构造器
        this();
        System.out.println("Mid的带参数构造器,其参数值:" + msg);
    }
}
class Leaf extends Mid
{
    static{
        System.out.println("Leaf的静态初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }    
    public Leaf()
    {
        //通过super调用父类中有一个字符串参数的构造器
        super("Java初始化顺序演示");
        System.out.println("执行Leaf的构造器");
    }

}

public class TestStaticInitializeBlock
{
    public static void main(String[] args) 
    {
        new Leaf();
        

    }
}
结果:
Root的静态初始化块 Mid的静态初始化块 Leaf的静态初始化块 Root的普通初始化块 Root的无参数的构造器 Mid的普通初始化块 Mid的无参数的构造器 Mid的带参数构造器,其参数值:Java初始化顺序演示 Leaf的普通初始化块 执行Leaf的构造器

1 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行

2 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;

3 非静态初始化块的代码会在类构造函数之前执行

六丶神奇的Integer

 

package test3;

public class StrangeIntegerBehavior 
{

    
    public static void main(String[] args)
    {

        
        Integer i1=100;
       
        Integer j1=100;
        
        System.out.println(i1==j1);

        
        Integer i2=129;
        
        Integer j2=129;
        
        System.out.println(i2==j2);
    
    }


}

 

结果为true

          false

非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

 

 
posted @ 2018-10-21 11:48  小神龙1258  阅读(135)  评论(0编辑  收藏  举报