class Base{
private final void f(){
System.out.println("Base.f()");
}
}
class Derived extends Base{
public final void f(){
System.out.println("Derived.f()");
}
}
public class Main {
public static void main(String[] args) {
Derived op1 = new Derived();
Base op2=op1;
op1.f();
op2.f();// 这一行为什么会出错?
}
} 根据我的理解,所谓动态性,就是在运行时正确识别对象的类型.op2虽然是一个基类引用,但它指向的是子类的实例,而子类是有一个public 的方法f()的 ,为什么op1能调用而op2不能调用,op1 和 op2 指向的是同一个对象嘛??why?
private final void f(){
System.out.println("Base.f()");
}
}
class Derived extends Base{
public final void f(){
System.out.println("Derived.f()");
}
}
public class Main {
public static void main(String[] args) {
Derived op1 = new Derived();
Base op2=op1;
op1.f();
op2.f();// 这一行为什么会出错?
}
} 根据我的理解,所谓动态性,就是在运行时正确识别对象的类型.op2虽然是一个基类引用,但它指向的是子类的实例,而子类是有一个public 的方法f()的 ,为什么op1能调用而op2不能调用,op1 和 op2 指向的是同一个对象嘛??why?
http://book.csdn.net/bookfiles/49/100491542.shtml
本人也正在学Java中……
你写的这个编译时就会报错,你的理解是对的,但编译器是严格而且是敏感的,在JAVA虚拟机中对你源码的识别是Base的方法,而Base的方法是private所以编译会错。
本人新建JAVA群欢迎交流:群号8595489
我觉得的有2点
1.编译器表面上报错说是父类的void f()是私有的,不能在类本身外部调用,
但是其实op2.f()调用的不是父类的f()方法,而是子类的f()方法,这就是父类对象调用子类的方法,如果子类对象调用父类的方法是理所当然的,这就是继承。
父类与子类的关系好比一个男人和人的关系,男人(子类)肯定是人(父类),子类对象自动转换为父类对象,但是男人做的还是男人自己的事(子类自己的方法)。
class Base{public void f(){
System.out.println("Base.f()");
}
}
class Derived extends Base{ public void f(){
System.out.println("Derived.f()");
}
}
public class Main {
public static void main(String[] args) {
Derived op1 = new Derived();
Base op2=op1;
op1.f();
op2.f();
}
}输出的是:
Derived.f()
Derived.f()2.在类里用final定义的方法是不能被重载也不能被覆盖的。但是有一点不明白
为什么这里可以覆盖(假如去掉op2.f())编译能够通过。但是如果把父类的private改成public就报错说不能被覆盖,
是不是子类权限比父类大了就可以了呢?
小弟初学java忘高手们帮帮忙
还是有点迷惑,请大家帮忙指点。
多态中,在向上转型后,只能调用base class中被derived class overriding的方法,不能调用derived class extention中的方法。正解,嘿嘿,我要飞(分)我要飞(分)我要飞(分)
另外,如果把父类里的f()改做public的话也不对,因为被声明为finalr的方法是不能被覆盖的.
请大家指教:)
子类方法的访问权限不能低于父类方法(如父类为public,子类就只能为public)
父类方法的访问权限为private,子类不能覆盖
父类中的方法如果有final修饰符,子类不能覆盖
子类方法不能抛出比父类方法更多的异常(可以抛出和父类方法一样的异常或抛出父类方法异常类的子类)
父类的非静态方法不能被子类覆盖为静态方法