1.抽象
1.1抽象类的引入
从上面我们希望实现:
①父类方法里面不应该写东西; 父类里面写的都是共有的东西
②父类方法应该要求它的每个子类覆写方法;
–》解决这个使用–》抽象类
场景:我需要设计一个类,我又没想好具体的实现,我只有一个大致的方向
1.2抽象类
-
使用abstract 修饰的类就是抽象类
-
抽象类本质也是一个类
-
类中有的成员抽象类都可以有(字段 方法
构造方法),此外抽象类中还可以有抽象方法
- 抽象类不能够实例化(创建对象) ---- 为什么? Java规定的!
- 抽象类的使用场景: 一般作为父类(基类,模板类),模板方法模式
1.3抽象方法
-
使用abstract 修饰的方法就是抽象方法
-
没有方法主体,使用 ; 结束
-
抽象方法必须存于抽象类中(接口也可以),不能够放在普通类中
-
抽象类的子类中必须覆写父类中的所有的抽象方法,(或者子类也是抽象类)
目的:所以,抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用。定义成抽象类的目的,就是为了在子类中实现抽象类。
2、接口
接口以前已经提到过,比如 引用类型 包括 类 接口
数组,或者抽象方法可以存在抽象类或者接口里面;
提到接口 ,会想到啥?
2.1现实生活中 USB接口
接口是用于做什么的:接口是一个规范,也是一种安全的体现(只让你知道接口类)
-
有线的鼠标和键盘
-
加油站的汽油与柴油,对应汽车的型号
2.2程序(软件开发)中的接口
① 软件与软件之间的数据交互接口
比如卖包子
支持微信和支付宝,本身开发卖包子软件和支付宝没有关系,通过支付宝之后,就可以把钱弄到卖包子的软件系统里面,意味着两个软件之间
存在对接的可能;意思 就是 在开发项目的时候,需要调用微信或者支付宝的接口;
② Java中的接口看成是一种新东西
-
是一个和类非常类似的新结构
-
接口是定义类的标准(规范)
-
声明语法:
interface 接口名{
// 内部可以有哪些成员–参考类
字段 全部都是全局常量(public static final修饰)
方法 全部都是抽象方法(缺省修饰public abstract)
构造方法 没有!
接口中的方法缺省修饰有没有static final?
抽象方法需要子类类覆写才有意义,static final修饰的方法 都不能够被覆写
}
- 一般写在一个独立的Java文件中,编译完毕之后也会生成独立的字节码文件
-------------思考-----------------------------------------------------------
伪代码: Void ShouMoney(买家支付宝账号,卖家支付宝账号,金额,支付密码);
写一个接口用来干嘛? 怎么用呢?
① 从结构上来看,接口中有全局常量和抽象方法
② 全局常量 —》 直接调用
③ 抽象方法 :
没有主体,一般是存于父类级别的结构中,需要子类去拓展,覆写,完成其中的功能
④ 结构来覆写接口中的 抽象方法 —》
可能是写子接口来完成吗?不可能,接口中全部都是抽象方法
2.3实现类-接口类
① 定义一个类来实现(implements)接口(有点像继承的效果)
interface A{}
class B implements A{
1) 必须全部覆写接口中的抽象方法
2) 否则B类也抽象类
}
② A接口类型相当于是B类型的父类(干爹)
代码 : A a1 = new B(); // 多态的写法
a1.eat(); // 多态方法调用
③ 一个类其实可以实现多个接口,需要覆写所有接口中的抽象方法
④ 一个类可以在继承一个类的同时实现多个接口,但是继承的代码必须写实现前面(亲爹亲些,呵呵…)
2.4单继承多实现
① 一个接口可以继承多个接口
interface A{}
interface C{}
interface B extends A,C{}
class Test implements B{
此处需要覆写ABC中的所有的抽象方法
}
A a1 = new Test();
C a2 = new Test();
B a3 = new Test();
小结:①接口的概念与思想
②软件中的接口概念
③接口关键字interface
④接口类与实现类
⑤单继承、多实现
接口中重名默认方法解决方案:优先调用重写方法,其次父类,最后super前面是谁调用谁
接口中重名常量解决方案:接口名.常量名指定调用哪一个;父类的常量和接口中常量重名时,默认不会调用父类的常量,只能在子类中定义自己的常量
2.5接口与抽象的区别
3 内部类(了解)
3.1什么是内部类
内部类:把一个类定义在另外一个类的内部,嵌套类,宿主类。
内部类编译完毕也会生成独立的字节码文件
3.2真实的使用场景
一般来说,类都应该是独立的写在一个自己的Java文件中;
本质效果相当于是一种封装;
示例:
例如有一个手机类,手机卡类存在于同一个项目中,如果说手机卡类的存在仅仅在手机类中有意义(只有手机类的内部会用到手机卡),为了更好的封装,把手机卡类整体移动到手机类中去,其它所有代码都不变。
3.3语法层面验证(实用性不大)
① 内部类编译完毕也会生成独立的字节码文件,外部类名$内部类名.class;
②
从语法上面再外部类的外部来尝试访问内部类以及内部类中的成员如下的效果,但是实际开发中一般都不这样写
静态内部类和静态方法 调用方式:Outer.Inner.test();