JAVA抽象类的this一个问题
比方说这个代码publicabstractclassAnimal{privateintage;publicAnimal(){}publicAnimal(intage){t...
比方说这个代码
public abstract class Animal {
private int age;
public Animal(){
}
public Animal(int age){
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
听老师讲:在抽象类中不可以使用this关键字,原因是由于该类为抽象类,既然是抽象类就不可以获取该类的实例对象.
那么为什么setName方法里面可以用this? 展开
public abstract class Animal {
private int age;
public Animal(){
}
public Animal(int age){
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
听老师讲:在抽象类中不可以使用this关键字,原因是由于该类为抽象类,既然是抽象类就不可以获取该类的实例对象.
那么为什么setName方法里面可以用this? 展开
6个回答
展开全部
抽象类中照样可以用this。this就是当前对象,当前对象既然已经实例化了,它当然不会直接是此抽象类(类A)的实例,而是一个继承这个抽象类的类(类B)的实例。这个实例里有一部分是由类A刻画的,有一部分是由类B刻画的,无论类B是什么,这个实例由类A刻画的那部分里总是有age这个属性的,this.age就是指这个实例里的age属性。
“抽象类就不可以获取该类的实例对象”这话其实是错的,抽象类固然不能有直接的实例,但是完全可能有实例就是这个抽象类型的。
“抽象类就不可以获取该类的实例对象”这话其实是错的,抽象类固然不能有直接的实例,但是完全可能有实例就是这个抽象类型的。
展开全部
抽象类可以有是可以有构造方法的但是意义不大,抽象类也可以有实现的属性和方法。
在一个类中有抽象方法,那么这个类一定是抽象类 所以this可以出现在抽象类中
在一个类中有抽象方法,那么这个类一定是抽象类 所以this可以出现在抽象类中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
抽象类不能用this是因为抽象类不能被实例化,所以没有当前的对象即this。而setName中得this是给其属性赋值,是它本身的一种机制
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
抽象类与普通类不同之处在于其有抽象方法
至于别的方法,和普通类一样。
在上面的代码中:只有 public abstract void eat();是抽象方法。
至少本类中的别的方法和普通类一样,所以this仍然有效。
准确的说:抽象方法是不会用到this关键字,因为它的方法是不在当前实现,所以没写实现代码怎么会用到,但抽象类中非抽象方法和普能类一样可以使用。
至于别的方法,和普通类一样。
在上面的代码中:只有 public abstract void eat();是抽象方法。
至少本类中的别的方法和普通类一样,所以this仍然有效。
准确的说:抽象方法是不会用到this关键字,因为它的方法是不在当前实现,所以没写实现代码怎么会用到,但抽象类中非抽象方法和普能类一样可以使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你老师瞎掰。。。。
谁说抽象类里面不能用this关键字?小伙子啊,你老师把你给害了。。。
谁说抽象类里面不能用this关键字?小伙子啊,你老师把你给害了。。。
追问
这个是老师说的“在抽象类中可以包含静态变量和静态方法,在此类中还可以使用抽象类名调用静态变量,在抽象类中不可以使用this关键字,原因是由于该类为抽象类,既然是抽象类就不可以获取该类的实例对象.”
求大神指点
追答
我这样给你说吧:
抽象类和接口在使用上类似,都是不能直接实例化的类,但可以实例化抽象类的非抽象子类。
抽象类的非抽象子类实例化后,实际上也是抽象类的实例,所以抽象类里面的this实际代表的也是抽象类自己,当然也是实例它的子类对象。
也就是说,抽象类虽然不能直接实例化,但是我们通过实例化它的非抽象子类就可以说是实例化了抽象类。我给你举一个例子:
public abstract class Par{};
public class Sub extends Par{};
上面定义了一个父类抽象类Par,和抽象类的子类Sub,
我可以这样来解释我说的是不是正确的:
Sub instance1=new Sub();//没有问题,自己实例化赋值给自己
Par instance2=new Sub();//没有问题,实例化子类赋值给父类对象
Object instance3=new Sub();//同样么有问题,因为Object是任何类的父类,简称超类。
但你要明白的是,抽象类里面的this,在运行时期实质上指向的是子类的内存地址!
再给你补充点:
我上面说的子类抽象类的非抽象子类的实例就相当于抽象类的实例,我证明给你看:
boolean isSuperInstance=instance1 instanceof Par;
isSuperInstance结果为true,结果很显然了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询