一、java实例变量与类变量
package com.java.util;
public class Person {
String name;
int age;
static int eyeNum;
}
package com.java.util;
public class Test {
public static void main(String[] args) {
Person.eyeNum=2;
System.out.println("1:"+Person.eyeNum);
Person person = new Person();
System.out.println("2:"+person.eyeNum);
Person person2 = new Person();
person2.eyeNum=3;
System.out.println("3:"+person2.eyeNum);
System.out.println("4:"+Person.eyeNum);
}
}
答案:
1:2
2:2
3:3
4:3
说明:因为eyeNum变量是属于Person的类变量,类变量属于类本身,不属于实例出来的java对象,但实例出来的对象可以访问、修改类变量。类变量不会随着对象的增多而进行增多。
二、java实例变量初始化
package com.java.util;
public class Sun {
{
weight=2.0;
}
double weight=2.6;
public String toString(){
return "sun 的weight:"+weight;
}
public static void main(String[] args) {
Sun sun = new Sun();
System.out.println(sun.toString());
}
}
答案:sun 的weight:2.6
说明:在Sun初始化的时候会为它的所有实例变量分配相应的内存空间,当执行其构造方法的时候会对其实例变量进行初始化赋值,赋值顺序将由上而下赋值,因此其weight变量的值始终为最后赋的值。
三、java类变量初始化
package com.java.util;
public class Sun {
static{ name="java编程"; }
static String name="java疯狂讲义";
public static void main(String[] args) {
System.out.println(Sun.name);
}
}
答案:java疯狂讲义
说明:此题目的只是为了让其答题者混淆java实例变量,但与其java实例变量也有一定的区别,java类变量在进行初始化的时候在类进行初始化的时候就对其类变量进行初始化,初始化模式从上自下进行初始化。
四、java继承
package com.java.util;
public class Base {
private int i=2;
public Base(){ System.out.println("result"+this.i); }
public void display(){ System.out.println(i); }
}
package com.java.util;
public class Derived extends Base{
private int i=22;
public Derived(){ i =222; }
public void display(){ System.out.println(i); }
public static void main(String[] args) { new Derived(); }
}
答案:baseresult1:2
derivedResult1:0
说明:子类Derived继承了Base,当子类进行实例的时候首先会默认调用父类的无参数构造方法,在父类构造方法中调用了this.i,此时this表示的子类对象,也好比等于Base derived = new Derived(); System.out.println(derived.i);,由于子类在继承父类的时候如果子类中同样定义了父类私有变量的情况时,子类中的同名私有变量不会将父类中的私有变量覆盖,所以将输出结果为2。但子类在继承父类的时候如果在子类中对父类的共有方法进行了重写,此时子类的方法会将父类的方法覆盖,因此会输出的是子类的结果,因为子类中的实例变量i并没有初始化完成,于是将输出的结果将是0。
五、java宏变量理解
package com.java.util;
public class FinalTest {
public static void main(String[] args) {
final String star="疯狂"+"java"+99.0;
final String star2="疯狂"+"java"+String.valueOf(99.0);
System.out.println(star=="疯狂java99.0");
System.out.println(star2=="疯狂java99.0");
}
}
答案: true false
说明:宏变量:使用final修饰符修饰的变量,并且在编译时就可以确定的其值的变量称为宏变量,宏变量的特点就是在类编译的时候其所有宏变量的名字都将会被其固定值所取代。在定义star2的时候需要使用String类的方法,因此编译器无法在编译时就确定好star2的值,在对其与固定值相比较时将返回为false。