1、抽象类。
java常规类中,有些方法并不是固定的,而是在不同的情况下有不同的实现的,比如一个人,在公司要工作,在学校要学习,在食堂要吃饭,但是这个人还有相同的地方,比如不论在哪里都要呼吸,看,挺,所有可以把变化的和不变化的分离开。
正常情况下的类如下:
package org; public class Person { public Person action(){ System.out.println("在公司工作"); return this; } public Person look(){ System.out.println("我就看看!"); return this; }; public Person breath(){ System.out.println("我随时在呼吸!"); return this; } public Person listen(){ System.out.println("我很警惕,随时耳听八方!"); return this; } }
但是这里边的action方法可能随着环境的变化做出不一样的动作,所有就可以给抽象出来,变成一个抽象的父类
package org; public abstract class Person { public abstract Person action(); public Person look(){ System.out.println("我就看看!"); return this; }; public Person breath(){ System.out.println("我随时在呼吸!"); return this; } public Person listen(){ System.out.println("我很警惕,随时耳听八方!"); return this; } }
抽象类和接口类似,都不能有实例。例如:
package org; public abstract class TestIfCanBeInstance { } class MyTest{ public static void main(String[] args) { //new TestIfCanBeInstance();‘TestIfCanBeInstance‘ is abstract; cannot be instantiated } }
类中的静态方法没有实现,需要在其子类进行实现。类中有抽象方法,这个类也必须是抽象的。
抽象类的使用方法如下:
1 class Test{ 2 public static void main(String[] args) { 3 new Person(){ 4 @Override 5 public Person action() { 6 System.out.println("我在食堂要吃饭!!!"); 7 return this; 8 } 9 }.action().look().breath().listen(); 10 } 11 }
可以看到,抽象类隐藏了其他方法的实现,也正好符合了java封装的特性。
2、接口
接口就是一个完全抽象的类,本身可以不提供任何实现(当然jdk8以后出现的接口的默认实现),接口规定了实现这个接口的类改有的模型,接口最伟大的是实现了多继承。
接口的声明利用关键字interface,声明如下:
package org; public interface Shape { void area(); void lenght(); }
接口的方法默认是public static的,你并不需要将这个声明加上,如果你想将方法声明为private,Modifier ‘private‘ not allowed here。因为接口里的私有声明没有任何意义。
接口也可以像抽象类一样,引用父类,指向一个实现了这个父类的子类。当我们操作的不是一个具体的方法,而是父类,实现的类之间的解耦和实现的封装化。
java接口可以通过继承进行扩展。
接口中的域默认是public static final的,原来会用接口存储一些我们用的变量,后可以用更强大的枚举类代替。
接口的继承,如果有两个接口的签名方法一样,这对接口的使用没有什么影响。但是如果两个方法名字相同,但是返回值不一样,这就会导致子类的模糊,会发生编译器异常。
原文:https://www.cnblogs.com/viceversa/p/10592710.html