&引用;这";在java中不是指当前对象';s成员。但是,与其说它';s取决于访问点。为什么?

&引用;这";在java中不是指当前对象';s成员。但是,与其说它';s取决于访问点。为什么?,java,Java,我有三个简单的类(BaseClass和ExtendedClass:从第一个扩展而来。TestBaseExtendedClass用于测试这些类) 根据我的理解,“this”应该访问对象实例,在其中运行代码及其成员变量。 但在接下来的案例中,这种情况似乎没有发生 基类有一个私有成员“age”。 ExtendedClass(扩展基类)有一个公共成员“age” BaseClass有一个私有方法totalAge(),它使用当前对象的“年龄”来计算组的总年龄 方法,始终使用基类的“age”值,而不是实例。

我有三个简单的类(BaseClass和ExtendedClass:从第一个扩展而来。TestBaseExtendedClass用于测试这些类)

根据我的理解,“this”应该访问对象实例,在其中运行代码及其成员变量。 但在接下来的案例中,这种情况似乎没有发生

基类有一个私有成员“age”。 ExtendedClass(扩展基类)有一个公共成员“age”

BaseClass有一个私有方法totalAge(),它使用当前对象的“年龄”来计算组的总年龄

方法,始终使用基类的“age”值,而不是实例。 例如,当我创建了一个'ExtendedClass'指令,并且代码通过基类的totalAge()方法流动时,'this.age'选择 来自“BaseClass”对象的值,即使它是“ExtendedClass”的实例

为什么会这样?还是我做错了什么

这是三节课

基类

public class BaseClass{
    public int members ;
    public String name ;
    private int age ;

    public BaseClass(int numMembs, String groupName){
      members = numMembs ;
      name = groupName ;
      if(members < 10) age = 60 ;
      else age = 25 ;
    }

    public String getName(){
       return name ;
    }


    public void printDetails(){
       System.out.println("Group Name : "+name+" Total Members: "+members+
                                       " Total Age: "+totalAge()+"\n") ; 
    }

    private int totalAge(){
       System.out.println("This object is an instance of Class: "+ this.getClass().getName()+"\n") ;
       return (this.age) * members  ;
   }
}
public class ExtendedClass extends BaseClass{

    public String groupLocation ; //extra member in the extended class
    public int age ; 

    public ExtendedClass(int numMembs, 
                     String groupName,
                     int age)
    {
        super(numMembs, groupName) ;
        this.age = age ; 
    }

    @Override
    public void printDetails(){
        System.out.println("Average age of the group: "+age+"\n") ;
        super.printDetails() ; //access the public method of the parent class
    }

    //Added a new method, which is not there in the parent class
    public int avgAgeOfGroup(){
        return age ;
    }
}
public class TestBaseExtendedClasses {
    public static void main(String[] args){
        ExtendedClass extObj = new ExtendedClass(5,"Oldies", 65) ;
        BaseClass parntObj = new BaseClass(15,"YoungTurks") ;

        //Access base class methods using the extended class
        System.out.println("Group name of extObj is : "+ extObj.getName() ) ;

        //Access the overriden method in the extended class
        extObj.printDetails() ;

        //print details of parntObj
        parntObj.printDetails() ;
    }
}
TestBaseExtendedClasses

public class BaseClass{
    public int members ;
    public String name ;
    private int age ;

    public BaseClass(int numMembs, String groupName){
      members = numMembs ;
      name = groupName ;
      if(members < 10) age = 60 ;
      else age = 25 ;
    }

    public String getName(){
       return name ;
    }


    public void printDetails(){
       System.out.println("Group Name : "+name+" Total Members: "+members+
                                       " Total Age: "+totalAge()+"\n") ; 
    }

    private int totalAge(){
       System.out.println("This object is an instance of Class: "+ this.getClass().getName()+"\n") ;
       return (this.age) * members  ;
   }
}
public class ExtendedClass extends BaseClass{

    public String groupLocation ; //extra member in the extended class
    public int age ; 

    public ExtendedClass(int numMembs, 
                     String groupName,
                     int age)
    {
        super(numMembs, groupName) ;
        this.age = age ; 
    }

    @Override
    public void printDetails(){
        System.out.println("Average age of the group: "+age+"\n") ;
        super.printDetails() ; //access the public method of the parent class
    }

    //Added a new method, which is not there in the parent class
    public int avgAgeOfGroup(){
        return age ;
    }
}
public class TestBaseExtendedClasses {
    public static void main(String[] args){
        ExtendedClass extObj = new ExtendedClass(5,"Oldies", 65) ;
        BaseClass parntObj = new BaseClass(15,"YoungTurks") ;

        //Access base class methods using the extended class
        System.out.println("Group name of extObj is : "+ extObj.getName() ) ;

        //Access the overriden method in the extended class
        extObj.printDetails() ;

        //print details of parntObj
        parntObj.printDetails() ;
    }
}
这是我运行代码时得到的输出

>java TestBaseExtendedClasses

public class BaseClass{
    public int members ;
    public String name ;
    private int age ;

    public BaseClass(int numMembs, String groupName){
      members = numMembs ;
      name = groupName ;
      if(members < 10) age = 60 ;
      else age = 25 ;
    }

    public String getName(){
       return name ;
    }


    public void printDetails(){
       System.out.println("Group Name : "+name+" Total Members: "+members+
                                       " Total Age: "+totalAge()+"\n") ; 
    }

    private int totalAge(){
       System.out.println("This object is an instance of Class: "+ this.getClass().getName()+"\n") ;
       return (this.age) * members  ;
   }
}
public class ExtendedClass extends BaseClass{

    public String groupLocation ; //extra member in the extended class
    public int age ; 

    public ExtendedClass(int numMembs, 
                     String groupName,
                     int age)
    {
        super(numMembs, groupName) ;
        this.age = age ; 
    }

    @Override
    public void printDetails(){
        System.out.println("Average age of the group: "+age+"\n") ;
        super.printDetails() ; //access the public method of the parent class
    }

    //Added a new method, which is not there in the parent class
    public int avgAgeOfGroup(){
        return age ;
    }
}
public class TestBaseExtendedClasses {
    public static void main(String[] args){
        ExtendedClass extObj = new ExtendedClass(5,"Oldies", 65) ;
        BaseClass parntObj = new BaseClass(15,"YoungTurks") ;

        //Access base class methods using the extended class
        System.out.println("Group name of extObj is : "+ extObj.getName() ) ;

        //Access the overriden method in the extended class
        extObj.printDetails() ;

        //print details of parntObj
        parntObj.printDetails() ;
    }
}
extObj的组名为:Oldies 该群体的平均年龄:65岁

此对象是类ExtendedClass的实例

组名:老年人成员总数:5总年龄:300

此对象是类:BaseClass的实例

组名:YoungTurks成员总数:15总年龄:375



请注意,“老年人”组的总年龄计算使用了60岁,而不是65岁。为什么基类使用值60而不是65(this.age应该指EXTEBJ中的“age”)

在您的例子中,
ExtendedClass
中的
printDetails
方法打印出一些文本,然后委托给父类

当您创建
ExtendedClass
的实例时,它还会按预期初始化
BaseClass
,包括设置
age
字段

回到
ExtendedClass
printDetails
,在将调用委托给父类之后,调用再次委托给
totalAge
方法,该方法使用它知道的
age
实例(在
BaseClass
中声明的私有实例)


简而言之,您需要遵循@Mark Rotterveel的建议,避免仅仅通过提供同名变量来隐藏和玩弄变量。

您通过在子类中重新定义字段来隐藏字段。.基类中的printDetails()方法被调用,最终调用totalAge(),因为totalAge()在BaeClass中并返回(this.age*members),它使用基类的age。因此是60。我同意你和马克·罗特维尔的观点,我在玩隐藏场的游戏。但是,“this”关键字不是应该得到它自己实例的成员变量吗?而不是查看范围中最近的匹配变量。
totalAge
方法位于
基类
中。从
基类
的角度来看,这是唯一存在的
年龄