返回信息流纯新手,最近在看<<JAVA核心技术卷1基础知识>> 第九版
问题:
1. 【159面】注释:“前面曾经说过,方法的名字和参数列表称为方法的签名。例如,f(int)和f(String)是两个具有相同名字,不同签名的方法。如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。
不过,返回类型不是签名的一部分,因此,在覆盖方法时,一定要保证返回类型的兼容性。允许子类讲覆盖方法的返回类型定义为原返回类型的子类型。......”
带颜色的一句,因果性看不懂,什么叫因此,没理解。
2. 父类的private变量可以继承么?父类的private方法可以继承么?
3. 一个类中 private int a; 和 final private int a; 有什么区别?【final 只是说这个变量不可修改是吧】
4. 一个类中 private void fun(){} 和 final private void fun(){} 有什么区别?
5.
class A{
private int num;
public void pNumInAFromB(B b){
A a = b;
System.out.println(b.num); // no!
System.out.println(a.num); // ok!
}
}
class B extends A{
}
为什么第一句System.out.println(b.num);不能访问num?
按照权限访问规则,num是A私有的,我在 Class A中的方法,应该可以访问啊。
这是一条镜像帖。来源:北邮人论坛 / java / #43922同步于 2015/8/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【暂时解决,因为protected更复杂,还在看】java新手,问几个问
YiYeShu
2015/8/31镜像同步42 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1. 返回类型不是签名的一部分,所以:如果子类返回的class必须是父类的返回类,或子类,否则在多态的时候会出现错误(我也不知道自己在说什么)
2. 不,不
3. 是的
4. 好像没什么区别,因为都不能override 不知道会不会有inline的区别,不过我刚才搜索了下好像也没有 @nuanyangyang
5. 私有的变量和方法,是说不能通过对象去访问它。和到底这句话在哪个类里没关系
1、我也不理解因果关系。但是这里有一个规则:
1) 只要子类中有一个方法(称为Mc),签名和父类的某个public或protected方法(称为Ma)一致,Java就认为Mc覆盖Ma。(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1)
2) 这时候,如果Mc的返回值和Ma的返回值不同,也不是Ma的返回值的子类,就会产生编译时错误。(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.3)
2、不可以。不可以。(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8)
3、final是只读的,不可以修改(就算是当前类也不可以)。如果是private的,子类连读都不能读。
4、没有区别。final防止子类覆盖它,但private对子类是不可见的。
5、这里num不是B类的成员。“成员”有下面几种:(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)
1) 继承自父类或者父方法的成员(private不能继承)
2) 在当前类中定义的成员。
如果通过b.num表达式来试图访问num成员,但num连成员都不是,那么就是编译时错误。(http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.11.1)
1. 看不懂你说的是啥。。
2. private变量的话, 我看的这本书说是可以继承,不过不能在子类中访问;private方法的话,书上没说到,网上有说private默认final,也有说,“谁说private 方法默认自带final?!!!”。
3. 嗯,这个达到一致了。
4. 怎么样证明一个private的方法不能override。我在子类中写一个签名一样的方法时,也没报错啊。如下:
class A{
private void test(){
System.out.println("A");
}
}
class B extends A{
public void test(){
System.out.println("B");
}
}
5.
class A{
private int num;
public void pNum(A a){
System.out.println(a.num);
}
}
这也是通过对象访问,这句就可以执行。
【 在 icyfox 的大作中提到: 】
: 1. 返回类型不是签名的一部分,所以:如果子类返回的class必须是父类的返回类,或子类,否则在多态的时候会出现错误(我也不知道自己在说什么)
: 2. 不,不
: 3. 是的
: ...................
【 在 icyfox 的大作中提到: 】
: 1. 返回类型不是签名的一部分,所以:如果子类返回的class必须是父类的返回类,或子类,否则在多态的时候会出现错误(我也不知道自己在说什么)
: 2. 不,不
: 3. 是的
: ...................
放狗搜了一下,答案好象是Java一直容忍程序员写各种冗余的修饰符,比如
final class A { // final class本身就不能有子类
private int b; // 当然private成员变量也不能继承
private final int c(); // private方法子类不能继承,自然无法覆盖;final也是阻止覆盖用的
}
2。 谁说private自带final!!!
final是不能变,private是不能访问,这是两码事
4. 你能在子类方法里写override吗?
6. 有分歧的,以暖羊羊为准
【 在 YiYeShu (一页书) 的大作中提到: 】
: 1. 看不懂你说的是啥。。
: 2. private变量的话, 我看的这本书说是可以继承,不过不能在子类中访问;private方法的话,书上没说到,网上有说private默认final,也有说,“谁说private 方法默认自带final?!!!”。
: 3. 嗯,这个达到一致了。
: ...................
我问你inline呢...
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 放狗搜了一下,答案好象是Java一直容忍程序员写各种冗余的修饰符,比如
: [code=java]
: final class A { // final class本身就不能有子类
: ...................