- A+
所属分类:Java基础回顾
三、OO三大特性
封装、继承、多态
- 封装:类的概念,把属性和方法包装到一个程序单元中,进行了一定信息隐藏(setter/getter)
- 继承:类的父子关系,子类可以继承父类的属性和方法,也可以重写扩展(父类私有无法继承)
- 数量:只能单继承
- 好处:复用性、节省代码
- 注意:继承于抽象类的子类中,必须重写(实现)抽象方法
- 多态:不同类对象对同一消息做出的反应
- 对外一种表现形式 对内多种具体实现
- 重写和重载也算多态(重写:运行期;重载:编译期)
- 通常通过抽象类、接口实现多态
1、封装(类)
1、访问修饰符
- public
- 都可访问
- private
- 只有该类内部可访问
- protected
- 该类及其子类可访问,同一个包下的类也可访问
- 默认
- 同一个包内的类可访问
位置 | public | protected | 默认 | private |
---|---|---|---|---|
同一个类 | Y | Y | Y | Y |
同一个包下的类 | Y | Y | Y | N |
不同包子类 | Y | Y | N | N |
不同包无关类 | Y | N | N | N |
2、this
这里只提一个小点:构造方法调 其他构造必须放第一行
class A {
public A(){
}
public A(Object o){
this(); // 必须放第一行!!!
// ...
}
}
2、抽象类 abstract
-
抽象:把多个事务的共性抽取出来
- 比如十二生肖的共性就是它们都是动物,宏观概念上动物有的特性十二生肖都有
-
抽象类:Java可以定义没有方法体的方法,该方法由其子类继承并具体实现,该方法我们称之为抽象方法,含有抽象方法的类被称为抽象类
-
属性:没要求
-
方法:静态、非静态都可以,可以有也可以没有抽象方法(修饰符:
abstract
,没有方法体) -
构造方法:有(但是不能实例化,为子类实例化)
-
继承:单继承(必须重写抽象方法)
-
注意:有抽象方法的类必须是抽象类,抽象类不一定有抽象方法
-
栗子
-
// 抽象类必须由abstract修饰 abstract class 抽象类{ public int num; public 抽象类() { // 虽然我有构造器,但是依然不能实例化 } // 抽象方法必须由abstract修饰 public abstract int getNumAddOne(); }
-
-
3、接口 interface
-
概念:定义了一种规范
-
好处:
-
多实现(
implements
,一个类虽然只能继承一个父类,但是可以实现多个父接口)-
interface A{ } interface B{ } interface C{ } class E{ } class F extends E implements A,B,C{ }
-
-
多继承(
extends
,一个接口可以继承多个接口,没错,多继承!)-
interface A{ } interface B{ } interface C extends A,B{ }
-
-
-
注意:实现接口,必须重写抽象方法( jdk1.8接口可定义静态方法 )
-
作用:解耦(降低程序间的依赖关系)高内聚低耦合
-
特点
- 属性:只能定义公开静态常量(
public static final
;不写的话默认也是这个) - 方法:公开抽象方法(
public abstract
;不写的话默认也是这个)、静态方法(jdk1.8+)
- 属性:只能定义公开静态常量(
-
栗子
-
public interface 接口 { // 接口属性只能用 public static final 修饰 public static final double LENGTH = 2; // 默认也是 public static final double WIDTH = 0.1; // 接口方法全是抽象方法 public abstract void charge(); // 默认也是 public abstract void read(); }
-
4、抽象类和接口
接口 | 抽象类 | |
---|---|---|
继承 | 多继承,多实现 | 单继承 |
属性 | 常量(public static final) | 都可以 |
方法 | 抽象(public abstract)/静态(jdk1.8) | 都可以(有抽象方法的类一定是抽象类) |
构造 | 无 | 有(不能实例化,为子类实例化) |
关系 | like-a | is-a |
思想 | 不考虑事物的相关性 只是一种规范 |
用于一组相关的事物 总不能让狗继承抽象花吧 二者完全没有相关性 |