http://bettereveryday.iteye.com/blog/591771
private关键字的定义是“除了包含该成员的类之外,其他任何类都无法访问这个成员.”,也就是说只有自己才能直接访问到private成员,其他任何类,包括子类都无法访问到这个成员。
我们可以来测试一下:
定义两个类,Parent类和Child类
Parent类中有两个方法,一个public方法,一个private方法
Child继承自Parent类
- public class Parent {
- public void publicMethod(){
- System.out.println("hello parent public method");
- }
- private void privateMethod(){
- System.out.println("hello parent private method");
- }
- }
- public class Child extends Parent{
- public void publicMethod(){
- System.out.println("hello child public method");
- }
- private void privateMethod(){
- System.out.println("hello child private method");
- }
- public static void main(String args[]){
- Parent child = new Child();
- child.publicMethod();
- // child.privateMethod(); //若不注释该行代码,则会出现编译错误:“The method privateMethod() from the type Parent is not visible”
- }
- }
public class Parent {
public void publicMethod(){
System.out.println("hello parent public method");
}
private void privateMethod(){
System.out.println("hello parent private method");
}
}
public class Child extends Parent{
public void publicMethod(){
System.out.println("hello child public method");
}
private void privateMethod(){
System.out.println("hello child private method");
}
public static void main(String args[]){
Parent child = new Child();
child.publicMethod();
// child.privateMethod(); //若不注释该行代码,则会出现编译错误:“The method privateMethod() from the type Parent is not visible”
}
}
从“// child.privateMethod();”行我们可以看出,父类的private方法是无法被子类覆盖的,因为若能覆盖,则会像覆盖public方法一样,不会出现任何编译错误,而且从错误提示可以看出,“The method privateMethod() from the type Parent is not visible”,也就是“父类的privateMethod()方法(对子类而言)是不可见的”,即子类无法访问父类的private方法。
这个可以从内存角度得到比较好的解释:
我们可以将一个对象的内存分为两部分,一部分继承自父类对象,简称继承内存,一部分是属于自己的,简称自有内存,这就好像一个人的财产一样,一部分是继承自长辈,一部分靠自己打拼。
父类引用指向子类对象,那么该引用指向的其实只是继承内存,它能调用的也就这点内存,这里面包括父类的成员变量,方法等等,父类引用指向的是一个子类对象,但它调用的是父类的privateMethod,但private方法是无法在其他对象中访问到,所以就会产生编译错误。
=============================================
http://blog.csdn.net/cdsnmdl/article/details/3968688
- 当Sub类和Base类在同一个包时Sub类继承Base类中的public/protected/默认级别的变量个方法
- 在不同包时继承public/protected级别的变量和方法。
- 方法名相同
- 方法的参数类型,个数顺序至少有一项不同
- 方法的返回类型可以不相同
- 方法的修饰符可以不相同
- main方法也可以被重载
- 子类的方法名称返回类型及参数签名 必须与父类的一致
- 子类方法不能缩小父类方法的访问权限
- 子类方法不能抛出比父类方法更多的异常
- 方法覆盖只存在于子类和父类之间,同一个类中只能重载
- 父类的静态方法不能被子类覆盖为非静态方法
- 子类可以定义于父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法(满足覆盖约束),
- 而且Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
- 父类的非静态方法不能被子类覆盖为静态方法
- 父类的私有方法不能被子类覆盖
- 父类的抽象方法可以被子类通过两种途径覆盖(即实现和覆盖)(P169)
- 父类的非抽象方法可以被覆盖为抽象方法
- 父类的成员变量和方法为private使用super访问编译出错
- 在类的构造方法种,通过super语句调用这个类的父类的构造方法
- 在子类种访问父类的被屏蔽的方法和属性
- 只能在构造方法或实例方法内使用super关键字,而在静态方法和静态代码块内不能使用super
- 对于一个引用类型的变量,Java编译器按照它的声明的类型来处理
- 对于一个引用类型的变量,运行时Java虚拟机按照它的实际引用的对象来处理
- 运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则
- 集成数的层次不可太多
- 集成数的上层为抽象层
- 继承关系最大的弱点:打破封装
- 精心设计专门用于被继承的类