抽象类相关的规定

1.抽象类只是比普通类多了一些抽象方法的定义而已,所以在抽象类之中依然允许提供有构造方法,并且子类也会遵守子类对象的实例化流程。实例化子类对象钱一定要先去调用父类的构造方法

范例:

记住主类中的抽象方法只是声明 要在继承类中实现该抽象方法的具体内容

abstract class Person{
	public  Person() {
		System.out.println("****************");
		
	}
	public  abstract String getInfo();//抽象方法
}
class Student extends Person{
public Student() {
	System.out.println("###############");
}
public String getInfo() {
	return null; 
}
} 
public class TestDemo {

	public static void main(String[] args) {
	new Student();

	}

}*******************
###################  

如果说现在父类中没有无参构造,那么子类就必须通过super()指明要调用的父类构造方法

abstract class Person{
	private String name;
	private int age;
	public  Person(String name,int age){
		this.name=name;
		this.age=age;		
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
		
	}
	public  abstract String getInfo();//抽象方法
}
class Student extends Person{
private String school;

public Student(String name,int age,String school) {
	super(name,age);//子类构造必须明确的调用父类构造
	this.school=school;
}
public String getInfo() {
	return "【Student】name="+super.getName()+"  age="+super.getAge()+"  school="+this.school; 
}
} 
public class TestDemo {

	public static void main(String[] args) {
	Person per=new Student("张三",19,"北大") ;
	System.out.println(per.getInfo());

	}

}

其实抽象类中存在有构造方法也很好理解,毕竟抽象类中还有属性 

所有的属性要在对象实例化的时候进行空间的开辟 

对象实例化必须要使用构造方法。(所以抽象类必须有构造)


额外话题:关于对象实例化

   对象实例化操作需要以下几个核心步骤

       ·进行类的加载

       ·进行类对象的空间开辟

       ·进行类对象中的属性初始化(构造方法) 

构造方法如果还没执行的话,所有的属性都是其对应数据类型的默认值

abstract class A{
	public A() {//3 调用父类构造方法
		this.print();//4 调用被子类覆写过的方法
	}
	public abstract void print();//抽象方法
}
class B extends A{
	private int num=100;
	public B(int num) {//2.调用子类实例化对象
		super();//3.隐含一行语句,实际要想调用父类构造
		//但是此时此类构造没执行 但是所有的内存空间会开辟但是没有值 num的值等于0	
		this.num=num;// 7 为类中的属性初始化 
	}
	public void print() {//5此时子类对象的属性还没有被初始化
		System.out.println(this.num);//6、内容其对应数据内容的默认值
	}
}
public class TestDemo {

	public static void main(String[] args) {
		new B(30);//1实例化子类对象	

	}

}


二。抽下类中允许不定义任何的抽象方法,但是此时抽象类对象依然无法进行直接实例化处理。

abstract class A{
	public void print() {
		
	}
}
public class TestDemo {
	public static void main(String[] args) {
		A a=new A();//错误,A是抽象的,无法实例化
	}
}

三。抽象类一定不能够使用final进行声明,因为使用final定义的类必须有子类,而抽象类必须有子类

        ·抽象方法不能够使用private进行定义,因为抽象方法必须被覆写;(private就封装了)

四。(抽象类能不能用static定义呢?)

抽象类也分为内部抽象类和外部抽象类,内部抽象类中可以使用static定义,描述为外部抽象类。

范例:观察内部抽象类

abstract class A{//此类结构出现的机率很低
	public abstract void printA();
	abstract class B{
		public abstract void printB();
	}
}
class X extends A{
	public void printA() {}
	class Y extends B{
		public void printB() {
			
		}}}
public class TestDemo {
	public static void main(String[] args) {
	
	}
}

而如果现在外部抽象类上使用了static,那么就是语法错误,可内部抽象类上允许使用static

 abstract class A{//此类结构出现的机率很低
	public abstract void printA();
	static abstract class B{//现在表示外部抽象类
		public abstract void printB();
	}
}
class X extends A.B{
	public void printB() {}

	}
public class TestDemo {
	public static void main(String[] args) {
	
	}
}

从一般的设计角度来讲,以上的问题很多时候并不会出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值