Thinking in Java(2nd)中的原文为 Any private methods in a class are implicitly final. Because you can’t access a private method, you can’t override it (even though the compiler doesn’t give an error message if you try to override it, you haven’t overridden the method, you’ve just created a new method). 注意这里用的是implicitly(含蓄地、暗中地),意思应当是说所有的private方法其实都是final的,因为这些private方法不会(而不是不能)被覆盖。括号里的话就更清楚了——当你试图覆盖它(private方法)时,即使编译器没有给出错误信息,你实际上也没有真的覆盖掉这个方法,你只是创建了一个新的方法。
TO Tasia(这里是CSDN吗?) 我看的是电子书,一个字不落的拷贝下来的,我的疑问和你一样,不知道有没有人能解答一个
Tasia的程序很有意思,揭露了Java中一些很有意思的东西,我把Tasia的程序改了改 class Super{ private void method(){ System.out.println("super"); } public void call(){ method(); } } public class Child extends Super{ private void method(){ System.out.println("chile"); } } 然后再在另一个类里调用 Super a = new Super(); Super b = new Child(); a.call(); b.call(); 结果是 super super 也就是说Child类里试图覆盖Super里的private void method()失败了
然后我再修改一下Child类,改成 public class Child extends Super{ private void method(){ System.out.println("chile"); } public void call(){ method(); } } 这回的结果就是 super child 大家可以看出点问题了吧
其实,说白了private方法只可以在类的内部使用,在类外根本访问不到,而final方法可以在类外访问,但是不可以重写该方法,就是说可以使用该方法的功能但是不可以改变其功能,这就是private方法和final方法的最大区别如: class One{ final a(){ ....} private b(){ ....} } class Two{ One one=new One(); one.a;//可以实现 one.b;//不可以实现 }
---那把你的代码帖出来看卡
-------这句话是正确的。因为private是一个类的私有方法,它的子类完全看不到它的private方法。当子类定义一个与父类的私有方法同名的函数时,编译器把它当成一个全新的函数来看待。这样做是没有错误的。
有代码如下:
class Super{
private void method(){
System.out.println("super");
}
}
public class TestPrivate extends Super{
public void method(){
System.out.println("sub class");
}
public static void main(String[] args){
TestPrivate obj1 = new TestPrivate("abc");
obj1.method();
}
}
正确编译,输出结果为:
sub class
改为TestPrivate obj1 = new TestPrivate);
类内所有private 方法都自动成为final。由于我们不能访问一个private 方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。怎么解释呢,这是书上的原话!
我有一个疑问是:如何能“强行”覆盖一个private方法?
Any private methods in a class are implicitly final. Because you can’t access a private method, you can’t override it (even though the compiler doesn’t give an error message if you try to override it, you haven’t overridden the method, you’ve just created a new method).
注意这里用的是implicitly(含蓄地、暗中地),意思应当是说所有的private方法其实都是final的,因为这些private方法不会(而不是不能)被覆盖。括号里的话就更清楚了——当你试图覆盖它(private方法)时,即使编译器没有给出错误信息,你实际上也没有真的覆盖掉这个方法,你只是创建了一个新的方法。
class Super{
private void method(){
System.out.println("super");
}
public void call(){
method();
}
}
public class Child extends Super{
private void method(){
System.out.println("chile");
}
}
然后再在另一个类里调用
Super a = new Super();
Super b = new Child();
a.call();
b.call();
结果是
super
super
也就是说Child类里试图覆盖Super里的private void method()失败了
mor(安稼)列出的原版内容说的是:
类中任何private方法都是final,因为你不能访问一个private方法,所以你不能覆盖它(虽然当你试图覆盖一个private方法时,编译器没有给出错提示,但你并没有覆盖这个方法,你只是创建了一个新的方法而已。)
这个是正解。
public class Child extends Super{
private void method(){
System.out.println("chile");
}
public void call(){
method();
}
}
这回的结果就是
super
child
大家可以看出点问题了吧
class One{
final a(){
....}
private b(){
....}
}
class Two{
One one=new One();
one.a;//可以实现
one.b;//不可以实现
}
final的 方法子类不能重写
final的类不能被继承
final的变量只能覆值一次,不可以改变,相当于常量