黑马程序员——抽象类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

 抽象类

当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的行为方式,那么这些方法都有具体的方法体。
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。
抽象方法的定义:通过abstract关键字来修饰的类称为抽象类;

我的总结:
抽象类用private修饰,里面可以有用private修饰的方法(没有方法体),强制子类进行覆写;
可以理解为:具有某些公共方法的一个总结类。

可以定义被abstract修饰的抽象方法
抽象方法只有返回类型和方法签名,没有方法体。
备注:
抽象类可以含有普通方法
抽象类不能创建实例对象(不能new)
需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类
列举常见的几个抽象类:
流的四个基本父类
InputStream,OutputStream,Reader,Writer

我的总结:
抽象类是类的一种特殊情况:据有类的一切特点,但是不能实例化;一般的都得带有抽象方法。
抽象类不可以实例化,有时看到的近似实例化是多态机制的体现,并不是真正的实例化。
Eg:
Socket s = new Socket();
OutputStream os = s.getOutputStream();
左边是OutputStream类型变量的声明,右边是获取抽象类OutputStream的一个实例对象!

package testDemo2;

abstract class Person{
}

class Student extends Person{
}

public class Demo2 {
	public static void main(String[] args) {
		Person p = new Student();//体现的是多态,父类声明实例化子类对象。而不是抽象类实例化
	}
}
abstract方法 
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。
那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
abstract [非private访问修饰符] 返回值类型 方法名称(参数列表);
抽象方法要存放在抽象类中。
抽象方法也可以存在于接口中
Eg:
package reviewDemo;

abstract class Person3{
	abstract void show();
	abstract void inof();
	void turn(){
	}
}


class NewP extends Person3{
	@Override
	void show() {
	}


	@Override
	void inof() {
	}
	//不覆写的话会报错
}


public class Demo15 {
	public static void main(String[] args) {
		//new Person3();报错!因为抽象类不可以实例化
	}
}


抽象类的体现-模板模式
抽象类是多个具体子类抽象出来的父类,具有高层次的抽象性;以该抽象类作为子类的模板可以避免子类设计的随意性;
抽象类的体现主要就是模板模式设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行拓展,但是子类在总体上大致保留抽象类的行为方式;
编写一个抽象父类,该父类提供了多个子类的通用方法,并把一个或多个抽象方法留给子类去实现,这就是模板设计模式;

模板模式应用的简单规则:
1.抽象父类可以只定义需要使用的某些方法,其余留给子类去实现;
2.父类提供的方法只是定义了一个通用算法,其实现必须依赖子类的辅助;

我的总结:
如果父类的方法不想被子类覆写,那么可以在前面加上final关键字修饰。

Eg:
package reviewDemo;
//模板模式

//抽象类中包含很多的抽象方法,子类必须去覆写!
abstract class Method{
	abstract double mul();//返回值类型如果是void的话,下面报错,因为没有返回值,无法引用!
	abstract double divid();
	void show(){
		System.out.println("面积是:"+mul());//周长
		System.out.println("面积是:"+divid());//面积
	}
}


class Square extends Method{
	double d;
	
	public Square(double d) {
		super();
		this.d = d;
	}


	@Override
	double mul() {
		return d * d;
	}


	@Override
	double divid() {
		return 4 * d;
	}
}


class Cirle extends Method{
	double r;
	
	public Cirle(double r) {
		super();
		this.r = r;
	}


	@Override
	double mul() {
		return 2 * 3.14 * r;
	}


	@Override
	double divid() {
		return 3.14 * r * r;
	}
}


public class Demo16 {
	public static void main(String[] args) {
		Square s = new Square(5);
		s.show();
		Cirle c = new Cirle(4);
		c.show();
	}
}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值