“抽象类就不可以获取该类的实例对象”这话其实是错的,抽象类固然不能有直接的实例,但是完全可能有实例就是这个抽象类型的。
你应该找本书仔细研究一下类的多态性.看你提出的问题你说多态你学的差不多,我看差远了....
上面的例子我不给你讲了,我按我自己理解多态的方式按你的例子给你说一下...
一个程序在内存中有四个区..栈...堆...全局数据区...全局代码区....
在这里全局代码区里放着方法名....
因为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
}
}