如题,比如一个父类(Tetromino)中有一个用protected修饰的成员内部类(State),那么如果有一个类 T extends Tetromino,这个T类内部就也拥有一个内部类State还是只是因为protected修饰才有权限访问而已???阿西吧,之前一直以为已经了解继承了,现在又紊乱了!!!顺便总结一下我的理解,大神们帮我看看对错并补充一下
————1、属于对象的能够被继承(成员变量、成员方法);
————2、static都是属于类的,只在方法区中加载一次,不能被继承;
————3、private修饰的成员数据能够被子类继承,但是没有访问权限,所以表现出来的是不能被继承;(关于private的继承问题好像有很大争议,我暂且就这样理解);
————4、内部类:内部类就是个渣,搞不懂;它是不是只是为了封装用的,要是不用private修饰的话就跟定义成同级的外部类一样一样的?除了创建对象变得更麻烦?!求大神!!!!!!!!!!!//-------------------------------------这个是示例代码,将就看看--------------------------------------------------------
public class Tetromino {                         //Tetromino类
protected Cell[] cells = new Cell[4];
protected State[] states;

protected class State{                  //protected修饰的内部类State
int row0,col0,
row1,col1,
row2,col2,
row3,col3; public State(int row0, int col0, int row1, int col1, int row2, int col2, int row3, int col3) {    //构造器还是public公有的
this.row0 = row0;this.col0 = col0;
this.row1 = row1;this.col1 = col1;
this.row2 = row2;this.col2 = col2;
this.row3 = row3;this.col3 = col3;
}
}
//-----------------------------------------------继承的子类-------------------------------------------------
class T extends Tetromino{
public T(){
cells[0] = new Cell(0,3,Tetris.T);
cells[1] = new Cell(0,4,Tetris.T);
cells[2] = new Cell(0,5,Tetris.T);
cells[3] = new Cell(1,4,Tetris.T);
}
}

解决方案 »

  1.   

    也会拥有一个内部类,可以通过查看class文件
      

  2.   

    你这个是容易理解继承,并不是理解有哪些东西能被继承,比如静态成员属于父类,但是并不能被子类继承!!
    类的静态成员属于类而非类的实例,并且静态成员的存储方式和普通的成员变量是不一样的,我画的图指的是实例,一般情况下通过实例去访问静态成员是认为不允许的(即便事实上好像可以)。
    我在子类的构造器中尝试了直接new State(***) ,结果并没有报错,要是子类中没有内部类的话应该是用外部类引用.new 内部类的,这应该能证明子类是拥有而并非是因为同包中子类能够访问吧?!那么现在的问题是,为什么子类的.class文件中没有$内部类?请大神指点
      

  3.   

    你这个是容易理解继承,并不是理解有哪些东西能被继承,比如静态成员属于父类,但是并不能被子类继承!!
    类的静态成员属于类而非类的实例,并且静态成员的存储方式和普通的成员变量是不一样的,我画的图指的是实例,一般情况下通过实例去访问静态成员是认为不允许的(即便事实上好像可以)。
    我在子类的构造器中尝试了直接new State(***) ,结果并没有报错,要是子类中没有内部类的话应该是用外部类引用.new 内部类的,这应该能证明子类是拥有而并非是因为同包中子类能够访问吧?!那么现在的问题是,为什么子类的.class文件中没有$内部类?请大神指点
    这个得去研究虚拟机,.class可以认为是对象类(相对于虚拟机来说),和平常的java类是不一样的概念。我认为子类.class文件没有$与之对应,是因为完全没必要拥有,因为按照你这思路,那子类就必须拥有所有基类的一个类似$的东西(因为继承),每个父类的所有子类也都必须拥有父类内部类的$文件,那在虚拟机中就会出现很多重复.class。显然不合理。
    还是那句话,类和类的实例是不一样的概念。.class是虚拟机级别上的实例,但是相对于普通的java类,它最好理解为“类”。当然,更精确的理解请看java虚拟机
      

  4.   

    你这个是容易理解继承,并不是理解有哪些东西能被继承,比如静态成员属于父类,但是并不能被子类继承!!
    类的静态成员属于类而非类的实例,并且静态成员的存储方式和普通的成员变量是不一样的,我画的图指的是实例,一般情况下通过实例去访问静态成员是认为不允许的(即便事实上好像可以)。
    我在子类的构造器中尝试了直接new State(***) ,结果并没有报错,要是子类中没有内部类的话应该是用外部类引用.new 内部类的,这应该能证明子类是拥有而并非是因为同包中子类能够访问吧?!那么现在的问题是,为什么子类的.class文件中没有$内部类?请大神指点
    这个得去研究虚拟机,.class可以认为是对象类(相对于虚拟机来说),和平常的java类是不一样的概念。我认为子类.class文件没有$与之对应,是因为完全没必要拥有,因为按照你这思路,那子类就必须拥有所有基类的一个类似$的东西(因为继承),每个父类的所有子类也都必须拥有父类内部类的$文件,那在虚拟机中就会出现很多重复.class。显然不合理。
    还是那句话,类和类的实例是不一样的概念。.class是虚拟机级别上的实例,但是相对于普通的java类,它最好理解为“类”。当然,更精确的理解请看java虚拟机首先很感谢你的认真指教!!不过我还是没太明白两点!
        |--".class是.class是虚拟机级别上的实例,但是相对于普通的java类,它最好理解为“类”。”   这里把内部类当成同包下的一个普通类理解就好了是吗?内部类也只会在方法区中加载一次,子类要用的时候就去方法区调用它,每个子类用的都是同一个?!!
        |-- 第二点就是,你之前说过类的所有实例都被子类继承,那么内部类到底算不算实例的一部分?如果是的话,那么应该是跟其他的继承一样子类就是拥有的吧,这点跟你说的“没必要拥有”相悖,而代码检验表现出来的是拥有,但是子类又没有$1.class;如果不算实例一部分的话,就是没有被继承,只是java规定子类都能直接访问到这个内部类?!!