引用类型 vs 原始数据类型
“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。例:MyClass obj = new MyClass();
诸如int,float之类的变量称为“原始数据类型”的变量。例:int value=100;
变量与内存分配当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。例:MyClass obj=null,此时obj为null。
定义一个原始类型的变量时,会马上给其分配内存。例:int value=100,此时value为100。
对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等?
测试两个对象变量
例: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;
}
运行结果:
测试两个原始数据类型的变量
public class Test {
public static void main(String[] args) {
int value1=100;
int value2=100;
System.out.println(value1==value2);
}
运行结果:
由上述实践得知:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等。
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
报错The constructor Test.Foo() is undefined 翻译: 构造函数 Test.Foo()未定义。
结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
多构造函数
同一个类可以有多个构造函数,多个构造函数之间通过参数来区分。这是方法重载的一个实例。 构造函数之间可以相互调用。
运行结果:
得出结论:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
运行下面的代码,观察输出结果,总结出“静态初始化块的执行顺序”。
1 class Root 2 { 3 static 4 { 5 System.out.println("Root的静态初始化块"); 6 } 7 { 8 System.out.println("Root的普通初始化块"); 9 } 10 public Root() 11 { 12 System.out.println("Root的无参数的构造器"); 13 } 14 } 15 class Mid extends Root 16 { 17 static 18 { 19 System.out.println("Mid的静态初始化块"); 20 } 21 { 22 System.out.println("Mid的普通初始化块"); 23 } 24 public Mid() 25 { 26 System.out.println("Mid的无参数的构造器"); 27 } 28 public Mid(String msg) 29 { 30 //通过this调用同一类中重载的构造器 31 this(); 32 System.out.println("Mid的带参数构造器,其参数值:" + msg); 33 } 34 } 35 class Leaf extends Mid 36 { 37 static 38 { 39 System.out.println("Leaf的静态初始化块"); 40 } 41 { 42 System.out.println("Leaf的普通初始化块"); 43 } 44 public Leaf() 45 { 46 //通过super调用父类中有一个字符串参数的构造器 47 super("Java初始化顺序演示"); 48 System.out.println("执行Leaf的构造器"); 49 } 50 51 } 52 53 public class TestStaticInitializeBlock 54 { 55 public static void main(String[] args) 56 { 57 new Leaf(); 58 59 60 } 61 }
运行结果:
结论:静态初始化块只执行一次。
创建子类型的对象时,也会导致父类型的静态初始化块的执行。
标签:初始化,变量,动脑,System,动手,println,public,out From: https://www.cnblogs.com/ysk0904/p/16776898.html