Re: [问题] private继承问题

楼主: jetswayss (小犬)   2014-07-15 05:00:30
※ 引述《kiwatami (悠游自在)》之铭言:
: ※ 引述《meya (落寞之心)》之铭言:
: : class A{
: : private int a1=1;
: : }
: : public class test extends A{
: : public static void main(String[] args){
: : test t=new test();
: : System.out.println(t.a1);
: : }
: : }
: : 子类别无法直接存取父类别的private a1,但
: : 究竟子类别有无继承父类别的private a1?
: : 应该用下列哪种理解才正确?
: : (A)子类别内的a1继承自父类别的a1,只是父类别用private修饰a1,让其他类别无法直接
: : 存取父类别内的a1
: : (B)使用private修饰过的a1,无法被子类别继承
: : 恳请回答谢谢
: 答案是A
: 当然有被继承
: 不然你用get会拿到什么?
: 用private只是封装变量不给外部使用
: 用意是在外部程式若随便更改变量可能会导致程式出现错误(当然这不是唯一的目的)
: 所以要封装起来由setter做更动
: 不一定正确啦 因为我满讨厌读定义的XD
: 你参考一下
根据官方tutorial的说法是没有继承的
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
我试着解释 你的顾虑 不知道正不正确
请大家帮我看看我的理解正确吗
继承状态下父类别实体是存在的 而且所有的成员 方法都存在
package org.twbbs.peak.test;
public class ClassA {
@SuppressWarnings("unused")
private int privateInt=10;
int defaultInt=20;
protected int protectedInt=30;
public int publicInt=40;
}
package org.twbbs.peak.test;
public class ClassB extends ClassA{
@SuppressWarnings("unused")
private int privateInt=1;
int defaultInt=2;
protected int protectedInt=3;
public int publicInt=4;
}
public class Starter {
public static void main(String args[])throws Exception{
ClassB classB= new ClassB();
reflection(classB);
reflection2(classB);
}
private static void reflection(ClassB classB) throws Exception{
System.out.println("\n\nReflection");
Class<? extends ClassA> class1 = ClassA.class;
Field[] fields = class1.getDeclaredFields();
for(Field f:fields){
f.setAccessible(true);
System.out.println(f+ "==" +f.getInt(classB));
f.setAccessible(false);
}
}
private static void reflection2(ClassB classB) throws Exception{
System.out.println("\n\nReflection");
Class<? extends ClassB> class1 = ClassB.class;
Field[] fields = class1.getDeclaredFields();
for(Field f:fields){
f.setAccessible(true);
System.out.println(f+ "==" +f.getInt(classB));
f.setAccessible(false);
}
}
}
会跑出
Reflection
private int org.twbbs.peak.test.ClassA.privateInt==10
int org.twbbs.peak.test.ClassA.defaultInt==20
protected int org.twbbs.peak.test.ClassA.protectedInt==30
public int org.twbbs.peak.test.ClassA.publicInt==40
Reflection
private int org.twbbs.peak.test.ClassB.privateInt==1
int org.twbbs.peak.test.ClassB.defaultInt==2
protected int org.twbbs.peak.test.ClassB.protectedInt==3
public int org.twbbs.peak.test.ClassB.publicInt==4
所以不论如何所有的成员都是存在的
而我想继承的意义是在与 存取的权限 和存取到什么
简单来说
假设ClassB改成
public class ClassB extends ClassA{
public ClassB() {
System.out.println(publicInt);
System.out.println(protectedInt);
System.out.println(defaultInt);
// System.out.println(privateInt);
}
}
privateInt 会无法存取
所以我们称ClassB有继承publicInt,protectedInt,defaultInt
而继承没有什么复制或是什么的变成ClassB的东西 只是取得权限去存取而已
用的还是ClassA的成员
而成员OVERRIDE和 方法的OVERRIDE又不太一样 不过也是另一件事了
作者: kiwatami (悠游自在)   2014-07-15 22:05:00
我只是觉得 继承了public的get方法 却没有继承get方法里return的变量 有点说不太通 尤其那个变量还不是运算后产生的 而是class本身带有的变量 从父类别的实体里取得感觉比较像是实做上的说法
作者: TonyQ (自立而后立人。)   2014-07-16 06:23:00
其实就是对继承的语意解读不同而已我觉得你的跟他的表达,都说得通。只是教学上会以官方文件为准。但概念上讨论我觉得是开放的自由讨论想法啦。:P不然在跨语言的比较或讨论时就容易碰到语意上微妙不同的问题
作者: kiwatami (悠游自在)   2014-07-16 11:03:00
嗯 同意你的说法
作者: luoqr (.....)   2014-07-16 20:55:00
因为public的get才会继承 如果get方法宣告成private一样不会

Links booklink

Contact Us: admin [ a t ] ucptt.com