第一个问题 :
测试类程序: class ParentClass {
private String privateField = "父类变量--private";
/* friendly */String friendlyField = "父类变量--friendly";
protected String protectedField = "父类变量--protected";
public String publicField = "父类变量--public";
// private的变量无法直接访问,因此我们给他增加了一个访问方法
public String getPrivateFieldValue() {
return privateField;
}
}
public class subclass extends ParentClass {
private String privateField = "子类变量--private";
/* friendly */String friendlyField = "子类变量--friendly";
protected String protectedField = "子类变量--protected";
public String publicField = "子类变量--public";
public String getPrivateFieldValue() {
return privateField;
}
public static void main(String[] args) {
ParentClass parentClass = new ParentClass();
System.out.println("ParentClass parentClass = new ParentClass();");
System.out.println(parentClass.getPrivateFieldValue());
System.out.println(parentClass.friendlyField);
System.out.println(parentClass.protectedField);
System.out.println(parentClass.publicField);
System.out.println();
// ParentClass类型,SubClass对象
ParentClass subClass = new subclass();
System.out.println("ParentClass subClass = new SubClass();");
System.out.println(subClass.getPrivateFieldValue());
System.out.println(subClass.friendlyField);
System.out.println(subClass.protectedField); //这三个居然调用的是父类的变量,不是很理解
System.out.println(subClass.publicField); // ParentClass类型,SubClass对象
//莫非等价于将一个SubClass对象强制转化为ParentClass 类型
System.out.println();
// SubClass类型,SubClass对象
subclass subClazz = new subclass();
System.out.println("SubClass subClazz = new SubClass();");
System.out.println(subClazz.getPrivateFieldValue());
System.out.println(subClazz.friendlyField);
System.out.println(subClazz.protectedField);
System.out.println(subClazz.publicField);
}
} 还是老问题 superclass :class A
subclass : class B extends A
A a= A();
A aa=B();
B aaa=B(); 我原先以为 A aa=B() 完全等价于 B aaa=B(); 原来他们之间也有差异???
从上面的测试程序看的确有差异。 请说一下他们的差异?第二问题:
测试类程序:class ParentClass_ {
public static String staticField = "父类静态变量";
public final String finalField = "父类常量";
public static final String staticFinalField = "父类静态常量";
}
public class SubClass_ extends ParentClass_ {
public static String staticField = "子类静态变量";
public final String finalField = "子类常量";
public static final String staticFinalField = "子类静态常量";
public static void main(String[] args) {
ParentClass_ subClass = new SubClass_();
System.out.println(SubClass_.staticField);
System.out.println(subClass.finalField);
System.out.println(SubClass_.staticFinalField);
}
}
在这里我也存在着一个误区
众所周知 final class 就表示 这个类不能被派生出子类
final 加在方法前面就 不能被子类重写
那加在变量前面就表示是个常量 final static修饰表示变量就唯一了,不能更改了。
今天发现在子类还能重写这样的常量,有点诧异?? 难道final static修饰变量不能更改的前提只能存在于一个类中 ……请详细说下
测试类程序: class ParentClass {
private String privateField = "父类变量--private";
/* friendly */String friendlyField = "父类变量--friendly";
protected String protectedField = "父类变量--protected";
public String publicField = "父类变量--public";
// private的变量无法直接访问,因此我们给他增加了一个访问方法
public String getPrivateFieldValue() {
return privateField;
}
}
public class subclass extends ParentClass {
private String privateField = "子类变量--private";
/* friendly */String friendlyField = "子类变量--friendly";
protected String protectedField = "子类变量--protected";
public String publicField = "子类变量--public";
public String getPrivateFieldValue() {
return privateField;
}
public static void main(String[] args) {
ParentClass parentClass = new ParentClass();
System.out.println("ParentClass parentClass = new ParentClass();");
System.out.println(parentClass.getPrivateFieldValue());
System.out.println(parentClass.friendlyField);
System.out.println(parentClass.protectedField);
System.out.println(parentClass.publicField);
System.out.println();
// ParentClass类型,SubClass对象
ParentClass subClass = new subclass();
System.out.println("ParentClass subClass = new SubClass();");
System.out.println(subClass.getPrivateFieldValue());
System.out.println(subClass.friendlyField);
System.out.println(subClass.protectedField); //这三个居然调用的是父类的变量,不是很理解
System.out.println(subClass.publicField); // ParentClass类型,SubClass对象
//莫非等价于将一个SubClass对象强制转化为ParentClass 类型
System.out.println();
// SubClass类型,SubClass对象
subclass subClazz = new subclass();
System.out.println("SubClass subClazz = new SubClass();");
System.out.println(subClazz.getPrivateFieldValue());
System.out.println(subClazz.friendlyField);
System.out.println(subClazz.protectedField);
System.out.println(subClazz.publicField);
}
} 还是老问题 superclass :class A
subclass : class B extends A
A a= A();
A aa=B();
B aaa=B(); 我原先以为 A aa=B() 完全等价于 B aaa=B(); 原来他们之间也有差异???
从上面的测试程序看的确有差异。 请说一下他们的差异?第二问题:
测试类程序:class ParentClass_ {
public static String staticField = "父类静态变量";
public final String finalField = "父类常量";
public static final String staticFinalField = "父类静态常量";
}
public class SubClass_ extends ParentClass_ {
public static String staticField = "子类静态变量";
public final String finalField = "子类常量";
public static final String staticFinalField = "子类静态常量";
public static void main(String[] args) {
ParentClass_ subClass = new SubClass_();
System.out.println(SubClass_.staticField);
System.out.println(subClass.finalField);
System.out.println(SubClass_.staticFinalField);
}
}
在这里我也存在着一个误区
众所周知 final class 就表示 这个类不能被派生出子类
final 加在方法前面就 不能被子类重写
那加在变量前面就表示是个常量 final static修饰表示变量就唯一了,不能更改了。
今天发现在子类还能重写这样的常量,有点诧异?? 难道final static修饰变量不能更改的前提只能存在于一个类中 ……请详细说下
ParentClass_的finalField,因此输出“父类常量”.另外,既然都知道是常量了,怎么存在重写这种说法?重写是针对方法的。
final在这个类中不能再赋值,static就表示变量地址唯一了
在子类中可以对父类的这些变量进行重写
注意变量override只有隐藏而不能覆盖