Loading

JAVA_SE基础——43.抽象类

高手勿喷~

抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方法中无法准确描述动物的叫声。


针对上面的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰,格式如下:

abstract void shout();   //定义抽象方法shout()


abstract表示抽象的,是最重要的一个修饰符,可以修饰类和方法。它们分别叫抽象方法抽象类,人们在认识事物的时候,会把具有相同特征和行为的事物归为一个抽象类。。  比如动物就是一个很抽线的概念。当得到动物的实例时,总是某个具体物种的实例。所以说,在需要某个抽象类的实例时,只能够用某个具体类的实例来代替。


抽象类的应用场景:
我们在描述一类事物的时候,发现该种事物确实存在着某种行为,
但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是
不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。

抽象类的好处: 强制要求子类一定要实现指定的方法。


抽象类要注意的细节:
1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。
2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。
3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
5. 抽象类可以不存在抽象方法的。 
6. 抽象类是不能创建对象的。
疑问:为什么抽象类不能创建对象呢?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
调用抽象方法是没有任何意义的。
7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。


abstract不能与以下关键字共同修饰一个方法:
1. abstract不能与private共同修饰一个方法。
2. abstract 不能与static共同修饰一个方法。
3. abstract 不能与final共同修饰一个方法。



白话解释:说到明就是不具体的总类写成抽象类就可以了,例如有个动物园,里面有着各种各样的动物,有狗,有猫等等,,,你能让它们叫吗?它们的叫声一样吗?怎么具体让什么动物叫?


这时,就应该想到abstract关键字,用来定义抽象类。。见实例1

实例1

//定义抽象类Zoo
abstract Zoo{
	//定义抽象方法shout()
	abstract void shout();
}


P.S.

在定义抽象类的时候要注意,包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含任何抽象方法,只需使用abstract关键字即可。。  最值得注意的是:抽象类不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法时没有方法体的,不可以被调用。如果真的想调用抽象类定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。     见实例2


实例2

//定义抽象类Zoo
abstract class Zoo{
	//定义抽象方法shout()
	abstract void shout();
}
//定义Dog类继承抽象类Zoo
class Dog extends Zoo{
	String name = "狗" ; 
	//实现抽象方法shout()
	public void shout(){
		System.out.println(name+"的叫声:汪汪汪~~~");
	}
}
//定义Cat类继承抽象类Zoo
class Cat extends Zoo{
	String name = "猫" ; 
	//实现抽象方法shout()
	public void shout(){
		System.out.println(name+"的叫声:喵喵喵~~~");
	}
}
//定义测试类
class Demo1 
{
	public static void main(String[] args) 
	{
		System.out.println("welcome to Zoo");
	 	//创建Dog类的实例对象
		Dog dog = new Dog();
		//调用dog对象的shout()方法
		dog.shout();
		//创建Cat类的实例对象
		Cat cat = new Cat();
		//调用cat对象的shout()方法
		cat.shout();
	}
}
运行结果:


 


从运行结果可以看出,子类实现了父类的抽线方法后,可以正常进行实例化,并通过实例化对象调用方法。。


交流学习企鹅:654249738



posted @ 2015-10-12 20:22  脚本叔叔  阅读(145)  评论(0编辑  收藏  举报