一个很基础的问题,java 编程思想里的

einsteindai 2006-10-07 06:01:01
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?
...全文
626 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ps1981sophia 2006-10-11
  • 打赏
  • 举报
回复
补充几点覆盖的注意事项:
子类方法的访问权限不能低于父类方法(如父类为public,子类就只能为public)
父类方法的访问权限为private,子类不能覆盖
父类中的方法如果有final修饰符,子类不能覆盖
子类方法不能抛出比父类方法更多的异常(可以抛出和父类方法一样的异常或抛出父类方法异常类的子类)
父类的非静态方法不能被子类覆盖为静态方法
crazycy 2006-10-11
  • 打赏
  • 举报
回复
涉及多态问题:

向上转型后,调用某个函数,若 derived class overriding 了该函数,则会调用该 derived class 中的函数,否则会调用 base class 中的函数

很显然,这里既然没有重写,所以只能调用父类的方法,但是,父类中的方法又是private 编译器唯一能说的就是错误

http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html
crazycy 2006-10-11
  • 打赏
  • 举报
回复
涉及多态问题:

向上转型后,调用某个函数,若 derived class overriding 了该函数,则会调用该 derived class 中的函数,否则会调用 base class 中的函数
huaen 2006-10-11
  • 打赏
  • 举报
回复
private方法对子类是不可见的,也就是说,子类里的f()就是子类的f(),和父类的f()是一点关系也没有的,父类是感觉不到这个子类里的f()的存在的.
另外,如果把父类里的f()改做public的话也不对,因为被声明为finalr的方法是不能被覆盖的.
请大家指教:)
crazycy 2006-10-11
  • 打赏
  • 举报
回复
具体解释看这里http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html
crazycy 2006-10-11
  • 打赏
  • 举报
回复
不好意思啊,我在上面的解释是不恰当的,现在更正一下:
多态中,在向上转型后,只能调用base class中被derived class overriding的方法,不能调用derived class extention中的方法。

正解,嘿嘿,我要飞(分)我要飞(分)我要飞(分)
Jfei 2006-10-10
  • 打赏
  • 举报
回复
子类中的f()方法和父类中的f()没有任何关系
liuzhiyuan 2006-10-10
  • 打赏
  • 举报
回复
关键字final声明的方法不能被承载
maque83 2006-10-09
  • 打赏
  • 举报
回复
支持 tallen2005(天乐) 说的
einsteindai 2006-10-09
  • 打赏
  • 举报
回复
我的理解,这里Derived类中的 f()方法跟基类的f()方法没有任何关系,不知对不对?
einsteindai 2006-10-09
  • 打赏
  • 举报
回复
op2.f() ;我认为应该调用的是子类的,可实际上它调用的是父类的。根据多太性,虚拟机应该在运行时能够识别op2指向的是子类的 啊 ?
还是有点迷惑,请大家帮忙指点。
laitaogood 2006-10-08
  • 打赏
  • 举报
回复
同意一楼的讲法
murongqiuye 2006-10-08
  • 打赏
  • 举报
回复
UP
guileen 2006-10-08
  • 打赏
  • 举报
回复
final!!!!
tanggoodboy 2006-10-08
  • 打赏
  • 举报
回复
更正一下
“这就是父类对象调用子类的方法,”不是父类的对象,是父类的引用,把子类的对象直接赋给父类的引用句柄,父类的引用就指向子类的对象,调用的就是子类的方法。但是父类的对象不能直接赋给子类的引用(人不一定都是男人),要强制转换之后才能赋。 不知道这样说对不对,
tanggoodboy 2006-10-08
  • 打赏
  • 举报
回复
晚上睡不着,路过看到
我觉得的有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忘高手们帮帮忙
tallen2005 2006-10-07
  • 打赏
  • 举报
回复
TO:楼主
你写的这个编译时就会报错,你的理解是对的,但编译器是严格而且是敏感的,在JAVA虚拟机中对你源码的识别是Base的方法,而Base的方法是private所以编译会错。
本人新建JAVA群欢迎交流:群号8595489
gseah 2006-10-07
  • 打赏
  • 举报
回复
TOMORROW
wxiaof2005 2006-10-07
  • 打赏
  • 举报
回复
我的感觉是这个题目好象不是多态的把。多态一般都是向上转型的,而这个是向下转型的。


本人也正在学Java中……
Areslp 2006-10-07
  • 打赏
  • 举报
回复
另外final方法也是不能被重写的。。。
加载更多回复(2)
【为什么学习Java?】 1.因为Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师,选择Java,就是选择了高薪。2.Java语言常年霸占着三大市场:互联网和企业应用,这是Java EE的长期优势和市场地位;大数据平台,主要有Hadoop、Spark、Flink等,他们都是Java或Scala(一种运行于JVM的编程语言)开发的;Android移动平台。这意味着Java拥有最广泛的就业市场。【我将如何教你?】 本课程囊括了Java语言的基本知识点,可以在短时间内带领学生概览Java语言的全貌,先了解再深入,花最少量的钱,做最快的实验,看你是否对Java感兴趣,有信心。绝对是一门小白学习的必修课程!本课程分为三大模块: 初识篇:主要以Java的环境安装及基础语法为主要内容,帮助学员解决Java基础语法问题,并对Java做一定的介绍,为后续的进阶课程内容展开做好语言基础。进阶篇:带你玩转Java进阶必学的类库和各类API知识,搞清Java最重要的核心编程思想面向对象编程。扩展篇:本篇包含了JDBC、GUI、网络编程、多线程编程等Java高阶应用技巧和核心原理。【报名须知】课程采取录播模式,课程永久有效,可无限次观看课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化【如何开始学习?】PC端:报名成功后可以直接进入课程学习移动端:下载CSDN学院或CSDN

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧