03-类与对象动手动脑

(1)早期我们经常这样定义变量int value=100;前面的示例中这样定义变量 MyClass obj=new MyClass();

这两种方式定义的变量是一样的吗?

这两种方式定义的变量不是一样的,第一种方式定义的是普通类成员变量,定义这样的原始类型变量时,

会马上给其分配内存。第二种定义的是类对象变量时,实际上并没有创建一个对象,此变量=null。

(2)请输入并运行以下代码,得到什么结果?

public class Test{
    public static void main(String[] args){
        Foo obj1=new Foo();
        Foo obj2=new Foo();





 



        System.out.println(obj1==obj2);
        
        
    }
    
    
    
    
}
class Foo{
    int value=100;
}

运行结果:

(3)以下代码为何编译无法通过?哪出错了?

public class Test{

 public static void main(String[] args){

  Foo obj1=new Foo();

 }

}

class Foo{

int value;

 public Foo(int initValue){

    value=initValue;

}

}

原因:如果类提供了一个自定义的构造方法,将导致系统不再提供默认的构造方法。

(4)使用上页幻灯片中定义的类,以下代码输出结果是什么?

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

输出结果:

总结:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个排在前面。然后执行类的构造函数。

类的初始化块不接受任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须

执行的代码”。

(5)总结静态初始化块的执行顺序

总结:静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。其执行顺序为1.父类的

静态初始块2.子类的静态初始块3.父类的静态初始化块4.子类初始化块。

(6)在静态方法中访问类的实例成员

代码:

public class Exz{
public static void main(String[] args){
Exz.td();
Exz sc = new Exz();
System.out.println("x="+sc.a);

}
int a =5;
static int b = 6;
public static void td(){
System.out.println("实例变量x="+new Exz().a);
System.out.println("静态变量y="+b);
}
}

运行结果:

(7)神奇代码

原因:在通过valueof方法创建Integer对象的时候,如果值在-128-127之间,则返回Integer中已经存在的对象的引用。否则创建一个新的对象。

当值为100时,会直接从中取已存在的对象,所以输出为false。当值为129时,则分别指向不同的对象,输出为false。

原文地址:https://www.cnblogs.com/lwq666/p/7695811.html