JAVA抽象类的this一个问题

Python018

JAVA抽象类的this一个问题,第1张

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

“抽象类就不可以获取该类的实例对象”这话其实是错的,抽象类固然不能有直接的实例,但是完全可能有实例就是这个抽象类型的。

你应该找本书仔细研究一下类的多态性.

看你提出的问题你说多态你学的差不多,我看差远了....

上面的例子我不给你讲了,我按我自己理解多态的方式按你的例子给你说一下...

一个程序在内存中有四个区..栈...堆...全局数据区...全局代码区....

在这里全局代码区里放着方法名....

因为C继承B,B继承A.所以

new C()的时候要先new B(),还要先new A()

new A()后,全局代码区先划出一块,,这里有:printMe()

new B()后,有getA()和printMe(),但后一个方法把构造A时方法覆盖了.举例子:父类A的printMe()是内衣,子类B的printMe()是外衣..正常情况下你只能看到外衣,看不到内衣的...但是super可以看到,你先别管,要不你好乱了,你只要记住.不用super的时候..你永远是只能看到外衣,看不到内衣的.

同理.

new C()后,里面还是有getA()和printMe(),但这里,getA()是父类,属于内衣,因为它没有外衣进行覆盖,所以还能看到..printMe()就是C的方法了.因为C时就给它加上外衣了..

所以你明白了.无论你声明哪一级的变量(A,B,C),只要是new C()的话..就只能输出"this is C "(先别想super)

this呢?它就指向new C()的这一块全局代码区.....

b=this.在这个问题上..你说B的构造方法不应该属于类C ......对吧...

this就是new C()时生成的全局代码区...这里会没有B的构造吗?构造方法不是方法吗?我在上面没写而已.其实它也在那里面.

this就是指向了使用本this的方法的对象所在的全局代码区...

多读几遍....这句话.

含有抽象方法的类就只能是抽象类

抽象类结构:absract class 类名{  }

抽象方法结构:(public) absract void 方法名();

抽象类只能用来继承,抽象方法必须被重写

抽象类不能实例化,也就是不能用new调用

抽象类可以有:抽象类、普通属性和方法、构造方法(不能用new实例,只能用来被子类调用)

public abstract class Human {//抽象父类

private final int time=++count//对象计数器

private static int count//静态池

//属性封装

private String name//封装三步:隐藏属性,提供getter与setter方法,构造中调用setter初始化

private int age

private String sex

//getter&&setter

public String getName(){

return this.name

}

public void setName(String name){

//处理代码:姓名不能为空,且不能包含数字

if(name.length()==0){

System.out.println("姓名不能为空")

}

else if(this.isWrongName(name)){//调用私有方法处理

System.out.println("非法姓名,不能包含数字")

}

else{

this.name=name

}

}

private boolean isWrongName(String name){//判断非法姓名输入(私有)

char[] ch=name.toCharArray()

for(int i=0i<ch.lengthi++){

try{

int s=Integer.parseInt(String.valueOf(ch[i]))

s++//废

return true

}

catch(Exception e){

continue//出错就继续下一次循环转换

}

}

return false//先返回错误

}

public int getAge(){

return this.age

}

public void setAge(int age){

if(age<=0){

System.out.println("年龄有误")

}

else{

this.age=age

}

}

public String getSex(){

return this.sex

}

public void setSex(String sex){

if(sex.length()>1||sex.length()==0){

System.out.println("性别设定错误")

}

else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){

this.sex=sex

}

else{

System.out.println("性别设定错误")

}

}

//构造

public Human(){//无参

this("无1名氏",25,"男")

}

public Human(String name,int age,String sex){//全参

this.setName(name)

this.setAge(age)

this.setSex(sex)

}

//抽象方法

public abstract void speak()//说话

public abstract void work()//工作

public abstract void eat()

//获取对象创建数目

public int getHumanClassUseTimes(){

return this.time

}

}