作者jetswayss (小犬)
看板java
标题Re: [问题] private继承问题
时间Tue Jul 15 05:00:30 2014
※ 引述《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又不太一样 不过也是另一件事了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.161.184.19
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1405371632.A.573.html
※ 编辑: jetswayss (118.161.184.19), 07/15/2014 05:26:55
1F:推 kiwatami:我只是觉得 继承了public的get方法 却没有继承get方法里r 07/15 22:05
2F:→ kiwatami:eturn的变数 有点说不太通 尤其那个变数还不是运算後产 07/15 22:05
3F:→ kiwatami:生的 而是class本身带有的变数 从父类别的实体里取得感 07/15 22:05
4F:→ kiwatami:觉比较像是实做上的说法 07/15 22:05
5F:→ TonyQ:其实就是对继承的语意解读不同而已 07/16 06:23
6F:→ TonyQ:我觉得你的跟他的表达,都说得通。只是教学上会以官方文件 07/16 06:23
7F:→ TonyQ:为准。但概念上讨论我觉得是开放的自由讨论想法啦。:P 07/16 06:24
8F:→ TonyQ:不然在跨语言的比较或讨论时就容易碰到语意上微妙不同的问题 07/16 06:25
9F:推 kiwatami:嗯 同意你的说法 07/16 11:03
10F:推 luoqr:因为public的get才会继承 如果get方法宣告成private一样不会 07/16 20:55