我写了两个类,第一个类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?不是说子类不能继承父类的私有成员吗?
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?不是说子类不能继承父类的私有成员吗?
setName()和getName()这不算直接访问
Test2有name属性,当然,它是私有的。
即使是私有属性,也只是不能被别的类访问而已,自己还是可以的。
所以在Test2类中,仍然可以直接访问name
能不能解释详细些,谢谢啦
test2是没有name属性的,但是可以通过set get 访问,,这就是封装。
父类不给子类直接访问的权限,但提供了间接访问的方法。
你是访问的那个public方法,然后那个方法访问自己的private变量。
public class Test2 extends Test1 {
@Override
public void setName(String name) {
super.setName(name);
} @Override
public String getName() {
return super.getName();
} public static void main(String args[]){
Test2 t2=new Test2();
t2.setName("a");
System.out.println(t2.getName());
}
}
可以这样
public class Test2 extends 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("a");
System.out.println(t2.getName());
}
}
在类的继承中,子类确实不能直接访问父类,直接访问就是 对象名.属性,这样的访问方式就是直接访问类中的属性
楼主可以这么想,就是不管你父类设置了什么权限我都拿过来了
只是你private的话,我就没有你的钥匙,打不开而已。
假如getName()返回的不是String类型而是我定义Name类型,那么以下操作是不是可以任意访问private属性了?
Name n=new Test1().getName();
n.firstName="我改了你的姓氏";
n.lastName="我改了你的名字";
这样是不是与你说的“令别的类只能通过本类提供的有限方法访问私有属性”矛盾
实际上中内存块中的子类对象包含了父类的对象,继承实际上就可以看做是给子类添加了一个父类类型的属性:super。
private的作用在于,限制被它修饰的属性:只能中本类中调用。
但不是说不能被间接调用。
比如说下面的:
Name n=new Test1().getName();
n.firstName="我改了你的姓氏";
n.lastName="我改了你的名字";
在Test1中应该是定义了 private Name name;
这里的private只能限制name的属性只能中本类中直接调用。其他类无法对其直接修改(new Test1().name=?),但是可以间接修改。
总得来说,private 只能限制调用,而不能限制值的改变。
final 才是用来限制值不能修改的。
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的名称改了吗
}
}
对于原始数据类型以及String类型,通过get()方法拿到私有属性也没法修改
对于String类型之外的对象类型属性,确实可以通过你说的方法进行修改。也就是说private的保护不是万能的,它只能提供一定程度的保护。
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());
}
}
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。