课堂练习及动手动脑

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

   不能,当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

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

 

2.进行试验

3如何比较两个对象的“内容”是否一样?

4.代码无法通过编译,哪里出问题了?

 

类提供了一个自定义的构造方法,导致系统不再提供默认的构造方法

 

错误地点:Foo obj1=new Foo();

 

          public Foo(int initValue)

 

 

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

 

Java中任何对象初始化时,属性字段都有默认值,,如一般的char/string,初始化为null,其他数值型初始化为零,但是方法中的“局部变量”不会被初始化,j就是不确定的值,另外Java中不允许重复定义。

 

6.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

 

请自行编写示例代码验证以上结论。

 

class InitializeBlockClass{

 

public int field=100;

 

public InitializeBlockClass(int value){

 

this.field=value;

 

}

 

public InitializeBlockClass(){

 

 

 

}

 

}

 

class InitializeBlockClassNext{

 

public int field1=100;

 

public InitializeBlockClassNext(int value){

 

this.field1=value;

 

}

 

public InitializeBlockClassNext(){

 

 

 

}

 

}

 

class InitializeBlockClassBack{

 

{

 

field2=200;

 

}

 

public int field2=100;

 

public InitializeBlockClassBack(int value){

 

this.field2=value;

 

}

 

public InitializeBlockClassBack(){

 

 

 

}

 

}

 

public class Parent {

 

 

 

public static void main(String[] args) {

 

// TODO 自动生成的方法存根

 

          InitializeBlockClass obj=new InitializeBlockClass();

 

          {

 

           obj.field=200;

 

          }

 

          System.out.println(obj.field);

 

          obj=new InitializeBlockClass(300);

 

          System.out.println(obj.field);

 

          InitializeBlockClassNext obj1=new InitializeBlockClassNext();

 

          System.out.println(obj1.field1);

 

          obj1=new InitializeBlockClassNext(500);

 

          System.out.println(obj1.field1);

 

          InitializeBlockClassBack obj2=new InitializeBlockClassBack();

 

          System.out.println(obj2.field2);

 

          obj2=new InitializeBlockClassBack(600);

 

          System.out.println(obj2.field2);

 

}

 

 

 

}

 

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

静态初始化执行顺序:

 

静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

 

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

 

 class StaticDemo{

 

         static int x;

 

         int y;

 

         static public int getX(){

 

          return x;

 

         }

 

         static void setX(int newX) {

 

// TODO 自动生成的方法存根

 

x=newX;

 

         

 

}

 

         public int getY(){

 

          return y;

 

         }

 

         public void setY(int newY){

 

          y=newY;

 

         }

 

 

 

}

 

public class ShowDemo {

 

 

 

public static void main(String[] args) {

 

// TODO 自动生成的方法存根

 

System.out.println("静态变量x="+StaticDemo.getX());

 

//System.out.println("实例变量y="+StaticDemo.getY());

 

         //实例变量是声明对象初始化才能进行调用,

 

StaticDemo a=new StaticDemo();

 

StaticDemo b=new StaticDemo();

 

a.setX(1);

 

a.setY(2);

 

b.setX(3);

 

b.setY(4);

 

System.out.println("静态变量a.x="+a.getX());

 

System.out.println("静态变量a.y="+a.getY());

 

System.out.println("静态变量b.x="+b.getX());

 

System.out.println("静态变量b.y="+b.getY());

 

}

 

 

 

}

 

9.不使用Eclipse,直接使用命令行运行Test1.javaTest2.JavaTest3.Java

 

 

posted on 2015-10-17 21:36  倾晴  阅读(139)  评论(0编辑  收藏  举报

导航