一、抽象类

 

1. 为什么定义抽象类?

当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。

 

2. 抽象类的实现方式

 

使用abstract表明该类为抽象类

 

描述:定义Dog类,定义Bird类,定义其父类Animal,抽取共性颜色属性和叫的方法

 

实现代码如下:

abstract class Animal {
    String color;
    abstract void shout();
}

class Dog extends Animal {
	void shout() {
		System.out.println("旺旺");
	}
}

class Bird extends Animal {
	void shout() {
		System.out.println("叽叽喳喳");
	}
}



3. 抽象类的特点

(1)有抽象函数的类,该类一定是抽象类;

(2)抽象类中不一定要有抽象函数;

(3)抽象类不能使用new创建对象,原因是创建对象在使用对象的功能时候,抽象类的方法没有方法体;

(4)抽象类主要是为了提高代码的复用性,让子类继承来使用;

(5)编译器强制子类实现抽象类父类的未实现的方法,但如果子类也声明为抽象类就可以不实现;

 

4. 抽象类疑问解答:

(1)抽象类不能创建对象,那么抽象类中是否有构造函数?

抽象类中一定有构造函数。主要为了初始化抽象类中的属性,通常由子类实现。

(2)Final和abstract是否可以同时修饰一个类?

一定不能同时修饰。

 

5. 抽象类练习

 

描述:

(1)定义抽象类MyShape(图形),定义抽象方法获取图形的长度和面积;

(2)定义子类Rect继承父类MyShape,定义自身特有的长和宽,实现父类未实现的函数;

(3)定义子类Circle继承父类MyShape,定义自身特有的半径和圆周率,实现父类未实现的函数;

 

代码如下:

abstract class MyShape {
	abstract double getLen();
	abstract double getArea();
}

class Rect extends MyShape {
	double width;
	double height;

	Rect() {

	}

	Rect(double width, double height) {
		this.width = width;
		this.height = height;
	}

	double getLen() {
		return 2 * (width + height);
	}

	double getArea() {
		return width * height;
	}
}

class Circle extends MyShape {
	double r;
	public static final double PI = 3.14;

	Circle() {

	}

	Circle(double r) {
		this.r = r;
	}

	double getLen() {
		return 2 * PI * r;
	}

	double getArea() {
		return PI * r * r;
	}
}

class Main {
	public static void main(String[] args) {
		Rect r = new Rect(5, 5);
		System.out.println(r.getLen());
		System.out.println(r.getArea());
		System.out.println();

		Circle c = new Circle(5);
		System.out.println(c.getLen());
		System.out.println(c.getArea());

	}
}



6. 抽象类总结

(1)抽象类可以没有抽象方法;

(2)抽象类可以继承普通类与抽象类;

(3)抽象类不能直接使用类名创建实例,但是又构造方法,构造方法是让子类进行初始化;

(4)抽象类一定有构造方法;

(5)Abstract与其他修饰符的关系:

①final与abstract不能共存,final的作用是修饰类代表不可以继承,修饰方法不可重写,abstract修饰类就是用来被继承的,修饰方法就是用来被重写的;

②static与abstract不能共存,static修饰的方法可以用类名调用,而对于abstract修饰的方法没有具体的方法实现,所以不能直接调用;

③private与abstract不能共存,private修饰的只能在本类中使用,而abstract方法是用来被子类进行重写的,互相矛盾;

 

二、接口

 

1. 接口出现的原因(Java只能单继承),如图

java开发项目功能清单模板 java功能类_java开发项目功能清单模板

接口:主要是用来拓展定义类的功能,可以弥补Java中单继承的缺点;

 

2. 接口的定义格式:

interface 接口名{
    属性
    抽象方法
}

注意:

(1)接口中的所有属性默认的修饰符是  public static final;

(2)接口中的所有方法默认的修饰符是  public abstract;

(3)类实现接口可以通过implements实现;

 

3. 接口的特点:

(1)类实现接口的时候必须把接口中的所有方法实现,一个类可以实现多个接口;

(2)接口中定义的所有的属性默认是public static final的,即静态常量,定义的时候必须赋值;

(3)接口中定义的方法不能有方法体;

(4)有抽象函数的类不一定是抽象类,也可以是接口类;

(5)由于接口中的方法默认都是抽象的,所以不能被实例化;

(6)对于接口而言,可以使用子类来实现接口中未被实现的功能函数;

(7)如果实现类中要访问接口中的成员,不能使用super关键字,因为两者之间没有继承关系,况且接口中的成员属性是静态的,可以使用接口名直接访问;

(8)接口中没有构造方法;

 

4. 接口与类、接口之间的关系

 

①接口与类之间是实现关系。非抽象类实现接口时,必须把接口里面的所有方法实现。类实现接口用关键之implements,类与接口之间是可以多实现的(即一个类可以实现多个接口)。

interface Eraser {
	public static final String color = "白色";
	public abstract void clean();
}

class Pencil implements Eraser {
	String name;

	Pencil() {
	}

	Pencil(String name) {
		this.name = name;
	}

	void write() {
		System.out.println("写字");
	}

	public void clean() {
		System.out.println("涂改...");
	}
}

②接口与接口之间的关系是继承,接口可以多继承接口

interface A{
	public void show();
}

interface B{
	public void print();
}

interface C extends A,B{
	
}