是否可以以这种方式在java中一起使用this
和super
this.super.a;
...其中a
是任何数据成员。尝试上述代码段会出现unexpected token
错误。
使用点运算符是否还有其他可能的方法来实现this
和super
?
答案 0 :(得分:1)
如果a
被声明为受保护的成员字段,您可以说:
this.a
或者如果你定义了一个getter方法:
this.getA();
答案 1 :(得分:0)
将super
和super
结合使用是没有办法的。当您使用this
时,您已经在super.a
。没有实际的理由这样做。
您可以使用if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")){
activityViewController.popoverPresentationController.sourceView = self.view;
}
答案 2 :(得分:0)
在一个班级中,如果a是父母的受保护或公共成员,则简单地为super.a。
如果要在构造函数/方法中区分类成员a和赋值期间的参数a,则使用this.a
答案 3 :(得分:0)
首先,让我们看一下this
的用法。
我们不首先讨论访问修饰符(public / protected / private)。
class Cat
{
String furColor;
public Cat(){
this("white"); //Using "this" to invoke its own constructor
}
public Cat(String furColor){
this.furColor = furColor; //Using "this" to reference its own class member
}
}
this
是对当前对象的引用。您可以使用this
来引用当前对象中的任何成员。如果您没有将课程扩展到其他课程,则不必担心super
关键字。 [所有类隐式扩展到类对象,但这不是问题]
现在,让我们来看看super
。
class Animal
{
String noise;
}
class Cat extends Animal
{
String furColor;
public Cat(){
this("white"); //Using "this" to invoke its own constructor
}
public Cat(String furColor){
this.furColor = furColor; //Using "this" to reference its own class member
noise = "meow!"; //Set the noise for Cat
}
public void makeNoise(){
System.out.println(noise); //meow!
System.out.println(this.noise); //meow!
System.out.println(super.noise); //meow!
System.out.println(this.super.noise); //Error!
}
}
我们可以在子类的构造函数中调用super
来调用超类的构造函数。 (因为你可能已经知道了,这里没有详细说明。)
System.out.println(noise);
有效,因为noise
是从Animal类继承的。只要它不是超类中的private
,它就会被子类继承。
System.out.println(this.noise);
有效,因为this.
用于引用其自己类中的任何成员。写this.noise
与撰写noise
相同。
System.out.println(super.noise);
有效,因为noise
实际上来自超类 - Animal
。由于它已经继承到Cat类,因此编写super.noise
与编写this.noise
相同。
System.out.println(this.super.noise);
会在编译过程中出错。语法错误。从逻辑上讲,如果你写this.super
,你的意图可能会试图引用你的超类的成员。但由于所有非私有成员都将被继承,因此无需编写this.super.xxx
。只需使用this.xxx
即可。
除非成员在超类中是私有的,否则您可以this.getXXX()
提供超类具有访问者方法。