JAVA抽象类的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?

抽象类中照样可以用this。this就是当前对象,当前对象既然已经实例化了,它当然不会直接是此抽象类(类A)的实例,而是一个继承这个抽象类的类(类B)的实例。这个实例里有一部分是由类A刻画的,有一部分是由类B刻画的,无论类B是什么,这个实例由类A刻画的那部分里总是有age这个属性的,this.age就是指这个实例里的age属性。

“抽象类就不可以获取该类的实例对象”这话其实是错的,抽象类固然不能有直接的实例,但是完全可能有实例就是这个抽象类型的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-13
抽象类可以有是可以有构造方法的但是意义不大,抽象类也可以有实现的属性和方法。
在一个类中有抽象方法,那么这个类一定是抽象类 所以this可以出现在抽象类中
第2个回答  2012-09-13
抽象类不能用this是因为抽象类不能被实例化,所以没有当前的对象即this。而setName中得this是给其属性赋值,是它本身的一种机制
第3个回答  2012-09-13
抽象类与普通类不同之处在于其有抽象方法
至于别的方法,和普通类一样。
在上面的代码中:只有 public abstract void eat();是抽象方法。
至少本类中的别的方法和普通类一样,所以this仍然有效。
准确的说:抽象方法是不会用到this关键字,因为它的方法是不在当前实现,所以没写实现代码怎么会用到,但抽象类中非抽象方法和普能类一样可以使用。
第4个回答  推荐于2018-04-23
你老师瞎掰。。。。
谁说抽象类里面不能用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,结果很显然了。

本回答被提问者采纳

在线求解
Java中定义接口的关键字是class( 0)Java中抽象类一定要包含抽象方法(0)在java中try、catch和finally三个语句块都不能单独使用。(0 )java中this代表当前对象实例(1 )Java支持多重继承( 0)java中包能减少名称冲突问题(1 )一个程序里有且只能有一个公共类,它就是主类( 1 )Java类名...

java知识点丨java抽象类的作用是什么?
探讨抽象类在Java中的作用 在Java编程语言中,抽象类扮演着核心角色,为开发者提供了一种灵活的机制来定义共享行为和属性。理解抽象类的关键在于其与普通类和接口的区别。首先,让我们聚焦于抽象类的作用。抽象类允许我们定义一组共有的方法和属性,这些在子类中实现。当多个类拥有共同的行为和属性时,使...

java中抽象类的new问题
这个是可以的,只要在实现的时候实现它的全部抽象方法是可以实现的。他的做法是在new 那个类的时候,实现哪些方法就可以。这样是可以行得通的。

JAVA抽象类、接口继承的疑惑
抽象类b实现接口a,他可能没有完全实现a的方法。b可以有自己的新方法。c类继承接口a,他可以获得a里面所有的抽象方法,常量属性,内部类,枚举等等。d继承b同时实现c,就是吧上面两个情况综合一下,如果b实现a的某方法,那么d中调用的就是b实现的这个,如果b中没实现a的方法,d中也可以访问a的这个...

Java干货 | 什么是抽象类?怎么定义
Java中,抽象类是一种特殊类,其核心特征是不能被实例化,主要用于被其他类继承并实现其抽象方法。抽象方法没有实现,只有定义,必须在子类中提供具体实现。抽象类可以包含非抽象方法和属性,但至少需要有一个抽象方法。抽象类和抽象方法的定义均使用Java的关键字abstract。抽象类有以下特性:不能直接创建...

JAVA中抽象类能不能定义引用?
抽象类是对数据的抽象,是不能实例化创建对象的,所以你这里new一个抽象类的对象就出错了你要重新定义一个类去继承抽象类。一般抽象类中有抽象方法的话,还得对所有的抽象方法都重写,然后去创建新的类才能引用

java继承抽象类和接口问题
1.抽象类,不能实例化,也就是不能new,也就是不能创始对象。你可以这么理解:抽象,就是模糊的概念,相当于人们说的经常说的概念车之类的,为什么叫概念车,是因为只有个大概的模型,很多技术(在java里我们称之为方法)没有实现,所以不能造出车子(java中我们就是不能new啦)。当然只有解决所以...

那位师傅给我讲下java里的抽象类的定义方法
如果你建立了一个只有抽象方法的类,你就定义了一个接口(interface). 为了说明这种情况, php中有interface 和implements关键字. 你可以用interface来代替抽象类, 用implements来代替extends来说明你的类定义或使用一个接口. 例如, 你可以写一个myclass implements myiterface. 这两种方法可以依个人偏爱来...

Java中抽象类中的抽象方法一定要加abstract吗?
抽象类是指可以有抽象方法的类,言外之意就是它可以有不抽象的方法。如果方法不加abstract,那它怎么知道谁是抽象方法谁不是?而接口是抽象类的极端情况,接口不能有不抽象的方法,它的所有方法都要求也默认是抽象的,所以它不需要在方法前加abstract。

java中 抽象类里面可以没有抽象方法吗?为什么
1.抽象类有个特点:无法被创建对象,如果抽象类里面放了很多非抽象方法,可以利用这一点!2.abstract无法和final共存修饰类;但是抽象类里面可以用final与static修饰变量和方法!3.根据上面两个特点:抽象类里面可以放一些不想被修改的方法,也不想被创建对象,又可以直接调用;也无法继承!所以就有了这样的类!(...

相似回答