java继承的问题

computerlibin 2012-01-11 12:29:07
我写了两个类,第一个类Test1:
public class Test1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二个类Test2继承Test1:
public class Test2 extends Test1 {
public static void main(String args[]){
Test2 t2=new Test2();
t2.setName("a");
System.out.println(t2.getName());
}
}
为什么第二个类中t.setName("a")和t2.getName()都能访问到Test1的private的name?不是说子类不能继承父类的私有成员吗?
...全文
354 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
newfarmerchi 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 computerlibin 的回复:]
Test2也拥有Test1的私有属性吗?

引用 22 楼 newfarmerchi 的回复:

Test2通过继承,自动拥有了Test1的所有成员(成员变量和方法)。
可以这样
public class Test2 extends Test1 {
public static void main(String args[]){
Test1 t1 = new Test1();
t1……
[/Quote]
有,你这样试一下。
class Test1 {
private String name ="i am father";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//第二个类Test2继承Test1:

public class Test2 extends Test1 {
//name = " i am son";此处不能象Test1那样赋值
public static void main(String args[]){
Test1 t1 = new Test1();
//t1.setName("A");
System.out.println(t1.getName());
Test2 t2=new Test2();
t2.setName("i am son");
System.out.println(t2.getName());
System.out.println(t1.getName());//t1的名称改了吗
}
}

Ciffer 2012-01-12
  • 打赏
  • 举报
回复
补一句:调用是调用、赋值是赋值,不能混在一起的
Ciffer 2012-01-12
  • 打赏
  • 举报
回复
LZ貌似有点混乱了。
private的作用在于,限制被它修饰的属性:只能中本类中调用。
但不是说不能被间接调用。
比如说下面的:
Name n=new Test1().getName();
n.firstName="我改了你的姓氏";
n.lastName="我改了你的名字";
在Test1中应该是定义了 private Name name;
这里的private只能限制name的属性只能中本类中直接调用。其他类无法对其直接修改(new Test1().name=?),但是可以间接修改。
总得来说,private 只能限制调用,而不能限制值的改变。
final 才是用来限制值不能修改的。

computerlibin 2012-01-12
  • 打赏
  • 举报
回复
子类继承父类在jvm中是怎么表示的?是不是子类实例中含有一个指向父类的引用?[Quote=引用 16 楼 atomhdp 的回复:]

举个例子说明:Test1类是爸爸,Test2类是儿子,爸爸有自己的钱,儿子没有钱,连卡都没有。 但是爸爸把卖东西和买东西的权利对儿子开放了。 假如爸爸银行卡里面的钱开始为100块钱,然后儿子帮爸爸在卖了一件衣服值50块钱,这时候那爸爸的银行卡里就有150块钱了,后来儿子又帮爸爸买包烟20块钱,银行卡里面钱就只有130块钱了。 但这中间不论什么时候,银行卡里面的钱,都不是儿子的。 儿子在没有去买……
[/Quote]
Ciffer 2012-01-12
  • 打赏
  • 举报
回复
中创建子类对象时,会先创建父类的对象。
实际上中内存块中的子类对象包含了父类的对象,继承实际上就可以看做是给子类添加了一个父类类型的属性:super。
computerlibin 2012-01-12
  • 打赏
  • 举报
回复
Test2也拥有Test1的私有属性吗?
[Quote=引用 22 楼 newfarmerchi 的回复:]

Test2通过继承,自动拥有了Test1的所有成员(成员变量和方法)。
可以这样
public class Test2 extends Test1 {
public static void main(String args[]){
Test1 t1 = new Test1();
t1.setName("A");
System.out.println(t1.getName());
T……
[/Quote]
computerlibin 2012-01-12
  • 打赏
  • 举报
回复
这是什么意思?是说我的Test2和你写的Test2是同样的吗?[Quote=引用 19 楼 gb19861012 的回复:]

Java code

public class Test2 extends Test1 {

@Override
public void setName(String name) {
super.setName(name);
}

@Override
public String getName() {
return……
[/Quote]
computerlibin 2012-01-12
  • 打赏
  • 举报
回复
这样是有点明白了,但是假如我的get方法返回的是private属性的一个引用,对于这个get方法返回一个引用,我不就可以任意修改了吗?这样是不是和你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾了,举个例子:
假如getName()返回的不是String类型而是我定义Name类型,那么以下操作是不是可以任意访问private属性了?
Name n=new Test1().getName();
n.firstName="我改了你的姓氏";
n.lastName="我改了你的名字";
这样是不是与你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾
[Quote=引用 17 楼 alexandertech 的回复:]

私有属性只是不让别的类直接访问,但如果间接都无法访问的话,则属性将失去意义。
对私有属性通常是定义属性的类同时提供访问私有属性的方法供别的类调用,达到间接访问的目的。
这样做的好处是令别的类只能通过本类提供的有限方法访问私有属性,便于追踪和控制。
理解了这一点你就能理解这个问题了。
[/Quote]
东风无眠 2012-01-12
  • 打赏
  • 举报
回复
extends继承
楼主可以这么想,就是不管你父类设置了什么权限我都拿过来了
只是你private的话,我就没有你的钥匙,打不开而已。
码无边 2012-01-12
  • 打赏
  • 举报
回复
setName()和getName()这不算直接访问
你通过设置这个方法,就可以进行访问的。
fengaiyajing 2012-01-12
  • 打赏
  • 举报
回复
就是因为子类继承父类的缘故,虽然private修饰的成员是不能被其他类访问的,但是通过getter和setter访问器就能对私有成员进行访问,如果没有继承特性,子类就不能去访问其父类的私有成员了
Steve 2012-01-12
  • 打赏
  • 举报
回复
楼主的疑惑是Test2是不是也继承的Test1的name。这个很好验证。


public class Test1 {
private String name = "Test1";
public String getName() {
return this.name;
}

}



public class Test2 extends Test1 {
private String name = "Test2";
public Test2() {
System.out.println(this.getName());
}
public static void main(String[] args) {
Test2 t2 = new Test2();
}
}


打印出来的是Test1。
computerlibin 2012-01-12
  • 打赏
  • 举报
回复
不会啊[Quote=引用 37 楼 cloundsea 的回复:]

Java code


public class Test1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二个类Test2继承Test1:
public class Test2 extends ……
[/Quote]
CloundSea 2012-01-12
  • 打赏
  • 举报
回复


public class Test1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二个类Test2继承Test1:
public class Test2 extends Test1 {

private String name; //再定义一个相同的会不会报错??
public static void main(String args[]){
Test2 t2=new Test2();
t2.setName("a");
System.out.println(t2.getName());
}
}

lliiqiang 2012-01-12
  • 打赏
  • 举报
回复
是通过公共方法访问的呀,访问的是公共方法,不是属性
飞跃颠峰 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 computerlibin 的回复:]

这样是有点明白了,但是假如我的get方法返回的是private属性的一个引用,对于这个get方法返回一个引用,我不就可以任意修改了吗?这样是不是和你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾了,举个例子:
假如getName()返回的不是String类型而是我定义Name类型,那么以下操作是不是可以任意访问private属性了?
Name n=new Test1().getN……
[/Quote]

对于原始数据类型以及String类型,通过get()方法拿到私有属性也没法修改
对于String类型之外的对象类型属性,确实可以通过你说的方法进行修改。也就是说private的保护不是万能的,它只能提供一定程度的保护。
qichao88888 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alexandertech 的回复:]

引用 2 楼 computerlibin 的回复:

又是你,呵呵,那Test2具有name属性吗?引用 1 楼 alexandertech 的回复:

私有成员不能直接访问
setName()和getName()这不算直接访问


Test2有name属性,当然,它是私有的。
即使是私有属性,也只是不能被别的类访问而已,自己还是可以的。
所以在Test2类中,仍然可以直接访……
[/Quote]
Test2类中是没有name属性的,Test2继承Test1,你在new一个Test2实例的同时会同时new一个Test1,所以,你访问的还是Test1中的name属性,private属性是不会被继承的。
朝花夕拾 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 alexandertech 的回复:]

哦抱歉,说错了一点,protected才可被子类直接访问
[/Quote]

你复活了?
飞跃颠峰 2012-01-11
  • 打赏
  • 举报
回复
哦抱歉,说错了一点,protected才可被子类直接访问
飞跃颠峰 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 computerlibin 的回复:]

又是你,呵呵,那Test2具有name属性吗?引用 1 楼 alexandertech 的回复:

私有成员不能直接访问
setName()和getName()这不算直接访问
[/Quote]

Test2有name属性,当然,它是私有的。
即使是私有属性,也只是不能被别的类访问而已,自己还是可以的。
所以在Test2类中,仍然可以直接访问name
加载更多回复(20)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧