一、封装
- 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,⽽是通过该类提供getter setter的⽅法来 对隐藏的信息进⾏操作和访问
封装的实现步骤:
- 修改属性的可⻅性设为(private)
- 创建getter/setter⽅法(⽤于属性的读写)(通过这两种⽅法对数据进⾏获取和设定,对象通过 调⽤这两种发⽅法实现对数据的读写)
- 在getter/setter⽅法中加⼊属性控制语句(对属性值的合法性进⾏判断)
“⾼内聚,低耦合”:
高内聚低耦合,是软件工程中的概念,是判断软件设计好坏的标准,主要用于程序的 面向对象 的设计,主要看类的内聚性是否高, 耦合度是否低。. 目的是使程序模块的可重用性、移植性大大增强 。. 通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。. 内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系;耦合是软件结构中各模块之间相互连接的一种 度量 ,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
- “通过 private、default 、protected、 public 关键字实现属性或⽅法的封装, 仅 对外提供公共 访问⽅式 。
封装的好处:
- 实现数据项和⽅法的隐藏
- 实现隐藏隔离,允许外部对类做有限的访问,开发者可以⾃由的改变类的内部实现
- 提⾼了代码的重⽤性
二、继承
- 通过 extends 。
两个好处:
- 代码重⽤
- 通过继承 实现对现实世界更加准确的建模
class ⽗类 { } class ⼦类 extends ⽗类 { ----继承了之后有⽗类(⾮私有)的属性或⽅法 ----重写⽗类⽅法 }
三、多态
- ⼀个对象变量可以指向多种实际类型对象的现象被称为“多态”, 多态是同⼀个⾏为具有多个不同表现形式或形态的能⼒。
- ⽐如 ⽗类是 打印机
- ⼦类分为 彩⾊打印机 ⿊⽩打印机 3D打印机
- 但他们都是打印机类的,这就是多态
- ⼦类分为 彩⾊打印机 ⿊⽩打印机 3D打印机
三个必要条件:
- 继承
- ⽅法的重写
- ⽗类引⽤指向⼦类对象(⾸先检查⽗类中是否有该⽅法,如果没有,则编译错误;如果有,再去调⽤⼦类 的同名⽅法。)
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态的定义与使用格式:
父类类型 变量名=new 子类类型();
多态中成员的特点:
1.多态成员变量:编译运行看左边 Fu f=new Zi(); System.out.println(f.num);//f是Fu中的值,只能取到父中的值 2.多态成员方法:编译看左边,运行看右边 Fu f1=new Zi(); System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
编译时多态和运行时多态:
在调用一个方法时,从源代码上看,无法确定调用了哪个对象的方法。只有在程序运行期间根据对象变量引用的实际对象才能确定此方法是
哪个对象的。这种现象称之为动态绑定 (联编)。
结论: 动态绑定的前提是:
1) 发生继承,且一个父类有多个子类。
2) 在每一个子类中对继承自父类的同一个方法实现了重写。
3) 发生多态,即: 父类对象变量引用了不同的子类对象。
4) 父类的对象变量调用了重写的方法,即: 发生了动态绑定。从而实现了多的价值。
具体可参考 Java 编译时多态和运行时多态_若明天不见-CSDN博客_java运行时多态和编译时多态
多态的转型:
- 多态的转型分为向上转型和向下转型两种
- 向上转型 :多态本身就是向上转型过的过程
- 使用格式: 父类类型 变量名=new 子类类型();
- 适用场景:当不需要面对子类类型时, 通过提高扩展性(可引用子类的重写过的父类方法) ,或者使用父类的功能就能完成相应的操作。
-
class A { public void print() { System.out.println("A:print"); } } class B extends A { public void print() { System.out.println("B:print"); } } public class Test{ public static void main(String args[]) { A a = new B(); //通过⼦类去实例化⽗类 a.print();//调用B类中重写的父类方法,输出B:print } }
- 向下转型 :一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
- 使用格式: 子类类型 变量名=(子类类型) 父类类型的变量;
- 适用场景:当要使用 子类特有功能 时。
-
class A { public void print() { System.out.println("A:print"); } } class B extends A { public void print() { System.out.println("B:print"); } public void funcB(){ System.out.println("funcB"); } } public class Test{ public static void main(String args[]) { B b = (B)a; //向下转型,通过⽗类实例化⼦类 b.funcB(); //调⽤B类独有的⽅法,输出funcB } }