Java:抽象类

具有抽象函数的类,称之为叫抽象类!

抽象函数

当我们将多个事物的共同行为(函数)进行抽取并封装到另外一个类(父类)中时,发现在父类中,这些方法的具体执行内容无法确定,只能由这些子类来决定该函数的具体执行。那么在父类中,仅保留这些抽取来的函数的函数声明,不保留函数体即可。上述的函数就是抽象函数,用abstract关键字来修饰。
public class Sample { 
	public static void main(String[] args) { 
		Dog d = new Dog(); 
		d.jiao(); 
		d.eat(); 
		Cat c = new Cat(); 
		c.jiao(); 
		c.eat(); 
		Animal a = new Animal(); 
		a.jiao(); a.eat(); 
	} 
}
abstract class Animal { 
	abstract void jiao(); 
	abstract void eat(); 
}
class Dog extends Animal{ 

	@Override 
	
	void jiao() { 
		System.out.println("汪汪汪~"); 
	}
	
	@Override 
	
	void eat() { 
	System.out.println("狗吃粮"); 
	} 
}
class Cat extends Animal{ 

	@Override 
	
	void jiao() { 
		System.out.println("喵喵喵~"); 
	}
	
	@Override 
	
	void eat() { 
		System.out.println("猫吃鱼~"); 
	} 
}
class Pig extends Animal { 
	void gongbaicai(){ 
		System.out.println("猪拱白菜~"); 
	} 
}

上述代码中的Pig虽是Animal的子类,但是并未重写/覆盖/实现Animal中的抽象函数,所以编译报错!
要解决这个问题的只有两种方法:

  • 把Pig声明为抽象类
  • Pig重写这些抽象函数!

抽象类

具有抽象函数的类也被称之为抽象类,也必须用abstract修饰。抽象类不能创建对象,只有其实现子类能够创建对象。

抽象类的特点

  • 抽象类和抽象函数都需要被abstract修饰,抽象方法一定在抽象类中
  • 抽象类不能创建对象,因为如果一旦创建对象,在调用其函数时,函数没有具体执行内容
  • 只有覆盖了抽象类中所有的抽象函数后,子类才可以实例化。否则,该子类还是一个抽象类

抽象类和一般类的异同点

相同点:

  • 它们都是用来描述事物的
  • 它们之中都可以定义属性和行为

不同点:

  • 一般类可以具体的描述是,抽象类描述事物时会有一些不具体的信息
  • 抽象类比一般类可以多定义一个成员:抽象函数
  • 一般类可以创建对象,而抽象类不能创建对象

关于抽象类的几个细节问题

抽象类一定是一个父类吗?
答:是的,因为抽象类本身就是有多个事物进行抽取而来的

抽象类是否有成员变量、成员函数、构造函数呢?
答:有,抽象类与一般类唯一的区别就是抽象类中抽象函数,其他一律相同(抽象类不能创建对象)!

抽象类中是否可以不定义抽象函数?
答:可以的。有抽象函数的类一定是抽象类,抽象类不一定有抽象函数!

抽象关键字abstract不能与哪些其他的关键字共存?
答:

  • final:final修饰类时表示该类不能被继承,修饰函数时表示函数不能被重写;而抽象类本就是父类,并且其中的抽象函数就需要被子类重写。
  • private:private修饰函数表示函数被私有,不能被子类继承;而抽象类中的抽象函数本就是需要被重写才能赋予功能。
  • static:static修饰的函数是属于类的,随着类的加载被加载方法区中,和对象没有关系了,可以直接用类来调用静态成员。而抽象函数若被静态修饰,再被类调用就毫无意义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值