抽象类:
/** * 抽象类,对类的抽象描述,包括属性、方法的抽象描述 * @author 尘世间迷茫的小书童 * */ public abstract class MyAbstract { /** * 抽象类属性想要被子类继承,修饰符不能为private */ public String name; public String sex; public int age; /** * 抽象类里的抽象方法必须实现, * 如果不实现可以将继承抽象类的子类声明为抽象类 */ public abstract void testDo(); /** * 父类的方法可以选择性的重写 * @param name */ public void testDo(String name) { System.out.println("hello world " + name); } public void testDo(String name, int age) { System.out.println("name: " + name + " age: " + age); } public MyAbstract() {} }
/** * 子类通过extend继承抽象类 * 子类只可以继承一个父类 * @author 尘世间迷茫的小书童 * */ public class NewAbstract extends MyAbstract { /** * 抽象类的抽象方法必须实现或者声明集成类为抽象类 */ @Override public void testDo() { System.out.println("hello java's world"); } /** * 非抽象方法,可以根据业务选择重写父类的方法 */ @Override public void testDo(String name) { // 调用父类的方法 super.testDo(name); //自己实现 System.out.println(name + "欢迎来到这个操蛋的世界!"); } public NewAbstract() { super(); } }
经好友王**提醒原来abstract还可以修饰方法,即抽象方法,实在是惭愧,立即做了修改;
接口:
/** * interface是对method的抽象描述, * interface解决 父类/抽象类 单继承问题 * interface可以解耦合 * @author 尘世间迷茫的小书童 * */ public interface MyInterface { /** * interface里的变量修饰符 public static final,变量不可修改 * 默认是 public static final */ String name = "小米"; public static final String sex = "男"; public static final int age = 23; /** * method对行为方法的抽象,不需要方法体 * @return */ public String testDo(); /** * jdk1.8以后interface可以有方法体,需要加default关键字 * @param param */ public default void testDo(String param) { System.out.println("hello world " + param); } }
/** * 实现类通过implements实现接口的所有方法 * @author 尘世间迷茫的小书童 * */ public class NewInterface implements MyInterface { /** * 子类必须实现接口里的所有方法, * 如果不想实现可以生命子类为interface */ @Override public String testDo() { return "my name is " + this.name; } }
抽象类和接口的区别:
属性:抽象类里的属性不是常量可以被修改,接口里的属性必须是常量,一旦赋值不能被修改;
方法:接口里的方法必须被实现,不想实现可以声明子类为接口;
抽象类里的抽象方法必须被实现,不想实现抽象方法可以声明子类为抽象类;
抽象类里的非抽象方法可以根据业务选择性的重写;
继承/实现:一个子类只可以继承一个抽象类或父类;
一个子类可以实现多个接口,且接口可以解耦和;
为什么接口可以解耦合?