1.封装
1.1 为什么要封装?
- 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。
- 适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
- 面向对象的开发原则要遵循“高内聚、低耦合”:
-
高内聚:相关的功能和数据尽可能地组织在同一个类中,各个类内部数据操作细节自己完成,以确保其独立性。
-
低耦合:各个类之间的依赖关系应尽可能低。也就是说,一个类的变化应尽量减少对其他类的影响。有助于提高软件的可扩展性、可复用性和灵活性。
-
1.2 如何封装
实现封装就是指控制类或成员的可见性范围?这就需要依赖访问控制修饰符,也称为权限修饰符来控制。
权限修饰符:private,缺省,protected,public
修饰符 | 本类 | 本包 | 其他包子类 | 其他包非子类 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
外部类:public和缺省
成员变量、成员方法、构造器、成员内部类:private,缺省,protected,public
1.3 成员变量私有化
将成员变量(也称为属性)私有化是一种常见的做法。这样做的目的是保护数据,防止外部直接访问和修改,以确保数据的完整性和安全性。同时,通过提供公共的getter和setter方法来访问和修改这些私有变量,可以更好地控制对这些变量的访问和修改。
代码如下:
定义私有变量
public class Person {
private String name;
private int age;
private boolean marry;
}
public class Person {
private String name;
private int age;
private boolean marry;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
public void setMarry(boolean m){
marry = m;
}
public boolean isMarry(){
return marry;
}
}
可以使用IDEA软件中自动生成getter和setter方法。
2.继承
多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类、超类(superclass)或者基类
2.1 继承的好处
-
提高代码的复用性。
-
提高代码的扩展性。
-
表示类与类之间的is-a关
2.2 继承的语法格式
通过关键字extends,可以声明一个子类继承另外一个父类
【修饰符】 class 父类 {
...
}
【修饰符】 class 子类 extends 父类 {
...
}
2.3 继承的特点
1.子类会继承父类所有的实例变量和实例方法
从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。
-
当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。
-
当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。
所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。
2.Java只支持单继承,不支持多重继承
public class A{}
class B extends A{}
//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{} //ok
class C extends A,B... //error
3.Java支持多层继承(继承体系)
class A{} class B extends A{} class C extends B{}
顶层父类是Object类。所有的类默认继承Object,作为父类。
4.一个父类可以同时拥有多个子类
class A{} class B extends A{} class D extends A{} class E extends A{}
3 方法重写(Override)
1、重写方法的要求
1.必须保证父子类之间重写方法的名称相同。
2.必须保证父子类之间重写方法的参数列表也完全相同。
2、方法的重载和方法的重写的区别
方法重载(Overload):
-
发生在同一个类中。
-
方法名相同,但参数列表(数量、类型、顺序)不同。
-
实现功能的多样性,与返回类型无关。
方法重写(Override):
-
发生在子类与父类之间。
-
方法名、参数列表完全相同,返回类型相同或为其子类型。
-
子类重新实现父类方法,行为可能与父类不同。
-
子类方法的访问级别不能低于父类方法,异常处理也要遵循一定规则。
简而言之,重载是同一个类中方法名相同但参数不同,重写是子类与父类方法名、参数都相同但实现不同。