接口和抽象类
1.1抽象类
1 package day9.com; 2 /* 3 * 4 * 抽象类: 5 * 子类可以帮助我们实现,我用子类即可 6 * 1、不能直接实例化,规范/规定。 不抽象也可以多态 7 * 2、利用子类实例,子类实例代替父类。用抽象类,用的是它的子类。 8 * 3、抽象类中可以有抽象方法,也可以没有抽象方法。 9 * 4、不能有私有的抽象方法。私有的方法子类继承不了,要用子类的方法 10 * 5、如果一个类中有抽象方法,必须是抽象类。 11 * 12 * 一个类实现多样时,让不同的人完成不同实现,就可以考虑抽象类。 13 * 1、类的生命周期(应有功能) 14 * 1、初始化 15 * 最后,你不会有人帮你实现。 16 * 17 * */ 18 import java.util.Date; 19 import java.util.Scanner; 20 import javax.servlet.Servlet;//接口 21 import javax.servlet.GenericServlet;//抽象类 22 23 24 public abstract class MyAbstract { 25 MyAbstract(){ 26 //抽象类可以有构造方法。 27 //并且必须有,且权限不能是私有,否则无法实例化(必须通过子类实例化,使用子类的实例化对象, 28 // 子类实例化对象的重写方法。) 29 } 30 public static void main(String[] args){ 31 Date myDate = new Date(); 32 System.out.println(myDate.getTime()); 33 System.out.println("ok"); 34 35 36 //1、写了一个匿名类继承抽象类。匿名类必须实现抽象类,使用的是匿名类 37 //内部匿名类,不是匿名对象 38 //不是完全代表实例化,效率低。 39 //编译时产生 MyAbstract$1.class 40 //抽象类,接口是架构师,项目经理弄的 41 //要求、 42 // 43 // MyAbstract myAbstract = new MyAbstract() { 44 // 45 // @Override 46 // public void connect() { 47 // 48 // } 49 // }; 50 51 52 //想实现数据库连接 53 54 } 55 //抽象方法:只有声明方法,没有方法体(方法实现),这个方法必须是公开的,不能是private私有的 56 // private abstract void connect();//抽象方法不能是私有的,权限文体。 57 58 public abstract void connect(); 59 //注意区别空实现。 60 61 public abstract int save(); 62 63 //可以放一些实用方法,子类继承后可以使用。也可通过实例化的类使用。 64 65 public Object getHelp(){ 66 System.out.println("这个方法可以帮助子类..."); 67 return new String(); 68 } 69 70 //静态方法,直接通过类名使用,不需要实例化 71 public static Object get(){ 72 System.out.println("这个方法可以...,不需要实例化就能使用"); 73 return new String(); 74 } 75 }
1.2抽象类的实现类
1 package day9.com; 2 3 //抽象类的实现类 4 //以后就用子类代方法替父类抽象方法 5 6 //张三精通mysql数据库连接,mysql保存,恰好需要,张三就继承了,然后实现了抽象方法。 7 8 import java.util.Random; 9 10 public class MyComplete extends MyAbstract { 11 12 13 /** 14 * 此方法用于连接数据库 15 */ 16 //连接数据库的具体操作 17 @Override 18 public void connect() { 19 System.out.println("连接mysql数据库"); 20 } 21 /** 22 * 此方法保存数据到mysql数据库中,如果返回 1代表保存成功,返回0保存失败 23 */ 24 @Override 25 public int save() { 26 Random rand = new Random(); 27 return rand.nextBoolean() ? 1 :0; 28 } 29 }
1.3测试类
1 package day9; 2 3 4 //抽象类: 5 6 7 import day9.com.MyAbstract; 8 import day9.com.MyComplete; 9 10 public class TestAbstract { 11 // 12 public static void main(String[] args) { 13 MyAbstract myAbstract = new MyComplete(); 14 myAbstract.connect(); 15 } 16 } 17 //总结: 18 //1、没有实例化的抽象类,抽象类不能实例化 19 //1、为了使用/可以不用(作用是规范子类),只能实例化子类。 20 //2、抽象方法只需声明,无需实现,没有方法体。 21 //3、抽象类不一定要包含抽象方法可以有其它方法,而定义抽象方法的类必须是抽象类 22 //1、类有的抽象类都有,类没有的抽象类也有 23 //2、接口也有抽象方法。 24 //4、抽象类包含的抽象方法必须在其子类中被实现,否则该子类也必须是抽象类。 25 //1、抽象方法不能是私有的, 26 //2、抽象类是规范,或者是规范的规范。 27 //5、抽象类必须有构造方法供子类实例化对象 28 //1、这是每个父类需要遵守的, 29 //2、但是由于抽象类不能被实例化,所以若它想被调用,他的构造方法不能是私有的。 30 31 //抽象类的作用是, 32 //1、类有多种实现。一个类定义多种多样,不唯一。 33 //用子类就是用的一个实现类。 34 //2、让别人去实现,制定规范。并不是一个人完成的,只是制定一个规范。 35 //让实现类拥有必要的重写方法,这样就能用实现类。 36 37 38 //补充 39 //1、匿名类实现。编译后产生一个.class文件
2.1接口
1 package day9.org; 2 //定义接口 3 //接口定义 interface关键字 4 //接口继承, 5 // 1、可以继承多个接口,效果是合成一套。实现时灵活度不高 6 // 2、接口继承关键字extends 7 8 @FunctionalInterface 9 public interface MyInteface extends B,C{ 10 // public static final int age = 18; 11 //属性必须在声明时初始化 12 //接口中不允许初始化设定 13 //接口没有构造方法 14 //接口没有静态代码块--只能初始化静态属性 15 //规定public static final;全局静态常量成员属性 16 17 byte FIELD = 7; 18 19 // public static final method(); 20 //方法不允许被final修饰 21 //方法默认类型是public abstract 类型,方法中全部是全局,静态,抽象的。 22 //规定,不写也是public abstract。 我就是一套规范。比抽象类更狠。 23 //不能有方法体。 24 /** 25 * method方法功能描述 26 * */ 27 public abstract void method(); 28 //总结: 29 // 1、接口中只有全局,静态,常量,成员属性和全局抽象方法。 30 31 //怎么用, 32 // 1、使用接口实现类。接口起到规范作用。和抽象类一样。 33 // 2、函数式接口---只有一个抽象方法的接口默认为函数式接口, 34 //关键字@FunctionalInterface -- 帮助我们看是否只有一个抽象方法。 35 //函数式接口可以使用一些关键字。 36 37 //所有的实现类,init() destroy方法都一样,减少代码长度,所以接口实现了通用的方法 38 //实现的方法就不是抽象方法,一个接口有多个方法也可以是函数式接口。 39 //需要实现接口子类,通过接口子类使用 40 41 default void init(){ 42 System.out.println("初始化成功"); 43 } 44 //静态方法可以通过接口名调用。 45 46 static void destroy(){ 47 System.out.println("对象销毁成功"); 48 } 49 } 50 51 interface B{} 52 53 interface C{} 54 55 //java1.8 对接口新的调整 56 //1.接口如果有且只有一个抽象方法,此接口自动编译为函数式接口 57 //1.可以使用lambda表达式,作为参数直接添加,不能写实现类。 58 //2新增了实现方法((1)默认实现方法(2)静态实现方法)
2.2接口实现类
非抽象类为实现类
1 package day9.org; 2 3 //接口实现类是非抽象类 4 5 public class InterfaceImpl implements MyInteface{ 6 7 //实现类必须重写接口的抽象方法 8 //抽象类也可以继承接口 9 /** 10 * method的注解 11 * */ 12 @Override 13 public void method() { 14 System.out.println("实现类实现了method方法"); 15 } 16 }
抽象类为实现类
1 package day9.org; 2 3 //接口的实现类是抽象类 4 //接口的规范可以是规范的规范。 5 6 public abstract class InterfaceImpl2 implements MyInteface{ 7 8 }
2.3测试类
1 package day9; 2 3 import day9.org.InterfaceImpl; 4 import day9.org.MyInteface; 5 6 public class TestInterface { 7 public static void main(String[] args){ 8 MyInteface myInteface = new InterfaceImpl(); 9 //使用实现类方法, 10 myInteface.method(); 11 //使用接口的静态方法 12 MyInteface.destroy(); 13 //通过实例化类使用接口的实现方法 14 myInteface.init(); 15 16 //lambda表达式函数式接口 17 //返回值为空可以写一个{} 18 MyInteface inter = ()-> { 19 System.out.println("lambda表达式实例化接口"); 20 System.out.println("此实例化对象的method方法已经被重写,就是用的这个方法"); 21 }; 22 //使用method()方法 23 inter.method(); 24 25 } 26 } 27 28 //接口类似国家的宪法, 29 //各种法律不能违反宪法,不按照宪法 30 31 //接口和抽象类的总结 32 //1、只是制定,没有执行
补充
接口是功能(飞,走)和常量(public static final )的集合
类和子类是 is 的关系
接口和实现类是 has || like a的关系
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步