日期:2014-05-20  浏览次数:20602 次

关于继承后创建对象的一点疑问?
class A{
private int i = 10;
private String str1 = "abc";
private void method(){
System.out.println("父类中的private方法");
}
}
class B extends A{
}


public class TestExtends {
public static void main(String[] args) {
B b = new B();
}
}

这是一个很简单的继承后创建对象的代码。小弟有个这样的疑问。
1,关于继承,子类只能继承父类中非私有的方法和属性。
2,但有一次在网上看到有人说,B b = new B();会先为A分配空间,存放A中的所有方法属性,包括私有方法属性,但是私有方法和属性是访问不到的。我比较认可这种说法,好像从创建对象的角度来看也是对的。

今天突然想到,如果父类是抽象类,那么这个图貌似就有问题了。父类是抽象的话就不能创建对象啊!我又有点支持第一种说法了。
关于这两种说法,到底哪个是对的呢?
到底在new B();时只加载了非private的属性方法还是加载了所有属性方法,只是被private的访问不到呢 ?


继承 对象

------解决方案--------------------
这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。
------解决方案--------------------
哪本书讲Java的内存布局的?
------解决方案--------------------

引用:
Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


分配了
------解决方案--------------------
引用:
Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


当然分配了。 
------解决方案--------------------

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


当然分配了。 

我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?

但是通过反射又是可以访问到私有属性的,说明还是加载进来的吧


------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


当然分配了。 

我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?


怎么能说是浪费空间呢。这种特性其实在有些情况下是特别拥有,例如父类的有个属性需要对外设置成只读,那可以把get方法设置成public,把set方法设置成private就很好。有时候需要对某些属性或者方法设置保护,那么可以把对外的接口设置成public,可以起到保护的作用。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


当然分配了。 

我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?

但是通过反射又是可以访问到私有属性的,说明还是加载进来的吧


恩,我只是简单了解反射有这个功能,但是这个要怎么用反射来实现证明呢?
我也只是知道反射 里面貌似很复杂···
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

这两种说法都没有什么问题,只是你的理解不一样而已。private方法是访问不到的,但是并不能说它没有。

那我想问下:到底内存中为private的属性和方法分配了空间么?


当然分配了。 

我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?