面向对象三大特性之封装
1. 什么是封装?
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
2. 为什么使用封装?
封装在将实现细节隐藏的同时,也确保了使用者无法随意更改内部数据,增强了安全性;使用者不必了解具体的实现细节,而只是通过公开的接口,以特定的访问权限来使用类的成员。
3. 怎么实现封装?
- 类的属性私有化(private)
- 公开的获取(get)和修改(set)属性方法
体会封装:
Encapsulation.java
package com.java.study;
public class Encapsulation {
//私有属性
private int age;
//公有的getter 和 setter
public int getAge() {
return age;
}
public void setAge(int age) throws Exception {
if(age < 0) {//在方法内部对数据的常规错误进行处理
this.age = 18;
throw new Exception("年龄不能小于0");
}else {
this.age = age;
}
}
}
EncapsulationTest.java
package com.java.study;
public class EncapsulationTest {
public static void main(String[] args) throws Exception {
Encapsulation e = new Encapsulation();
System.out.println("初始化默认值:");
System.out.println(e.getAge());
System.out.println("年龄设置为6:");
e.setAge(6);
System.out.println(e.getAge());
System.out.println("年龄设置为-6:");
e.setAge(-6);
System.out.println(e.getAge());
}
}
运行结果:
初始化默认值:
0
年龄设置为6:
6
年龄设置为-6:
Exception in thread "main" java.lang.Exception: 年龄不能小于0
at com.java.study.Encapsulation.setAge(Encapsulation.java:15)
at com.java.study.EncapsulationTest.main(EncapsulationTest.java:13)
4. 权限修饰符
修饰符 | 同一个类 | 同一个包 | 子类 | 不同包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
(default) | √ | √ | × | × |
private | √ | × | × | × |
面向对象三大特性之继承
1. 什么是继承?
继承是子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2. 为什么使用继承?
- 减少代码的冗余,提高代码的复用性
- 便于功能的拓展
- 多态性的前提
3. 继承的使用
格式: class A extends class B
A:子类、派生类、subclass
B:父类、超类、基类、superclass
体现:一旦子类A继承父类B以后,子类A中就获取了父类B的属性和方法。
子类继承父类以后,还可以声明自己特有的属性和方法。
Java的单继承性:Java只支持单继承和多层继承,不允许多重继承
- 一个子类只能有一个父类。
- 一个父类可以派生出多个子类。
面向对象特征之多态
1. 什么是多态?
对象的多态性:父类的引用指向子类的对象。
2. Java引用变量的两个类型
编译时类型和运行时类型。
- 编译时类型由声明该变量时使用的类型决定
- 运行时类型由实际赋给该变量的对象决定。
- 简称:编译时,看左边;运行时,看右边。
若编译时类型和运行时类型不一致,就出现了对象的多态。
多态情况下:
- “看左边“:看的是父类的引用(父类中不具备子类特有的方法)
- “看右边” :看的是子类的对象(实际运行的是子类重写父类的方法)。
2. 多态的作用
提高了代码的通用性,常称作接口重用。
3. 多态
前提:
- 需要存在继承或者实现关系
成员方法:
编译时:要查看引用变量所声明的类中是否有所调用的方法。
运行时:调用实际new的对象所属的类中的重写方法。
成员变量:
不具备多态性,只看引用变量所声明的类。
方法的重写(override/overwrite)
1. 定义
在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
2. 要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 子类不能重写父类中声明为private权限的方法
- 子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
总结
本篇内容
- 简述了面向对象三大特性
下篇内容
抽象与接口