-
在Java中,子类本身新定义的成员变量如果与从父类的继承的成员变量名字相同(不同数据类型也算),那么父类的从父类继承的同名变量将被隐藏,不能直接操作,需要通过从父类中继承的方法来操作这个被隐藏的变量。 -
子类对父类所继承的方法进行重写时,方法的名字、参数列表必须完全相同,但是返回值类型可以与父类相同,也可以时父类此方法返回值的子孙类。比如: 父类的方法返回值为People,子类重写的该方法返回值可以是Student(Student是People的子孙类)。 -
重写和重载的区别: 重载只需要保证参数列表不同,名字相同,不管返回值是否相同,都属于重载。 而重写的返回值见上述第2点,名字与参数列表都必须与父类相同。 -
使用super关键字可以在子类中操作被隐藏的父类成员变量或调用被隐藏的父类方法,注意只能在方法中使用super,表示调用隐藏的内容,不能用某个实例对象使用super,此时super.f()中的f()函数为被隐藏的函数,函数f()里的成员变量及方法即使子类中有覆盖,在该f()函数中使用的都是被覆盖的那一部分。 -
在子类的每一个构造方法中必须在最开头用super关键字调用父类的某个构造函数,因为子类在创建对象时总是会先调用父类的构造方法,再调用自己的没有写的情况只有一种:父类有无参构造函数时,系统会为子类的开头默认调用super()。 -
假设People的子类为Student;
People p = new Student();
称p为Student的上转型对象,上转型对象可以操作被继承或被隐藏的成员变量,也可以调用被继承或重写的方法,但不能操作和调用子类中新增的变量和方法;而且调用含有重写的方法时,调用的是重写后的方法。 把上转型对象强制转化为子类对象的方法: ;
Student s = (Student) p;
- 抽象类可以多重继承,即一个抽象类B继承抽象类A,此时,A中的抽象方法可以不给出实现,也可以改为非抽象方法,给出实现。
- 抽象方法不能用static修饰;抽象类不可以new一个对象,但可以创建子类的上转型对象。
- 对于父类的protected变量和方法的继承性:在一个Test.java文件中创建一个A类的子孙类B类的对象时,B类新声明的变量和方法在B类与Test类在同一包时能够访问;对于A类中的protected变量和方法也是在A类和Test类在同一包中时能够访问。
- 子类不能重写父类中的静态方法,但是可以声明覆盖父类中的成员变量,而且子类可以正常访问和继承父类中的静态变量和方法;
虽然不能重写静态方法,但是可以重新声明这个静态方法; @Override关键字下面的方法必须为重写方法,即如果子类中把父类中的静态方法除了方法体中的内容复制下来,再“重新写”这个方法体,这种操作的前面如果不加@Override,默认表示重新声明该方法,如果加了@Override,则表示重写该方法,所以静态方法可以通过不加@Override来重新声明一个静态方法来达到我们想要的“继承效果”。 需要注意的是重新声明的方法由于不是重写的方法,所以当该父类的一个上转型对象调用这个重新声明的方法时,调用的是父类中、重新声明前的方法。 - abstract方法不能用static修饰的原因是:上面一点提到子类不能重写父类中的static方法,而abstract方法存在就是要被其子孙类重写的,所以有冲突,final和private道理也一样。
- 对于重写只能降低访问权限可以这样理解:别人需要访问这个父类,肯定需要先访问你的子类,再通过子类访问父类,这是“逐层”的关系,如果子类访问权限更“隐蔽”,就会导致不可能访问得到这个父类,所以。
|