Java抽象类和接口的个人理解与运用

不同点:
(1)抽象类需要被继承,而且只能单继承;接口需要被实现,而且可以多实现。
(2)抽象类中可以定义抽象方法,也可以定义非抽象方法,子类在继承抽象类后,可以直接使用其中的非抽象方法;接口中只能定义抽象方法,必须由子类去实现。
(3)抽象类的继承,是在定义该体系中的基本共性内容;接口的实现,是在定义体系的额外功能。

1.抽象类

抽象方法必须使用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中无具体实现的方法,所以不能用抽象类创建对象。

下面是关于抽象类值得注意的几点 :
• 抽象方法不能包含在非抽象类中 。 如果抽象父类的子类不能实现所有的抽象方法 ,那么子类也必须定义为抽象的 。 换句话说 , 在抽象类扩展的非抽象子类中 , 必须实现所有的抽象方法 。 还要注意到 , 抽象方法是非静态的 。
• 抽象类是不能使用 new 操作符来初始化的 。 但是 , 仍然可以定义它的构造方法 , 这个构造方法在它的子类的构造方法中调用 。 例如 , CeometricObject 类的构造方法在Circle 类和 Recfange 类中调用 。
包含抽象方法的类必须是抽象的 。 但是 , 可以定义一个不包含抽象方法的抽象类 。在这种情况下 , 不能使用 new 操作符创建该类的实例 。 这种类是用来定义新子类的基类的 。
• 子类可以重写父类的方法并将它定义为抽象的。 这是很少见的 , 但是它在当父类的方法实现在子类中变得无效时是很有用的 。 在这种情况下 , 子类必须定义为抽象的;
• 即使子类的父类是具体的 , 这个子类也可以是抽象的 。 例如 , Object 类是具体的 ,但是它的子类如 GeometricObject 可以是抽象的 。
• 不能使用 new 操作符从一个抽象类创建一个实例 , 但是抽象类可以用作一种数据类
型 。 因此 , 下面的语句创建一个元素是 GeometricObject 类型的数组是正确的 :
GeometricObject [ ] objects = new GeometricObject [ 10 ] ;
然后可以创建一个 GeometricObject 的实例 , 并将它的引用陚值给数组 , 如下所示 :
objects [ 0 ] = new Circle();

【注意1】抽象abstract关键字不可以和哪些关键字共存?
private 不行(子类无法重写)
static 不行(类名调用没有内容)
final 不行(final方法不能被重写)

**个人理解:**抽象类就相当于是一个形式类,一个类的模板,里面的抽象方法就是一些形式方法,运用时需要具体化实例化。可以通过形参和实参来类似化记忆,但是有区别。

public class Demo {
    
    

	public static void main(String[] args) {
    
    
	
	//非抽象类的子类来创建实例对象	
	door D=new door();
	D.open();
	D.close();
		
	//不可以直接用new创建实例,下列写法是错误的
	BigDoor d=new BigDoor();
	
	
	//抽象类作为数据类型定义数组
	BigDoor[] d=new BigDoor[10];
	d[0]=new door();
	d[0].open();
	d[0].close();

	}

}
abstract class BigDoor{
    
    
	public abstract void open();
	public abstract void close();
}
class door extends BigDoor{
    
    
	public void open() {
    
    
		System.out.println("open");
	}
	public void close() {
    
    
		System.out.println("close");
	}
}

2.接口

当一个抽象类中所有的方法都是抽象方法时,我们可以将该抽象类用另一种形式定义和表示,就是接口interface。

接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
注意点:
1.
(1)类与类之间是继承关系,类与接口之间是实现关系。
(2)接口不可以实例化。只能由实现了接口的子类,并重写了接口中所有的抽象方法后,该子类才可以实例化。否则,这个子类就是一个抽象类。
2、怎么使用接口呢?----实现,使用implements关键字
(1)Java中类不支持多继承,但一个类可以实现多个接口。
(2)一个类在继承另一个类的同时,还可以实现多个接口。
说明:
子类在实现接口的方法时,要把方法修饰成public的,因为接口在定义时,方法默认是public,即使没有显式的写出来。

**个人理解:**接口是某种特定的方法,如果需要实现某种所需要的方法,可以通过接口来实现。可以通过接口实现多继承

abstract class Big{
    
    
	public abstract void open();
	public abstract void close();
}

interface action{
    
    
	public void opendoor();
	public void closedoor();
}


class door extends Big{
    
    
	public void open() {
    
    
		System.out.println("open");
	}
	public void close() {
    
    
		System.out.println("close");
	}
}


class good implements action{
    
    
	public void opendoor() {
    
    
		System.out.println("Open doors");
	}
	public void closedoor() {
    
    
		System.out.println("Close doors");
	}
}


class D extends door implements action{
    
    
	public void closedoor() {
    
    
		System.out.println("close door");
	}
	public void opendoor() {
    
    
		System.out.println("open door");
	}
}
public class Demo {
    
    

	public static void main(String[] args) {
    
    
		door d=new door();
		d.close();
		
		//实现接口
		good g=new good();
		g.closedoor();
		g.opendoor();
		
		//抽象类+接口
		D ans=new D();
		ans.close();
		ans.open();
		ans.closedoor();
		ans.opendoor();
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_40924271/article/details/110437026