/*
疑问1:类的封装过程中关于私有变量的this引用问题?
在构造函数中:this代表当前正在创建的对象;在普通函数中:this代表当前正在调用该方法的对象。this可看成是对象。
在构造函数中this.name = name 中成员变量name是private,怎么可以用对象名去访问私有成员?
在普通函数中String strinf =this.name + ":" + this.age; 其中的name和age都是私有变量,怎么可以
用调用GetInfor()方法的对象名去访问私有变量? 疑问2:类继承过程中,普通函数的调用问题?
类的继承过程中,子类也继承了父类的非静态普通成员函数,在父类Human和子类Student中都有GetInfor()方法,
创建对象st1后,调用st1.GetInfor(),是调用Human中的GetInfor(),还是调用Student中的GetInfor()?
*/
class Human
{
private String name;
private int age;

public Human()
{

}
public Human(String name, int age)
{
this.name = name;
this.age = age;
}
public String GetInfor()
{
String strinf =this.name + ":" + this.age;
return strinf;
}}class Student extends Human
{
private String school;

public Student()
{

}
public Student(String name, int age, String school)
{
//this.name = name;//error 私有成员不能继承
//this.age = age;//error 私有成员不能继承
super(name, age);
this.school = school;
}
public String GetInfor()
{
//String strinf = name + ":"+ age + ":" + school;//error 子类不能继承父类的私有成员
String strinf =super.GetInfor() + ":" + this.school;//用super调用父类的普通方法
return strinf;
}
}
class TestSuper_2
{
public static void main(String[] args)
{
Student st1 =  new Student("张三", 12, "北大");
System.out.printf("%s\n", st1.GetInfor());
}
}

解决方案 »

  1.   

    回答第二个问题:
    Student st1 =  new Student("张三", 12, "北大"); st1是Student的引用,当然调用Student的GetInfor()
    如果 Human st1 =  new Student("张三", 12, "北大");  那st1就调用Human的GetInfor()
      

  2.   

    第一个问题尝试回答一下。
    public Student(String name, int age, String school)
    {
    //this.name = name;//error 私有成员不能继承
    //this.age = age;//error 私有成员不能继承
    super(name, age);
    }
    这时候的this指向的是Student对象,当然无权方位Human内部的name和age了。
    只有Human内部的this才是指向Human对象的,也就是可以访问name和age了。
      

  3.   

    问题1:要构造中this.name = name 其中“=”前面的是成员变量,“=”后面的是形参变量,也是局部变量。相互的访问权根看看这个:
    https://blog.csdn.net/qq_33418887/article/details/80508173
      

  4.   

    问题2终于弄明白了: Student 类继承了父类 Human类,当然也继承了父类GetInfor()的方法,但在子类中进行了重写(子类中重新定义了父类中已有的函数),这时候 Student 类中仅有重写后的一个函数,而不包括父类的GetInfor()函数,所以Student类对象调用的是重写后的函数。
      

  5.   


    1.this 表示当前对象,这里的当前对象都是该类的实例,类实例当然可以调用本类的私有成员。
    2.重写后的方法,都是指向子类的方法,父类方法被隐藏不可见。
      

  6.   

    顶6楼,问题1  私有变量能在本类的代码块中调用
    GetInfor() 定义在类human中,调用方法的对象也是human的实例,所以可以直接访问私有
    在举个例子,在human类中追加一个方法
    class  Human{
      ...........
        public void show_private_name(Human one_human){
           System.out.println(one_human.name); // 依然可以访问one_human 的私有name
           Human another_human = new Human("张三",12);
           System.out.println(another_human.name); // 打印张三, 可以访问私有
           System.out.println(this.name); // 打印调用此方法的human的name
        }
    }