目录
抽象类
一个类,如果有抽象方法
(没有方法体),则该类必须被限定为抽象类
(abstract);当然,我们也可以创造出一个没有任何抽象方法的抽象类,仅仅是我们不想它产生对象;
抽象类中,依然是有构造器的,只是我们不能创造对象 ;但是,它跟普通类并没有多大区别,比如,抽象类可以有静态方法,我们也可以直接通过类名使用它的静态方法 ;
跟普通类,其实没差,就多了一项:可以用抽象方法 ;
抽象类的域
和方法
的权限;
上文讲了,其实抽象类跟普通类,没差,就多了一项:可以用抽象方法 ;
那么,抽象类的域和方法的权限,基本
就像普通类那样,根本就没啥特别的,没有啥 默认权限
,不像下面的接口那样,总有一些默认的权限,烦的一比 !
唯一需要注意的,就是有的权限不能和 abstract
一起用;
private
因为抽象方法
需要被子类重写,而定义为私有,子类访问不到,将无法重写。static
因为定义为static
可以通过类名直接调用该方法,而抽象方法
连方法体都不存在,更谈不上被调用执行了。final
因为final
修饰的方法只能被继承,不能被覆盖,而抽象方法
必须被覆盖。- 我们发现 ,限定都在
abstract
上,而abstract
只能修饰方法,不能修饰 字段,因此,抽象类域
的权限,完全跟普通类一样;
只要把上面的几点想明白,就不用去死记那些权限 ;
接口
抽象类,是可以部分抽象;那接口就是完全抽象,不允许提供任何方法体 ;
一个类实现了某个接口,是允许向上转型为接口类型的,这样,就可以实现 java
的 多继承
了, 因为,java
里面虽然不能直接多继承,但是可以通过实现多个接口,达到多继承的目的 ;
由于接口,本身就是需要类来实现的;多个类,可以实现同一个接口,因此接口可以看做是类与类之间建立的协议 ;
接口中的域
和方法
的权限;
接口中可以包含域;所有的域都是隐式的被指定为 public、static、final
;
而接口中的方法,默认是 public、abstract
权限的;
并且由于接口中没有方法体,方法都需要类来实现,因此,接口中的方法,不能是 final
权限,因为 final
权限,代表不可以覆盖,而接口中方法,必须覆盖 ;
而接口中东西,都是需要被其他类访问到,因此,不能有 private
;
算了,记住好了 ;
接口本身自己,有两种修饰权限:可以在前面加上 public
,那么就可以跨包访问;如果不加 public
,则为包访问权限 ;
对了,接口中不能有 空白final
;
实现多个接口
实现多个接口的时候,可以向上转型为其中任意一个接口 ,给我们很大的灵活性 ;
实现多接口的时候,当多个接口中有相同方法签名的方法时,实现类只需要 实现一个即可
;
这样有一个小问题,就是实现多个接口的时候,如果有方法的方法签名一样,但是返回值不同;是无法直接区分这样的情况的,需要使用一定的技巧,内部类
来完成这样的操作 ;
接口继承
在接口继承体系中,一样的方法,只看做一个 ;
接口嵌套
类中嵌套接口,把它当做类的成员变量即可,访问权限跟普通成员变量一致 ;
当接口被修饰为
private
的时候,该接口只能在本类中实现,并且实现的类,只能本在类中使用 ;public class Test1 { // 修饰为 private private interface MyTest{ void print(); } // 不能在外部实现该接口 class MyTestImpl implements MyTest{ @Override public void print() { System.out.println("aha !"); } } @Test public void test() { new MyTestImpl().print(); } }
接口与接口之间嵌套
一个类实现的接口, 假如这个接口中嵌套了其他接口,
嵌套的接口
中的方法是不需要实现的 ;public interface BB { public interface AA{ void mmm() ; } void sss(); } ------------------------------------------- class BBimpl implements BB{ @Override public void sss() { System.out.println("ssss"); } }