在B站跟尚硅谷学习Java课程之抽象类

抽象类的概念

定义

定义:随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更加一般,更通用。类得设计应该保证父类和子类能够共享特征。有时候将父类设计的非常抽象,以至于没有设计具体的实例。

所修饰的类型

关键字abstract(抽象)

抽象类

抽象类:用关键字abstract来修饰一个类时,这个类就叫做抽象类
abstract :抽象的,可以用来修饰类和方法。
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍未抽象类。
代码展示
——父类`
abstract class Person{

String name;

public abstract void eat();

public abstract void walk();
}`

——子类
class Student extends Person {

@Override
public void eat() {
	System.out.println("student is eating.");

}

@Override
public void walk() {
	System.out.println("student is walking.");

}

抽象类有构造方法,类需要有被实例化的过程

public Person() {
	System.out.println("无参构造");// 无参构造
}

public Person(String name) {
this.name = name;// 有参构造
}

抽象方法

抽象方法:用关键字abstract修饰的一个方法时,该方法叫做抽象方法
抽象类中可以没有抽象方法。

abstract class A{
	public void B() {
		System.out.println("这里是非抽象方法!");
	}
}

注意:1)抽象方法:只是方法的声明,没有方法的实现。以分号结束。如:public abstract void eat();或者abstract void eat();
2)含抽象方法的类必须被声明为抽象类。
3)abstract 不能用来修饰属性、构造器、private、 final、static。这几种注释的代码都报错

class A {
//	private abstract int id;
	//因为构造器不能被重写
//		public abstract A() {
//			
//		}
	//子类不能覆盖(重写)声明为private的方法的。
//	private abstract void method();
	
//	public abstract final void method();
	
//	public abstract static void method();
}

抽象类的应用

概念

抽象类是用来模型化那些分类无法确定全部实现,而是有其子类提供具体实现的对象的类。

例题讲解

例题:
在航空公司系统中,有Vehicle类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。卡车(Truck)和驳船(RiverBarge)的燃料效率和行驶距离的计算方法完全不同。Vehicle类不能提供计算方法,但子类可以。
解决方案的代码参考

package Demo10;

public abstract class Vehicle {
	public abstract double calcFueIEffciency();// 计算燃料效率的抽象方法

	public abstract double calcTripDistance();// 计算行驶距离的抽象方法

}

class Truck extends Vehicle {

	@Override
	public double calcFueIEffciency() {
		// 写出计算卡车的燃料效率的具体方法
		return 0;
	}

	@Override
	public double calcTripDistance() {
		// 写出计算卡车行驶距离的具体方法
		return 0;
	}

}

class RiverBarge extends Vehicle {
	@Override
	public double calcFueIEffciency() {
		// 写出计算驳船的燃料效率的具体方法
		return 0;
	}

	@Override
	public double calcTripDistance() {
		// 写出计算驳船行驶距离的具体方法
		return 0;
	}

}

注意:抽象类不能实例化,new Vehicle()是非法的

模板方法设计模式

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,大子类总体上会保留抽象类的行为方式.
解决的问题:
1)当功能内部一部分实现是确定,一部分实现是不确定的。这是可以把不确定的部分暴露出来,让子类去实现。
代码理解

abstract class Template {
	// 不确定的实现
	abstract void code();

	// 确定的实现
	public void spendTime() {
		long start = System.currentTimeMillis();

		code();

		long end = System.currentTimeMillis();
		System.out.println("花费的时间为:" + (end + start));
	}
}

2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。
代码理解

class Student extends Person {

	@Override
	public void eat() {
		System.out.println("student is eating.");

	}

	@Override
	public void walk() {
		System.out.println("student is walking.");

	}

	@Override
	void bearth() {
		System.out.println("student isn't pollution air.");
		
	}

}

抽象类的总结

1.抽象方法

  • abstract :抽象的,可以用来修饰类,方法
  • 1.abstract修饰类,抽象类
  • 1)不可被实例化
  • 2)有构造器并且可以被定义(凡是类都有构造器)
  • 3)抽象方法所在的类,此类一定是抽象类。
  • 4)抽象类中可以没有抽象方法。

2.抽象方法

2.abstract修饰方法,抽象方法

  • 1)格式,没有具体的方法体,包括{} 如:public abstract void eat();
  • 2)抽象方法只能保留方法的工作,具体的行为功能,交给了有继承关系的子类,有子类重写此抽象方法。
  • 3)若子类继承抽象类,并重写了所有的抽象方法,则此类时候一个“实例化”,即可以实例化
  • 4)若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象类!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值