java继承多态的那些事儿!

daijope 2011-07-19 01:17:38
基类:

package com.cn;

import com.dai.C;

public class A {
public void b() {
System.out.println("A.b");
}
protected void c() {
System.out.println("A.c");
}
private void d() {
System.out.println("A.d");
}
public static void main(String[] args) {
A c = new C();
c.d();//打印出A.d了呵呵??
}
}
/*
* private类型的能继承吗?呵呵
*
* */


派生类:

package com.cn;

import java.lang.reflect.Method;

public class C extends A{
public static void main(String[] args) {
A c = new C();
Class<? extends A> type = c.getClass();
Method[] methods = type.getMethods();
for(Method me:methods) {
System.out.println(me.getName());
}
}
}
/*
最后的输出为:
main
b
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
为什么没有c呢?
*/


不是继承了c()这个方法了吗?为什么没有打印出C。

java继承到底是什么样的机制啊。
多态的时候有事咋回事呢?
谁能说说继承多态的内存模型呢?

...全文
86 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2011-07-19
[Quote=引用 11 楼 daijope 的回复:]
嗯,说的很有道理啊,是不是可以这样理解:我这里的方法c.d();与直接d();这两个是同一个意思呢?当然前提是要忽略static问题。也就是说这里的方法调用与new C()是没什么关系的?
[/Quote]

1、这样理解有一些小问题:
你确实生成了一个A的对象,
但是这个A的对象是在A类的内部生成的
所以可以通过A的引用调用其私有方法

2、如果说执行效果的话,
你不new C();
直接调用的d();
(当然,要在非静态方法中直接调用d();)
和你这样写的执行效果是一样的。
回复
licip 2011-07-19
private 修饰的没有多态,只是调用。
其实是调用了A类中的方法罢了。
回复
daijope 2011-07-19
[Quote=引用 8 楼 sunyiz 的回复:]

不能继承的意思说的是在其子类内部不可调用

通过多态可以使用?你哪里通过多态使用了?

A c = new C();
c.d();

你把这段移到别的类里面试试……,
你这个调用d()的方法,还是在A类的内部,在内部用A类型的引用调用A类的私有方法当然可以

或者你改成
C c = new C();
c.d();
试试……
[/Quote]
嗯,说的很有道理啊,是不是可以这样理解:我这里的方法c.d();与直接d();这两个是同一个意思呢?当然前提是要忽略static问题。也就是说这里的方法调用与new C()是没什么关系的?

回复
shaobaitou 2011-07-19
[Quote=引用 9 楼 daijope 的回复:]
引用 7 楼 shaobaitou 的回复:

坐等高手讲解,C方法是protected,现在是同包的子类。我也觉得可以访问?为啥呢?


是可以访问的,只是个getMethods()只返回public方法的,所以,,,
[/Quote]
噢。理解。
回复
daijope 2011-07-19
[Quote=引用 7 楼 shaobaitou 的回复:]

坐等高手讲解,C方法是protected,现在是同包的子类。我也觉得可以访问?为啥呢?
[/Quote]

是可以访问的,只是个getMethods()只返回public方法的,所以,,,
回复
sunyiz 2011-07-19
不能继承的意思说的是在其子类内部不可调用

通过多态可以使用?你哪里通过多态使用了?

A c = new C();
c.d();

你把这段移到别的类里面试试……,
你这个调用d()的方法,还是在A类的内部,在内部用A类型的引用调用A类的私有方法当然可以

或者你改成
C c = new C();
c.d();
试试……
回复
shaobaitou 2011-07-19
坐等高手讲解,C方法是protected,现在是同包的子类。我也觉得可以访问?为啥呢?
回复
daijope 2011-07-19
[Quote=引用 4 楼 sunyiz 的回复:]

getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

API上就写了,这个方法返回的就是 公共 的方法
你能在外部调用的,只有公用方法,
把 protected 的方法通过反射返回给你也没有意义
pr……
[/Quote]
那么private方法是不能继承的,但是为什么通过多态确实可以使用呢?就像上面A中的方法d(),有没有上面好的解释呢?
回复
fellatioyzx 2011-07-19
private类型的不能继承,
是根本没继承、
还是继承了一块儿内存但是不可用
我给忘了。。。

记得java编程思想上有吧
回复
sunyiz 2011-07-19
getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

API上就写了,这个方法返回的就是 公共 的方法
你能在外部调用的,只有公用方法,
把 protected 的方法通过反射返回给你也没有意义
protected 的方法可以继承,就是在其子类的内部可以调用
private 类型不能继承
回复
daijope 2011-07-19
[Quote=引用 2 楼 tjcyjd 的回复:]

这个看看例子就懂了。例子如下:
[/Quote]
例子在哪里呢?
回复
Java高知社区 2011-07-19
这个看看例子就懂了。例子如下:
回复
daijope 2011-07-19
第二个问题是getMethods();只得到public方法。第一个还是很疑惑啊?有没有人提点意见呢?
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告