1.什么是不能被继承的?
private,static,synchronized,final(可被继承,但不可被覆盖)
2.关于成员变量被private 修饰,就是不能在子类被继承,但是为什么 例如setter/getter 之类和成员变量直接关联的方法依然可以在子类中使用呢?
父类:
public class Person { private String name; private int age; public String getName() { System.out.println("person.name:"+this.name); return name; } public void setName(String name) { this.name = name; } public int getAge() { System.out.println("person.age:"+this.age); return age; } public void setAge(int age) { this.age = age; } }
子类:
public class Predisw extends Person { }
测试:
public class TestPredisw { @Test public void TestAdd(){ Predisw p=new Predisw(); p.setAge(11); p.setName("wang"); String name1=p.getName(); int age1=p.getAge(); System.out.println(name1+":"+age1); } }
person.name:wang
person.age:11
wang:11
变量:
结论:
在new Predisw();的时候,子类的构造器调用了父类的构造器,所以从本质上来说,是创建了一个新的Person 对象.所以对象p 调用setter 方法是修改了这个对象的name 和age.
如果在Predisw 类中添加一个私有变量会如何?
public class Predisw extends Person { private String name; }
运行TestPredisw 时的变量情况如下:
多了一个name 的变量.应该是在new Predisw() 的时候调用了super() 和将这个变量添加到新的Predisw 实例中.所以实际上Predisw 有2个name 变量,并没有覆盖掉父类的同名变量.
这个时候如果在Predisw 类中添加name 的setter/getter 会如何?
public class Predisw extends Person { private String name; public String getName() { System.out.println("predisw.name:"+this.name); return name; } public void setName(String name) { this.name = name; } }
运行TestPredisw 中的方法时,变量情况如下:
输出结果如下:
predisw.name:wang
person.age:11
wang:11
结论:继承的方法会调用子类的方法,父类的同名方法被覆盖了.子类的方法只能操作到子类的成员变量,而父类的成员变量是私有的,只有通过父类的setter/getter 才能调用.但是父类的setter/getter 被覆盖了,所以父类的name就无法再被修改了.
时间: 2024-11-09 19:27:13