public class classA{
public void methodOne(int i){ }
public void methodTwo(int i){ }
public static void methodThree(int i){ }
public static void methodFour(int i){ }
}public class classB extends classA{
public static void methodOne(int i){ }
public void methodTwo(int i){ }
public void methodThree(int i){ }
public static void methodFour(int i){ }
}
1 问那些方法隐藏了父类的方法?1 问那些方法覆盖了父类的方法?很奇怪隐藏和覆盖有区别么? 不都是Overriding么?
public void methodOne(int i){ }
public void methodTwo(int i){ }
public static void methodThree(int i){ }
public static void methodFour(int i){ }
}public class classB extends classA{
public static void methodOne(int i){ }
public void methodTwo(int i){ }
public void methodThree(int i){ }
public static void methodFour(int i){ }
}
1 问那些方法隐藏了父类的方法?1 问那些方法覆盖了父类的方法?很奇怪隐藏和覆盖有区别么? 不都是Overriding么?
解决方案 »
- 文本相似性检测系统(主要是论文)
- !!~java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver
- 如何设置path和classpath?
- 请问如何在java程序中设置代理 ,包括验证,详细一点谢了
- 一个字符串
- 求教:如何用ClassLoader加载.jar文件中编译好的类
- 请教java线程问题
- 请教一个对象内存释放的问题:一个数据集对象rowset在使用完后,使用rowset.close()方法还是使用rowset.close();rowset=null;方法?这两
- 为什么我的javac不能正确执行?(在线等!)
- Thread.currentThread().join();如何取消
- 关于环境变量
- 从邮件服务器接收邮件,怎样同时将其从邮件服务器删除?
2methodTwo
其他两个方法编译是无法通过的,要么给methodThree,methodOne加上static,要么去掉static.
要保证如果有static 就都有static对吧
classA a = new classB();
a.methodFour()//这里调用的就是父类的方法,
a.methodTwo()//这里调用的是子类的方法.你可以去搜索一下,论坛上这个问题的帖子非常多的!
而非static的方法是实例化方法是可以被覆盖的。
一 覆盖
①
class A{
public void getA(int i){ }
}
②
class B extends A{
public void getB (int i){
getA(1);//调用的是C中的方法
}
}
③
class C extends B{
public void getC(int i){
getB(1);
}
//这就是覆盖了Class A 这个中的方法
public void getA(int i){ }
}
二 隐藏
①
class A{
public static void getA(int i){ }
}
②
class B extends A{
public void getB (int i){
getA(1);//调用的是B中的方法
}
//这就是隐藏了Class A 这个中的方法
public static void getA(int i){ }}
③
class C extends B{
public void getC(int i){
getB(1);
}
}三 隐藏!错误!!
①
class A{
public static void getA(int i){ }
}
②
class B extends A{
public void getB (int i){
getA(1);//调用的是B中的方法
}}
③
class C extends B{
//这就是没有隐藏Class A 这个中的方法
public static void getA(int i){ }
}C .getB(3);//调用的还是A中的getA方法。
②
class B extends A{
public void getB (int i){
getA(1);//调用的是C中的方法==============>这里调用的是A中的方法
}
}
其实这里的关键就是getA(int i)这个方法到底是从哪里来的,首先B是继承了A因此它同时也继承了
A中的getA(int i)这个方法,因此在getB(int i)方法中它所能看到的getA(int i)方法只能是
从A中继承过来的那个。从另一个角度说,C是B的一个子类,我们暂称B为父亲,C为儿子。其中的方法
就当成是父亲,儿子要做的事情。打个不恰当的比喻就是:我父亲想要做getB事情时,他自己都不知道
会不会有C这个儿子,所以他在做getB时用到的getA怎么会是被儿子(C)覆盖过的getA呢?在他干
getB这件事情时能确定的只是它的父亲(A)留给它的getA方法,因此在这里getB中调用的是A中getA
或者是它自己覆盖getA后的方法,而不会是他儿子中覆盖过的getA方法。
我们可以举个简单的例子证明这一点:
public class A{
public void print(int i){
System.out.println("Using Class A;"+"Get i="+i);
}
}
public class B extends A{
public void Bprint(int i){
print(i); //// 这里到底会调用谁的print呢?????????
}
}
public class C extends B{
public void Cprint(int i){
Bprint(i);
}
public void print(int i){
System.out.println("Using Class C;"+"Get i="+i);
}
}
public class Main{
public static void main(String args[]){
B b1 = new B();
b1.Bprint(2345);
}
}
我们运行main后会看到结果:
Using Class A;Get i=2345
因此,事实也是如此!!
这里是C.getA(3)??????
修改main函数如下:
public class Main{
public static void main(String args[]){
B c1 = new C();
c1.Bprint(123);
}
}
运行结果:
Using Class C;Get i=123
这里虚拟机其实已经装载了A,B,C三个类,c1其实是C的一个实例,这样的话我们可以
和上面一样进行分析,c1调用的Bprint方法其实是从B中继承下来的,Bprint中又调用了
print(i)方法,在C他自己这个类里已经将print(i)覆盖了,所以调用的是自己类中
的方法,上面的例子是调用其父亲的方法,这里的例子是调用其自身的方法。
因为c1也是B,A的实例,万物皆对象,java中所有对象都来自Object,所以你
new出来的所有咚咚均是Object的实例。但他们都有个下界,这里就是C
如果B b1 = new B()那b1就不是C的实例而最多是B的实例
Object-
|__A
|__B
|__C
实例向上兼容(其实不能这样表述,一下子找不到词了),所以我new出来的c1可以用B类型来表示.
一 覆盖
中的
②
class B extends A{
public void getB (int i){
getA(1);//调用的是C中的方法
}
}
这一部分讨论的是非静态类,所以不会有foxox()所描述的
“这里是C.getA(3)??????”表述方式
要不你就先new一个C对象实例出来,否则你不可以直接调用非静态方法
而非static的方法是实例化方法是可以被覆盖的"
有这种说法?
不是final方法不能被覆盖么?
做为JAVA不应该出现这种情况,
最好的方法是,编码时不要写
自己都可能看不明白代码!
就是在C++里,也不是所有的人
都承认它的存在.
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数.
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。//覆盖必须要有virtual
按他说的,解释成JAVA语言,只有抽象方法才能谈得上被覆盖.
静态方法不能overriding
methodFour隐藏了父类的方法
methodTwo覆盖了父类的方法?
methodOne/methodThree编译出错.对不对?
能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm
方成eform是一个web表单,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.
当调用 a.methodFour() 时用的 classA 的 methodFour 而不是 classB 的 methodFour。(上机实验得) 很显然 methodTwo 是覆盖! methodFour 是隐藏~ !很有信心~~~