class A
{
public void fun1()
{
func2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
}class B extends A
{private void fun2()
{
System.out.println("This is B::fun2()");
}
}main()
{
B b = new B();
b.func1();
}请问,为什么会B实例的func1会调用A的func2呢???
Java的多态到底怎么回事???
如果我想重写func2,而使得func1调用我重写的func2,该如何做?
{
public void fun1()
{
func2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
}class B extends A
{private void fun2()
{
System.out.println("This is B::fun2()");
}
}main()
{
B b = new B();
b.func1();
}请问,为什么会B实例的func1会调用A的func2呢???
Java的多态到底怎么回事???
如果我想重写func2,而使得func1调用我重写的func2,该如何做?
我重写了func2,但是我并没有重写func1啊
我希望func1调用我重写的func1啊!!!
Java里怎么做?
func1是接口方法好不好?func2没必要暴露给用户。如果public的话,接口岂不是变大了?
Java在面向对象方面还是不如C++方便啊
——兄弟,B要继承func1的实现啊重写当然可以,那不是多写了一份代码嘛,你可以看看template method模式!
如果是符合override的话那么用B的对象,也就是new B()一定可以调用到B中的fun2方法的。
——呵呵,纯/半面向对象???面向对象这个概念有确切概念吗?
——Java不能多重继承也很让人头疼
这个不是override,由于A类的fun2已经是private了,根本不能被B类继承过来,所以两个类中的fun2不存在override关系,就是两个独立的方法,
如果是符合override的话那么用B的对象,也就是new B()一定可以调用到B中的fun2方法的。
override是只要你的访问权限更严格或相同都能覆盖吧!
比如public f(){} 可以用private,protected,public,以及默认的权限覆盖;
private f(){} 怎么只能由private覆盖;
public class DBReader extends Person
{
private void a()
{
}
}package stu;
public class Person{
static int i;
public static void main(String[] args)
{
}
void a()
{
}
}建议看下这2段代码,为什么在类DBReader 中可以把方法a声明为private的呢?如果为override那么应该不能够缩小访问权限的。
正是因为在Person类中a方法为默认级别对不同包中的类DBReader 是不可见的,所以这个时候编译器把DBReader 中的a方法当作一个新的方法,
根本不是override,这样才可以把DBReader 中的方法a()生命为private
而且方法的覆盖也是在内存中的一个空间里重新写,并没有真正覆盖原来的那个方法;所以他只是改变了那个地址.
class A
{
public void fun1()
{
func2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
} class B extends A
{ private void fun2()
{
System.out.println("This is B::fun2()");
}
} main()
{
B b = new B(); //这里应该是改变了超类里面的那个地址?
b.func1();
}
之所以没有错误就是因为编译器认为这个方法不能构成重载。
class Parent{
int a;
private int g(int a,int b){
...
}
}
class Child extends Parent{
int a;
int b;
public int g(int a,int b){ //增大访问权限的覆盖,(按你说的,这个也是新定义的?)
...
}
}
访问控制符可以使用与超类相同或比超类权限更大的控制符
class Parent{
int a;
private int g(int a,int b){
...
}
}
class Child extends Parent{
int a;
int b;
public int g(int a,int b){ //增大访问权限的覆盖,(按你说的,这个也是新定义的?如果改成private也应该是相同道理,只是权限没变化)
...
}
}
public class DBReader extends Person
{
private void a()
{ }
} package stu;
public class Person{
static int i;
public static void main(String[] args)
{
}
void a()
{ }
}
呵呵。你的那个例子同属于一个包里面看不出来什么的。还是让你看看我的这个代码,由于父类与子子类处于不同的包中,所以父类Person 中的a()方法
对于子类DBReader不可见,这个时候子类的a()方法你说还是override吗?如果是就不能声明为private,缩小了权限,同理,也就是说,对于子类不可见的
父类中的方法,子类中就不能override,只不过,如果父类为private了,子类没办法再缩小权限,如果可以缩小权限也一定不会报错误,因为不是override
覆盖一个方法应该不需要访问它,也没有提到要访问它,我认为不应该对它是否可见进行讨论.用private尽是代表其他类不能访问.
覆盖的定义:子类拥有与超类相同成员的情况.(并没说是否可见,这个就可以否认可见后才能override,同一个包中的的任何类都可以访问你定义在另一个类中的public和默认访问控制符的方法,所以才用private进行修饰,拒绝其他类访问.)
一个要求:访问控制符可以使用与超类相同或比超类权限更大的控制符 .
呵呵,终于明白了,应该这样是对的.
请提出自己的想法.
public class DBReader extends Person
{
private void a()
{ }
} package stu;
public class Person{
static int i;
public static void main(String[] args)
{
}
void a()
{ }
} 呵呵,那你说我的这个代码怎么解释呢?既然编译器没有报错,就应该不是覆盖,因为明显已经缩小了方法a()的访问权限
按LZ的想法 如果别人写B继承你的A 是不是一定要看你的A类设计的源代码 不然他有什么途径知道A里有个 PRIVATE FUNC2() 成员?如果一个成员允许子类重写 干吗要PRIVATE?如果PRIVATE了还可以重写 那还要 PROTECTED干吗?给出这么多修饰符就是为了 完成不同的目的 不要自己和自己搞脑子JAVA 不能多重继承 那就实现多接口 模拟多重继承
这个我明白了。
我知道覆盖是要继承来做前提,重载就不一定了,在一个类中就可以重载多个方法。
现在是原归正传,说lz的问题。
"这个不是override,由于A类的fun2已经是private了,根本不能被B类继承过来,所以两个类中的fun2不存在override关系,就是两个独立的方法,
如果是符合override的话那么用B的对象,也就是new B()一定可以调用到B中的fun2方法的。"
我想你这句话,因为lz的代码中,并没有缩小访问控制符的范围.而且都满足定义和要求,我是围绕这个说的.你的看法现在如何?
今天这个问题不让你明白我就不睡觉了。
把楼主的代码放在eclipse里面,然后在子类中让eclipse自动生成父类的override方法,具体步骤
在eclipse中点工具栏中的Source,然后点Override/Implements Methodes
你看看让不让你选择覆盖父类中了私有方法。根本private方法就选择不了。
class A
{ public void fun2()
{
System.out.println("This is A::fun2()");
}
} public class C extends A
{ public void fun2()
{
System.out.println("This is B::fun2()");
}
public static void main(String[] args)
{
C b = new C();
b.fun2();
}
}
同样也不让我覆盖?
private是要引用的时候才有用,这个是我的看法,说了覆盖有用吗?
现在我是坚持我的看法,明天去问问老师,再说我没钻牛角尖,
我和宿舍的同学也在讨论虽然他是学c++的,但是也说,这个能覆盖,
”也是为了避免其他类的修改。private并不是针对覆盖的,是对引用而言。至于protected则是允许子类引用超类的成员,并非覆盖。
知道内存空间的应该都知道尽管说的覆盖,但在存储空间中仍然是有超类和子类的方法的,并不是真的把超类的方法重写了。在new对象的时候是直接调用的他们的地址。
{
public void fun1()
{
func2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
} class B extends A
{ private void fun2()
{
System.out.println("This is B::fun2()");
}
} main()
{
B b = new B();
b.func1();
}
class A
{
public void fun1()
{
fun2();
}
public void fun2()
{
System.out.println("This is A::fun2()");
}
} class B extends A
{ public void fun2()
{
System.out.println("This is B::fun2()");
}
} class C
{ public static void main(String [] args )
{
B b=new B();
b.fun1();
b.fun2(); }
}
class A
{ private void fun2()
{
System.out.println("This is A::fun2()");
}
public void fun1(){
fun2();
}
} public class B extends A
{ private void fun2()
{
System.out.println("This is B::fun2()");
}
public static void main(String[] args)
{
B b = new B();
b.fun2();
A a = new B();
a.fun1();
}
}
输出:
This is B::fun2()
This is A::fun2()
代码二:
class A
{ public void fun2()
{
System.out.println("This is A::fun2()");
}
public void fun1(){
fun2();
}
} public class B extends A
{ public void fun2()
{
System.out.println("This is B::fun2()");
}
public static void main(String[] args)
{
B b = new B();
b.fun2();
A a = new B();
a.fun1();
}
}
输出:
This is B::fun2()
This is B::fun2()
不可覆盖正确,早知道如此简单就早点写这个,光靠理论是不行的呀!
感谢lz的问题,感谢大家的指导.
楼主在你认为重写的方法前加个
@Override
看编译让你过不,就知道是不是重写了。
你去看看TIJ中的多态那章,讲的很明确
{
public void fun1()
{
func2();//B实例中的fun1()实际上还是调用了A中的fun2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
}class B extends A
{private void fun2()
{
System.out.println("This is B::fun2()");
}
}main()
{
B b = new B();
b.func1();
} 如果我想重写func2,而使得func1调用我重写的func2,该如何做?class A
{
public void fun1()
{
func2();
}
private void fun2()
{
System.out.println("This is A::fun2()");
}
}class B extends A
{
private void fun1()
{
this.func2();
}private void fun2()
{
System.out.println("This is B::fun2()");
}
}main()
{
B b = new B();
b.func1();
} 不知道对不对,如果错了请指正。
相当于this.fun2
不过写成私有的..就..哇哈哈..太失误了点
http://topic.csdn.net/u/20070131/22/6ff91883-6903-471b-9cd1-22387d11af15.html
建议看看core java或者thinking in java
讲解得很详细
现在大概总结下:
Java里的private方法不能被子类重写。
这个是和C++不一样的一个地方。
Java这个特点有些怪异:对于父类的private方法,运行时可以访问,设计时却不能重写呵呵。