接口和抽象类

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的关系



 

posted @   liu/564  阅读(24)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示