我不是大神,在看这些问题的同时我也在学习
因此说一下我的答案-----------------------------------------------------------------------------首先私有字段子类是不能继承过来的,你可以通过查看class文件去看内部(工具:http://www.oschina.net/code/snippet_12_2154)看到的字段数目应该是0,也就是说没有继承过来
但是公用方法继承过来了这里在new对象的时候,调用了super(n),那就实例化的是父类的name字段,但是这个name字段对于子类是不可见的,但是子类可以通过公用的get和set获得,这里是不是发生了向上转型?
我测试了一下
System.out.println(cat instanceof animal);
输出是true
也就是子类是父类的一个实例
name字段属于谁的,我觉得应该是子类,至于私有属性仅仅是权限控制而已,对于子类来说,name字段是隐藏的,程序员是不能够直接操作的,仅此而已坐等专业解释
因此说一下我的答案-----------------------------------------------------------------------------首先私有字段子类是不能继承过来的,你可以通过查看class文件去看内部(工具:http://www.oschina.net/code/snippet_12_2154)看到的字段数目应该是0,也就是说没有继承过来
但是公用方法继承过来了这里在new对象的时候,调用了super(n),那就实例化的是父类的name字段,但是这个name字段对于子类是不可见的,但是子类可以通过公用的get和set获得,这里是不是发生了向上转型?
我测试了一下
System.out.println(cat instanceof animal);
输出是true
也就是子类是父类的一个实例
name字段属于谁的,我觉得应该是子类,至于私有属性仅仅是权限控制而已,对于子类来说,name字段是隐藏的,程序员是不能够直接操作的,仅此而已坐等专业解释
楼主不要纠结这些语法细节。
不要纠结到底是内存中哪个对象的属性
Java设计了干吗的,不就是忽略C++那些细节吗。
如果你这样学下去的话估计一年半载都入不了门再说你最好到StackOverFlow上问专业问题,那上面砖家才多,也热心,英文过得去就行,不要怕语法错误,人家不在意
二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
这个问题不好说,但是给你个代码你看看吧public class testExtends {
public static void main(String[] args) {
Cat c = new Cat("猫");
System.out.println(c.getName());
Animal a = new Animal();//没有给动物的name另外赋值
System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
}
}
class Animal {
private String name="动物";
public Animal(){ }
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Cat extends Animal {
String name="猫";
public Cat(String n) {
super(n);
}
public String getAnimalName(){
return super.getName();
}
}
子类继承了私有段,从公共方法继承来看,可以调用公共方法设置父类的私有段,首先得继承,才能去操作,只是间接操作罢了,但是子类本身是不能够直接操作了为了防止破坏其封装行发生直接的安全隐患
这个问题不好说,但是给你个代码你看看吧public class testExtends {
public static void main(String[] args) {
Cat c = new Cat("猫");
System.out.println(c.getName());
Animal a = new Animal();//没有给动物的name另外赋值
System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
}
}
class Animal {
private String name="动物";
public Animal(){ }
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Cat extends Animal {
String name="猫";
public Cat(String n) {
super(n);
}
public String getAnimalName(){
return super.getName();
}
}
嗯.有道理
二、肯定能继承父类的私有成员。
而如果创建父类对象,则该对象是在另一块堆内存区域,该区域与子类中为"从父类继承过来的成员开辟的堆内存"不一样。即没有关系。
super()方法是调用父类构造方法,就是为在"子类对象内存区域那儿再给继承父类的成员开辟一块区域,这两个'区域'是连起来的",可以说同属于子类对象。只是私有成员子类不可以"直接引用",可以通过其它公有方法来获取。
- 可以继承private成员变量
接口并不一定是interface这个语法.只要是对外的一个公共方法,都可以视为接口.
public static void main(String[] args) {
Cat c = new Cat();
System.out.println(c.getName());
Animal a = new Animal();//没有给动物的name另外赋值
System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
}
}
class Animal {
private String name="动物";
public Animal(){
}
public String getName() {
return name;//相当于this.name,所以输出的肯定是父类的.
}
}
class Cat extends Animal {
String name="猫";
public String getAnimalName(){
return super.getName();
}
}