Java中的抽象类和接口以及内部接口

一,抽象类:

用abstract修饰的类称为抽象类;抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类或者接口;抽象类的子类要么是抽象类,要么实现所有父类的抽象方法;

抽象类的成员方法的特点:抽象方法表示的是强制要求子类做的事;非抽象方法表示的是子类继承的事,提高了代码的复用性;

一个抽象类没有抽象方法的目的是:不让其他类创建本类多项,让其子类完成创建对象;

二,接口:

是比抽象类更为抽象的”类”,类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements;接口打破了类的单继承的局限性;

定义格式:interface  接口名{ }

成员变量:只能是常量并且是静态的公共的,final关键字可以不加;默认修饰符:public static final

构造方法:接口中没有构造方法

成员方法:Java 1.8之前只能是抽象方法(之后可以有静态实例方法,默认的实例方法  待认证);默认修饰符 public abstract

类与类,类与接口,接口与接口之间的关系:

类与类:是继承关系,只能单继承,可以多层继承。

类与接口:是实现关系,可以单实现也可以多实现;

接口与接口:是继承关系,可以单继承,也可以多继承;例如 interface A extends B,C

抽象类和接口的区别

抽象类:

成员变量:可以是变量,也可以是常量;

构造方法:有

成员方法:可以是抽象的,也可以是非抽象的;

接口:

成员变量:只能是常量

成员方法:只能是抽象方法

设计理念的区别

抽象类:被继承实现的是:“is a”的关系(继承关系   是一个);抽象类中定义的是该继承系统的共性功能。即父类和派生子类在概念上的本质是相同的(父子关系,血缘联系,很亲密)。例如:玻璃杯、塑料杯都是杯子。

接口:被实现的是:“like a”的关系;接口中定义的是实现体系中扩展功能(组合关系   一个);即接口与实现类的关系只是实现了定义的行为,并无本质上的联系(契约关系,很淡漠的利益关系)。例如:空调继承于制冷机,但它同时有加热功能,那么你应该把让空调继承制冷机类,并实现加热接口。

说到is-a和like-a 不得不说 has-a

has-a 表示的一种从属关系(聚合关系   一个)例如:汽车由发动机,底盘,车身,电气设备等组成,那么应该把发动机,底盘这些类聚合成汽车。

类单继承相当于亲爹(亲爹是单继承),接口多实现相当于干爹(干爹多实现);

总结:设计理念的区别从如何选择使用抽象类或者接口的角度阐述的;

三,内部接口

定义类或者接口内部的接口称为内部接口;所以内部接口有两种:一,是定义在类内部的接口;二,是定义在接口内部的接口;

默认情况下,内部接口是静态的,不管是否加了static关键字。

 3.1,类中的接口

案例:

public class Demo{
	public static void main(String[] args) {
		OuterClass oc = new OuterClass();
		oc.test(new Inter() {
			public void test(String s) {
				// TODO Auto-generated method stub
				System.out.println(s);
			}
		});
	}
}

class OuterClass {
	public interface Inter{
		void test(String s);
	}
	
	public void test(Inter i){
		String s = "内部类中定义的接口";
		i.test(s);
	}	
}

3.2,接口中定义的接口

案例:

public class Demo2 implements OuterInter.InnerInter {
	public static void main(String[] args) {
		
	}

	public void test() {
		// TODO Auto-generated method stub
		
	}	
}

interface OuterInter{//外部接口
	//接口中嵌套的内部接口
	interface InnerInter{
		void test();
	}
	
	void outMethod();
}

class OuterInterImp implements OuterInter{
	
	class InnerInterImp implements OuterInter.InnerInter{
		public void test() {
			// TODO Auto-generated method stub
			
		}
	}

	public void outMethod() {
		// TODO Auto-generated method stub
		
	}
}

也就是嵌套接口,例如Map接口中的Entry接口;

public interface Map<K, V> {
    //省略其他代码...

    public interface Entry<K, V> {
        K getKey();

        V getValue();

        V setValue(V var1);

        boolean equals(@RecentlyNullable Object var1);

        int hashCode();

        static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey() {
            throw new RuntimeException("Stub!");
        }

        static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
            throw new RuntimeException("Stub!");
        }

        static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(@RecentlyNonNull Comparator<? super K> cmp) {
            throw new RuntimeException("Stub!");
        }

        static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(@RecentlyNonNull Comparator<? super V> cmp) {
            throw new RuntimeException("Stub!");
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ang_qq_252390816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值