动手动脑

 1.早期我们经常这样定义变量

int value=100;

前面的示例中这样定义变量

MyClass obj=new MyClass();

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

答:不一样,前者只是定义一个变量,后者则是定义对象变量。

2.对象变量可以使用“==”判断两变量值是否相等?

答:不可以,基本类型的变量使用==判断,对象要使用equals来判断,String是对象所以要使用equals来判断。

3.输入并运行以下代码,得到什么结果?

运行结果:

4.以下代码为何无法通过编译?哪儿出错了? 

答:构造函数未定义,newFoo()缺少参数。

5.一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

答:如果父类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块。如果类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块将类的成员赋予初值。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。

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

 

答:

规律:所有类的变量都默认初始化null,数字类的原始数据类型默认初始化为0。执行类的成员定义的默认值或类的初始化块,到底执行哪个要看哪一个排在前面。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。

7.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

public class Jingtai {

public  int num;

 static void change(Jingtai a)

 {

 a.num=10;

 }

public static void main(String[] args)

{

Jingtai b=new Jingtai();

b.num=100;

b.change(b);

System.out.println(b.num);

 

}

 

}

输出的结果为:

该程序的输出结果为  10

原因:通常情况下,静态方法是不能访问类的非静态成员函数以及非静态的变量,因为类里边的静态成员属于类,不用声明类的对象时,静态成员就已经存在了,而非静态成员必须在声明类的对象后才可以分配内存空间,所以类的对象不可以访问类中静态成员。但是,如果先要在静态成原函数中调用非静态中的变量或方法,可以在静态成员函数中声明一个类的对象,然后再调用类的非静态成员或方法。

8.两对整数明明完全一样,为何一个输出true,一个输出false?

答:调用了java.lang.String类,包含了字符串的值并且实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。

9.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

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 TestStaticIntializeBlock
{
public static void main(String[] args)
{
new Leaf();

}
}

结果截图:

结论:静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

10.上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?

 

答:因为它们调用的Interger类的方法不同。

 

posted on 2017-10-20 13:33  宛英东  阅读(217)  评论(0编辑  收藏  举报