我的理解是这样的 成员变量的选择是通过静态绑定的,也就是在编译期间决定,也就是通过引用变量决定,而不是通过实际对象决定, 比如 class A{ public int t; //为了突出问题,所以这里用Public } class AA extends A{ public int t; } 那么 A a = new AA(); 那么这个时候,a就是引用变量,真正的对象时new AA()创造的对象,成员变量的选择是由引用类型决定 这个时候,a.t就是代表父类中的成员变量, 这就是所谓的静态绑定,所以也就是出现了隐藏,相同道理,static方法也有隐藏的现象, 而普通的方法,则是动态绑定了,也就是由对象类型决定,而不是引用类型决定了,这就是哦我们平时所说的多态 楼主,可以不用给太多分的
把子类的对象强制转换成父类类型,然后看能不能调用到其被隐藏的的属性或方法。 参考,子类可以继承父类的私有属性http://blog.csdn.net/naruto_ahu/article/details/8044887 class Base{ public int a = 1; public void fun(){ System.out.println("Base fun()"); } public static void staticf(){ System.out.println("Base staticf()"); } } public class Derived extends Base { public int a=2; //会隐藏Base.a @Override //下面实例方法会覆写超类中可访问到的具有相同签名的实例方法[JLS 8.4.8.1],不是隐藏 public void fun(){ System.out.println("Derived fun()"); } //@Override //下面静态方法会隐藏超类中可访问到的具有相同签名的静态方法 public static void staticf(){ System.out.println("Derived staticf()"); } public static void main(String[] args) { Derived test = new Derived(); //测试test对象的属性和方法 System.out.println("test.a = "+test.a); System.out.println("((Base)test).a = "+((Base)test).a); ((Base)test).fun(); test.staticf(); ((Base)test).staticf(); } }
对,那类似地,对覆盖(Override)来说,是不是就访问不到了?
因为就是这么定义的,11楼说的正确,所以属性经常需要定义成private xx;public void setXXX(){} public xx getXXX(){}
确认的There are methods that a subclass cannot override. For example, in Java, a method that is declared final in the super class cannot be overridden. Methods that are declared private or static cannot be overridden either because they are implicitly final. It is also impossible for a class that is declared final to become a super class.http://en.wikipedia.org/wiki/Method_overriding
第二个问题,方法可以覆盖,当你子类定义的成员变量和父类的成员变量同名同类型的时候,这算不算覆盖??
调用的时候如果想调用父类的成员变量得加上super关键字。
成员变量的选择是通过静态绑定的,也就是在编译期间决定,也就是通过引用变量决定,而不是通过实际对象决定,
比如
class A{
public int t; //为了突出问题,所以这里用Public
}
class AA extends A{
public int t;
}
那么
A a = new AA();
那么这个时候,a就是引用变量,真正的对象时new AA()创造的对象,成员变量的选择是由引用类型决定
这个时候,a.t就是代表父类中的成员变量,
这就是所谓的静态绑定,所以也就是出现了隐藏,相同道理,static方法也有隐藏的现象,
而普通的方法,则是动态绑定了,也就是由对象类型决定,而不是引用类型决定了,这就是哦我们平时所说的多态
楼主,可以不用给太多分的
参考,子类可以继承父类的私有属性http://blog.csdn.net/naruto_ahu/article/details/8044887
class Base{
public int a = 1;
public void fun(){
System.out.println("Base fun()");
}
public static void staticf(){
System.out.println("Base staticf()");
}
}
public class Derived extends Base {
public int a=2; //会隐藏Base.a
@Override
//下面实例方法会覆写超类中可访问到的具有相同签名的实例方法[JLS 8.4.8.1],不是隐藏
public void fun(){
System.out.println("Derived fun()");
}
//@Override
//下面静态方法会隐藏超类中可访问到的具有相同签名的静态方法
public static void staticf(){
System.out.println("Derived staticf()");
}
public static void main(String[] args) {
Derived test = new Derived();
//测试test对象的属性和方法
System.out.println("test.a = "+test.a);
System.out.println("((Base)test).a = "+((Base)test).a);
((Base)test).fun();
test.staticf();
((Base)test).staticf();
}
}
public xx getXXX(){}