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的访问不到呢 ?
继承对象

解决方案 »

  1.   

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

  2.   

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

  3.   


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

  4.   

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

  5.   

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

  6.   

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

  7.   

    那我想问下:到底内存中为private的属性和方法分配了空间么?当然分配了。 
    我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
    因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?怎么能说是浪费空间呢。这种特性其实在有些情况下是特别拥有,例如父类的有个属性需要对外设置成只读,那可以把get方法设置成public,把set方法设置成private就很好。有时候需要对某些属性或者方法设置保护,那么可以把对外的接口设置成public,可以起到保护的作用。
      

  8.   

    那我想问下:到底内存中为private的属性和方法分配了空间么?当然分配了。 
    我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
    因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?
    但是通过反射又是可以访问到私有属性的,说明还是加载进来的吧
    恩,我只是简单了解反射有这个功能,但是这个要怎么用反射来实现证明呢?
      

  9.   

    那我想问下:到底内存中为private的属性和方法分配了空间么?当然分配了。 
    我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
    因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?怎么能说是浪费空间呢。这种特性其实在有些情况下是特别拥有,例如父类的有个属性需要对外设置成只读,那可以把get方法设置成public,把set方法设置成private就很好。有时候需要对某些属性或者方法设置保护,那么可以把对外的接口设置成public,可以起到保护的作用。
    恩,学习了。
      

  10.   

    那我想问下:到底内存中为private的属性和方法分配了空间么?当然分配了。 
    我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
    因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?
    但是通过反射又是可以访问到私有属性的,说明还是加载进来的吧
    恩,我只是简单了解反射有这个功能,但是这个要怎么用反射来实现证明呢?我也只是知道反射 里面貌似很复杂···
      

  11.   

    那我想问下:到底内存中为private的属性和方法分配了空间么?当然分配了。 
    我开始的理解是以为在创建子类对象时,会先创建父类对象,理所当然会拥有父类中所有属性方法,包括私有的。但是后来一想,如果父类为抽象类,那么就不能创建父类对象了。所以我开始支持第一种说法,也就是在new子类对象时,不会为私有属性方法分配空间。
    因为子类访问不到,即使是同名的方法,也算是新定义的方法而不算重写。按您说的,那么Java为什么还要把父类的私有属性方法加载进来呢?岂不是浪费了空间?加载父类时先要检查这个类的字节码是否在内存中存在,如果存在就不重新加载了,不存在就要加载。假如,我们用到了这个类中的某个方法,而这个类的这个方法恰好调用了这个类里面 的某个私有方法,你想一下,不加载进来程序能运行吗?