Java第三次课程实验动手动脑&课堂测试

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;
}

该测试程序的运行结果是false。

原因为当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等 当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。 引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

 

public class ObjectEquals {
public static void main(String[] args)
{
MyTestClass obj1 = new MyTestClass(100);
MyTestClass obj2 = new MyTestClass(100);
System.out.println(obj1==obj2);
System.out.println(obj1.equals(obj2));
}
}
class MyTestClass
{
public int Value;
public boolean equals(Object obj){
return((MyTestClass) obj).Value==this.Value;
}
public MyTestClass(int intValue)
{
Value=intValue;
}
}

该测试程序的运行结果是false true。

该程序中的方法称为类的“构造方法”,有时也习惯称为“构造函数” 当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。 如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”。

 

public class Test {
public static void main(String[] args)
{
Foo obj1=new Foo();
}
}
class Foo
{
int value;
public Foo(int intValue)
{
Value=intValue;
}
}

该程序运行时会出错,原因是 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

 

public class InitializeBlockClass {
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value)
{
this.field=value;
}
public InitializeBlockClass() {

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

运行结果为100 300。

Java进行初始化的地方有两个:初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。

如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

 

运行TestStaticInitializeBlock.java示例,其输出结果如下:

总结如下:

  1. 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行;
  2. 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;
  3. 非静态始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;
  4. 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码
  5. 非静态初始化块可以针对多个重载构造函数进行代码复用

 

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

public class ButtonFactory

{

private static ButtonFactory _instance = null;

public static  ButtonFactory getInstance()

{

    if(null == _instance)

           _instance = new ButtonFactory();

           return _instance;

}

}

 

Integer诡异特性

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);

    }

}

 

使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。

 

posted @ 2018-10-21 17:45  符黑石  阅读(155)  评论(0编辑  收藏  举报