一.抽象

1.何为抽象类?

  • abstract关键字所修饰的类就是个抽象类。
  • 有抽象方法的类就是抽象类。

2.何为抽象方法?

  • 没有方法体的方法就是抽象方法。

抽象方法没有方法体。

实例一:

abstract class Person {
	public abstract void eat(); //无方法体。
}

3.抽象类的特点?

1.抽象类和抽象方法都要由abstract关键字来修饰。

实例二:

public class abstract01 {
	public static void main()
	{
		Cat01 c = new Cat01();
		Amal a = new Cat01();
	}
}


abstract class Amal
{
	//建立抽象方法
	int i = 3;
	static int j = 1;
	final int d = 0;
	abstract public void eat();
}

class Cat01 extends Amal
{
	//重写抽象方法
	public void eat()
	{
		System.out.println("吃菜");
	}
}

2.抽象类可以没有抽象方法,但是有抽象方法的类一定是抽象类。

实例三:

abstract class Person {
    //成员方法体
	public void eat() {}
	public void sleep() {}
	//抽象方法
	public abstract void drink();
}

3.抽象类不能创建对象。
4.一个类想要继承一个抽象类,要么该类也是一个抽象类,要么该类是一个普通类,但是必须重写所有的抽象方法(参见实例二)。

4.抽象类的成员特点?

1.成员变量:

可以有静态的成员变量。
可以有非静态的成员变量。
可以自定义常量。
参见实例二

2.成员方法:

可以有抽象方法。
可以有非抽象方法。
参见实例三。

5.abstract关键字和不能哪些关键字共存?

1.abstract不能和private关键字共存:

因为被abstract关键字修饰的方法是抽象方法,子类是一定要重写的,如果该方法同时又被private修饰的话,子类还重写不了,所以冲突.

2.abstract不能和static关键字共存:

因为被static关键字所修饰的方法可以通过类名直接调用,但是同时被abstract关键字修饰的方法,没有方法体的,故无法修饰。

3.abstract不能和final关键字共存:

因为被abstract关键字修饰的方法是抽象方法,子类是一定要重写的,如果该方法同时又被final修饰的话,子类还重写不了,所以冲突。

实例四:

abstract class Fu {
	private abstract void print();//报错
	public abstract static void print();//报错
	public final abstract void print();//报错
}

class Zi extends Fu {
	public void print() {}
}

二.接口

1.何为接口?

比抽象类更加抽象的表现形式,就是接口。

2.格式?

interface 接口名 {}

3.使用格式?

interface Inter {}	
class Zi implements Inter {}

4.接口的特点?

1.接口不能创建对象。
2.一个类想要实现一个接口,要么该类是一个抽象类,要么该类是一个普通类,就必须重写接口中的所有的抽象方法。

5.接口的成员特点?

  • 成员变量:

接口中的所有的变量全部都是自定义常量。
默认修饰符:public static final。

public static final int i = 1;
static final int j = 1;
int x = 1;
  • 成员方法:

在老版本中接口中的所有的方法必须是抽象方法。
在新版本中接口中的所有的方法可以不是是抽象方法。
默认修饰符:public abstract。

public abstract void aaa();
abstract void bbb();
//仅限于新版本
public void ccc();
void ddd();
  • 构造方法:

接口中没有构造方法。

6.接口与接口,类与类,接口与类之间的关系?

1.类与类:继承关系,单继承,不可以多继承,也可以实现其他的接口。

class Fu {
	public void eat() {
		System.out.println("吃肉");
	}
}

class Zi extends Fu {}

2.类与接口:实现关系,支持单实现,也可以多实现。

interface Inter {}

interface Inter1 {}

class Zi implements Inter, Inter1 {}

3.接口与接口:继承关系,支持单继承,也可以多继承。

interface A {
public abstract void eat();
}
interface B {}

//接口与接口继承。
interface C extends A, B {}
//实现接口。
class Zi implements C {
	public void eat() 
	{}
}

7.我们什么时候使用接口,什么时候使用类(包含抽象类)?

当两个类之间存在"is a",就要定义类,两个类之间是继承关系。
接口是额外扩展的功能,本身该类不具备这个功能,而且还不是"is a"的关系,就需要去实现这样的接口了。

实例五:

package interface1;

public class interface03 {
	public static void main(String[] args)
	{
		Dog01 d = new Dog01();
		d.drink();
		d.eat();
		d.play();
		d.swmming();
	}

}

//父类的抽象函数
abstract class Aminal
{
	public abstract void eat(); //吃的东西不一样,定义抽象函数。
	public void drink()
	{
		System.out.println("喝水"); //共有的特性
	}
}
//接口

interface Swim
{
	public void swmming();
}

interface Aircar
{
	public void fiy();
}
//子类的继承函数
class Dog01 extends Aminal implements Swim
{
	//特有的功能
	public void play()  
	{
		System.out.println("玩球");
	}
	//继承的抽象函数
	@Override
	public void eat() {
		System.out.println("狗粮");
	}
	//以下实现的是接口
	@Override
	public void swmming() {
		System.out.println("仰泳");
	}
}

class Cat04 extends Aminal
{
	//特有的功能
	public void sleep()
	{
		System.out.println("睡觉");
	}
	//继承的抽象函数
	@Override
	public void eat() {
		System.out.println("猫粮");
	}
}

class Big01 extends Aminal implements Swim,Aircar //单继承多实现
{
	//特有的功能
	public void gong()
	{
		System.out.println("拱白菜");
	}
	//继承的抽象函数
	@Override
	public void eat() {
		System.out.println("猪食");
	}
	//以下实现的是接口
	@Override
	public void fiy() {
		System.out.println("横着飞");
	}

	@Override
	public void swmming() {
		System.out.println("自由泳");
	}
}

三.结束语:

本文讲解的抽象、接口已经讲完啦,欢迎小伙伴们前来指正呦。