标题: 问个关于继承的小白问题 [打印本页] 作者: 莫嘉伟 时间: 2013-3-1 21:50 标题: 问个关于继承的小白问题 子类能获得父类的private属性吗,经我自已试验好像是不行,private属性对子类也是不可见的,不过不知是我眼贱还是脑子进水我总觉得好像不知在哪本书上看过子类也能获得父类的private属性,求个大神把这事说明白让我安心。作者: 罗威 时间: 2013-3-1 22:22
哥们 为了回答你这个问题,我去查了下oracle官网
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
其他的都不懂,不过官网有这么一句话:A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.
我英语不太好,不能准确的翻译,大概意思是:一个子类不继承父类的私有成员,然而,如果父类有提供公共的,或者受保护的方法,那么子类可以利用这些方法访问私有属性了! 作者: 莫嘉伟 时间: 2013-3-1 22:37
public修饰的就先不说了,protect修饰的也可以被同一个包和子类访问,我的问题其实是我现在有个父类,他有几个属性我想让他只能通过指定的方法获取和修改,保护数据嘛,然后这个父类有一个子类,这个子类继承了父类,可他却没有父类的部份属性·这让我感到有点违和,其实我也想过干脆咱就在那子类那定义几个一样的属性算了,不过这做法好像不是很好,完全体现不出继承这个特点,我也试过在子类那新建一个父类对象,用父类对象获取的属性作为子类的属性,可是这样一来我不就相当于在子类里又搞了个属性嘛,好像还是没体现出继承,不过它的类型是父类而已···我就这感觉。作者: 谢洋 时间: 2013-3-1 23:45
子类对象在初化的过程中:
1、首先是执行父的构造函数(生成父类的一个对象),且这个父类对象属于子类对象的一部分;
2、然后再执行自身的构造函数。也就是说生成一个子类对象的同时成生成了一个类父对象;
3、因为父类的私有成员对子类不可见,这样也可以说成子类没有继承父类的私有成员,但它的确是在存的
4、子类在复父类员成时,其实子类父的成员还是同时存在的,只是子类在执行同名成时,是执行子类的那一份而已,
测试代码:
package test2;
public class FuZiTest {
public static void main(String[] args) {
Zi zi = new Zi();
//自始终我们只建立了一个子类对象
//通过子类对象获取父类中的私有成员
System.out.println(zi.getFuA1());//fua1父类的私有员,
//通过子类对象获取父类中的非私有成员
System.out.println(zi.getFuA2());//fua2父类的同名成员a2
System.out.println(zi.getZiA2());//Zia2子类的同名成员a2
System.out.println(zi.a3);//父类的a3被继承了,内存中应该只
zi.setA3();
//证明当子父没有复盖的成员是同一份a3
System.out.println(zi.a3);//zia3
System.out.println(zi.getFuA3());//zia3
//结论:产生子类对象过程中会有一个父类对象产生;
//复盖不是真正的发生,只是在继成过种产生了跟复盖一样效果
}
}
class Fu {
private String a1 = "fua1";
String a2 = "fua2";
String a3 = "funa3";
public String getA1() {
return a1;
}
public String getA2() {
return a2;
}
}
class Zi extends Fu{
String a2 = "Zia2";
//获取父类那个a1
public String getFuA1() {
return super.getA1();
}
//获取 子类那个a1
public String getZiA2() {
return a2;
}
//获取父类那个a2
public String getFuA2() {
return super.getA2();
}
//获取父类那个a3
public String getFuA3() {
return super.a3;
}
//设置子类的那个看不见的a3
public void setA3(){
a3="zia3";
}
}
作者: 莫嘉伟 时间: 2013-3-1 23:48
谢谢类上的哥们~作者: 明锦添 时间: 2013-3-4 22:37
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。 作者: HM刘博 时间: 2013-3-4 22:53
class Person {
private String name;
private int age;
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class Student extends Person {
private String school;
public void setSchool(String school)
{
this.school = school;
}
public String getSchool()
{
return school;
}
}
public class TestPerson
{
public static void main(String[] args)
{
Student student = new Student();
student.setName("John");//子类继承父类的方法
student.setAge(18);
student.setSchool("SCH");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());
}
}
(1) 子类是不能访问父类中private的属性和方法的,但子类能访问父类的public的属性和方法,因为student这个类继承父类Person,而父类Person里的setName()是public的,所以子类能访问setName()这个方法,setName()这个方法又是在父类Person里的,在同一个类里的方法当然可以访问这个类的属性,总的来说:就是子类student通过setName()来间接访问父类Person的私有属性
(2) 子类虽然不能访问父类的私有变量,但是子类继承了父类的变量和方法,Student类实际上有3个变量,分别是name age school,有6个方法,分别是父类的4个和自己的两个,实际上你在main方法是给自己的private变量name age school 赋值,所以你在get时取到的是自己的private 变量值 而不是父类private变量的值 一般是把父类的属性设置为private的,然后提供一个public的方法可以获得该属性,这样父类就可以实现封装,子类可以继承父类属性和方法作者: 王洪宇 时间: 2013-3-15 21:25
获得了,这个属性在子类的堆内存中是存在的,只不过不可见。但你可以使用公共方法来设置或修改它。