l867726809 2015-04-13 14:08 采纳率: 0%
浏览 1542

C c = new D(); ((D)c).print1();

我创建了ABCD四各类,他们中都有一个protected方法,分别是print1(),print2(),
print3(),print4()。我在D中的main方法里面写了如标题的语句,创建了一个
D的对象存在C类型的引用里面,但是由于某种原因,(我还没搞懂求赐教)如果想调用
protected 方法,调用类要和被调用类之间要有继承关系,不光如此,调用使用的对象
必须是自身类创建,或者是自身子类创建,还在理解这个问题的时候,我想到当你用对象调用
某方法或者属性时候,未必能确定该对象是什么类创建的,我觉得这样就很模糊,上面所说到底是和
创建该对象的类型有关,还是和该对象引用的类型有关(上面曾经提到 调用protected的条件:调用使用的对象
必须是自身类创建,或者是自身子类创建)
做完实验之后发现报错,但是我写的另外一行代码又没问题,
D d = new D();
d.print1();
请问这两句代码有什么不同吗,都是在D的main方法下的,
C c = new D();
((D)c).print1(); D cannot be resolved to a variable
都是D的引用类型,D创建的对象,为什么在这里会报错,
希望大神讲一下,个中原因,引用类型,对象创建类型,protected,在这里面都
发挥了什么样的作用。

  • 写回答

3条回答 默认 最新

  • threenewbee 2015-04-13 15:07
    关注

    C c = new D(); 能不能成立,以及(D)c能不能成立,取决于D是不是C的派生类。要想函数重写,函数名必须相同,如果基类叫print1,派生类叫print2
    后果就是,通过基类类型访问,只能调用print1,通过派生类则既可以调用print1也可以调用print2
    如果派生类也有print1,那么对基类的print1构成重写,那么通过基类或者派生类调用print1,都是调用的实际类型(派生类)的print1。
    protected的作用是,对于派生类来说,这个成员可见,而对于没有继承关系的其它类,这个成员不可见。

    评论

报告相同问题?

悬赏问题

  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?