Java中的抽象类、抽象方法、接口

抽象

更具Java的万物皆对象的思想,将事物共有的属性、功能抽取出来。Java中抽象的前提是继承关系,没有了继承,抽象类就失去了灵魂。在继承关系中,子类可以继承父类的成员变量和成员方法,但是每个子类的方法的具体实现可能不一致,(可以通过重写(方法覆盖)父类的方法解决)但是这样父类具体实现某个方法就失去了意义。这里我们仅仅对父类中的方法加以声明,不做方法的具体实现,子类中(必须)具体实现父类所有的“为实现的方法”。来更加符合面向对象的多态。抽象类向上抽取子类的特点,得到所有子类的共性功能,但不给出功能实现,强制子类根据自身差异性具体去重写。

  • 抽象类、抽象方法的定义
	public abstract class <类名称> {
		<成员变量定义>;
		public abstract <返回值> <方法名称>();
	}

抽象方法需要用abstract关键字声明。且当某个类中含有至少一个抽象方法时,该类必须用abstract声明为抽象类。定义抽象类时不能有{},即使{}内没有任何语句。抽象类中可以不含有抽象方法(抽象类中可以含有非抽象方法),但抽象方法必须被抽象类包含。
抽象类中可以含有构造方法。
抽象类不能直接实例化产生对象,要想实例化的前提是实现(方法重写)抽象类中的所有抽象方法
继承抽象类的子类必须先实现该抽象类的所有抽象方法才能实例化,否则,子类仍然是抽象类。
IDEA中通过快捷键Alt+Insert提示直接覆盖抽象类的所有抽象方法。

接口

接口为了定义扩展功能。Java中继承仅支持单继承、支持多层继承,但不支持多继承,为了弥补无法多继承,可以用接口来实现某个类实现多个接口,而提升Java程序功能。接口更加符合Java面向对象中封装、多态的思想。(降低程序耦合度、提高代码复用)
接口的定义是定义扩展空间,那个类想要具备这个额外功能,就可以去实现这个接口,重写接口的扩展功能。

  • 接口定义方式
	public interface <接口名称>{
		public static fianl <成员变量>;
		public abstract <返回值> <方法名>(<方法参数列表>);
	}

接口不同于类,接口不能直接实例化创建对象。接口是以interface关键字定义的。接口中的成员变量默认用public static fina联合修饰,==接口中成员变量的值不能被修改!==成员方法默认用public abstract修饰,接口中的方法必须都是抽象方法。接口可以继承其他接口从而实现添加新的属性和方法。Java中类不能多继承,但接口可以多继承。
然而实际上,Java提供了一种默认方法的方式可以让接口类型中定义已实现的方法(非抽象方法)。
接口中不能有构造方法。
被final修饰的接口中的成员方法意味常量,所以用大写字母命名。
被abstract修饰的方法不能用private修饰。(继承发生矛盾)
被abstract修饰的方法不能用final修饰。(方法不能重写而矛盾)
被abstract修饰的方法不能用static修饰(静态方法不存在继承、重载所以矛盾)

  • 接口中的默认方法
	public interface <接口名称>{
		public static fianl <成员变量>;
		public <返回值> <方法名>(<方法参数列表>);
		public default <返回值> <方法名>(<方法参数列表>) {
			<默认方法方法体中语句>;
		}
	}

Java8中允许接口定义默认方法,默认方法必须使用default修饰,且不能用static和final修饰,默认也只能用public修饰。通过默认方法实现“多继承”。不能直接使用接口中定义的默认方法,需要使用接口实现类来调用默认方法。

  • 接口实现类
	public class <类名称> implements <接口名称>{
		@Override
		public <返回值> <接口中抽象类名称> (<参数列表>) {
			<实现接口的方法体中的语句>;
		}
	}

接口的实现类必须覆盖接口中全部的抽象类和抽象方法,然后可以用该类名new实例化。这里可以调用接口中的成员变量但不能修改(默认final修饰)。
接口中也可以实现父接口引用执行子类对象。(接口的多态形式

	public class <类名称> {
		public static void main(String[] arg) {
			<接口名> <对象名> = new <接口实现类构造方法>();
		}
	}

该对象名可以引用出接口中最终的成员变量,也可以引用实现了接口中抽象方法的方法。若要访问接口实现类中特有的方法(接口实现类中新定义的方法)时,需要向下类型转换。即通过==((<接口实现类>) <对象名>).<接口实现类中新定义的方法>;==的方式调用。(多态形式)

  • instanceof(运算符)关键字
    <接口实现类的对象> instanceof <接口实现类>运算结果为true
    <接口引用指向接口实现类的对象> instanceof <接口类型>运算结果为true
    <接口引用指向接口实现类的对象> instanceof <接口实现类>运算结果为true
public class Demo {
    public static void main(String[] args) {
    	<接口实现类> <对象1> = new <接口实现类的构造方法>();
    	<接口类型> <对象2> = new <接口实现类的构造方法>();
    	System.out.println(<对象1> instanceof <接口实现类>);//true
    	System.out.println(<对象2> instanceof <接口>);//true
    	System.out.println(<对象2> instanceof <接口实现类>);//true    	
    }
}
  • 接口、类之间的关系

接口与接口之间可以实现多继承!
类与类之间只能单继承、多层继承,但不能实现多继承!
类与接口之间可以是继承关系(此时是抽象类继承了接口)、类与接口之间还可以是实现关系(此时类是接口实现类)。

  • 抽象类和接口的区别

抽象类中含有构造方法,接口中没有构造方法
抽象类中既可以有抽象方法(也可以没有)也可以有非抽象方法,而接口中只能有抽象方法
抽象类中成员变量可以用final或者不用final修饰,接口中所有的成员变量都是公共的静态常量(接口中的成员变量只能用public static final联合修饰)
抽象类和接口都不能直接实例化

猜你喜欢

转载自blog.csdn.net/qq_38637725/article/details/83353160
今日推荐