&引用;这";在java中不是指当前对象';s成员。但是,与其说它';s取决于访问点。为什么?
我有三个简单的类(BaseClass和ExtendedClass:从第一个扩展而来。TestBaseExtendedClass用于测试这些类) 根据我的理解,“this”应该访问对象实例,在其中运行代码及其成员变量。 但在接下来的案例中,这种情况似乎没有发生 基类有一个私有成员“age”。 ExtendedClass(扩展基类)有一个公共成员“age” BaseClass有一个私有方法totalAge(),它使用当前对象的“年龄”来计算组的总年龄 方法,始终使用基类的“age”值,而不是实例。 例如,当我创建了一个'ExtendedClass'指令,并且代码通过基类的totalAge()方法流动时,'this.age'选择 来自“BaseClass”对象的值,即使它是“ExtendedClass”的实例 为什么会这样?还是我做错了什么 这是三节课 基类&引用;这";在java中不是指当前对象';s成员。但是,与其说它';s取决于访问点。为什么?,java,Java,我有三个简单的类(BaseClass和ExtendedClass:从第一个扩展而来。TestBaseExtendedClass用于测试这些类) 根据我的理解,“this”应该访问对象实例,在其中运行代码及其成员变量。 但在接下来的案例中,这种情况似乎没有发生 基类有一个私有成员“age”。 ExtendedClass(扩展基类)有一个公共成员“age” BaseClass有一个私有方法totalAge(),它使用当前对象的“年龄”来计算组的总年龄 方法,始终使用基类的“age”值,而不是实例。
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
方法位于基类
中。从基类
的角度来看,这是唯一存在的年龄
。