封装
封装含义及目的
封装含义: 封装指的是属性私有化(关键字:private),根据需要提供setter和getter方法来访问属性。即 隐藏具体属性和实现细节,仅对外开放接口(关键字:public),控制程序中属性的访问级别。
封装目的: 增强安全性和简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员。
关于访问修饰符:
封装的实现
1 需要修改属性的访问控制符(修改为private);
2 创建getter/setter方法(用于属性的读写);
3 在getter/setter方法中加入属性控制语句(用于判断属性值的合法性);
例子:
public class Student { //创建一个学生类
private double height;//属性私有化,不能从外部直接访问
private String name;
//创建访问私有属性的方法间接操纵属性
public void setHeight(double height) {
this.height = height;
}
public double getHeight() {
return height;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
封装优缺点
优点:
- 封装起到了保护数据的作用,使代码更加安全可用,用户不能直接修改数据,必须通过相应的方法才能读取和写入数据。
缺点:
- 变量等使用private修饰,或者封装进方法内,不能直接被访问,增加了访问步骤与难度
继承
继承含义
当多个类具有共同的属性与行为的时候,将这些共同的部分抽取出来定义到一个公共的类中,其他及各类可以与这个公共的类形成继承关系(关键字:extends),这个公共的类就是父类,其他的类就是子类。
子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.get()方法
super关键字:
继承的实现
类的声明用extends定义子类,子类拥有父类的成员方法和成员变量。子类继承父类的成员变量和方法,同时子类还可以声明自己的成员和方法。
public class Animal{ //父类
int a;
public void f() {
a=2;
}
}
public class Dog extends Animal { //子类
...//默认有int a;public void f(){}...
}
Object 类
Object类是java.lang包中的类,是所有类的祖先类,如果一个类不是某一个类的子类,那么这个类的父类就是Object类。
子类继承性
子类父类在同一个包中的继承性:
如果子父类在同一包中,子类自然地继承父类除private类型之外的成员变量和方法。
子类父类在不同包中的继承性:
不同包中,父类中的private和默认访问权限的成员变量不作为子类的成员变量,子类只继承父类的protected和public类型成员变量和方法。
instanceof运算符:
如果a是A类的对象或A类子孙类对象,则a instanceof A返回值是true
成员变量隐藏和方法重写
成员变量隐藏
编写子类声明对象时如果采用与父类继承的成员变量名字相同(声明类型可以不同),子类就会隐藏所继承的成员变量
其特点如下:
- 子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
- 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说子类继承方法操作变量一定是子类所继承或隐藏的成员变量(也就是父类声明的成员变量)
- 子类在隐藏父类成员变量时访问权限只能扩大不能减小
方法重写(override)
子类通过重写可以隐藏已继承的方法
1、语法规则
- 子类继承父类方法有权利重写,重写方法与父类方法类型一致或者是父类方法的类型的子类型(父类方法类型是“类”,允许子类重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数类型和父类的方法完全相同。
2、重写的目的
- 子类重写父类方法可以把父类的状态和行为改变为自身状态和行为。
- 重写的方法可以操作新定义的成员变量、调用继承方法,但不能操作已经隐藏的方法和成员变量
- 重写方法要与父类方法声明完全一致
调用隐藏的方法可以用super关键字
3、重写的注意事项
重写父类方法时,不允许降低方法访问权限,可以提高访问权限
public > protected > 友好的 > private
super关键字
一个例子看懂super关键字的一个作用:调用隐藏的父类方法
class A {
public int i;
public float fun() {
i = 23.0f;
return i;
}
class B extends A {
public int j;
public float fun() {
System.out.println(super.fun());
}
public class test {
public static void main(String [] args) {
B b = new B();
b.fun();
}
}
结果:
23
super第二个作用:
当子类构建对象时,子类构造方法总是先调用父类某个构造方法,如果父类没有特殊写则是
super();
子类构造方法中第一条语句应该用super调用父类构造方法
定义构造方法时父类应当特意写一个不带参数的构造方法(默认的那个)
final关键字
final可以修饰类、成员变量,方法及方法中局部变量,修饰后变量不可变,类不可有子类,方法不允许重写。
如果成员变量或局部变量修饰为final,则为常量
上转型
Animal A = new Tiger();
//或者
Animal A;
Tiger B = new Tiger();
a = b;
a就是b的上转型对象
多态
多态含义
多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
继承是多态的基础。
类实现多态
-
继承;
-
重写;
-
父类引用指向子类对象。
java不支持多继承,一个子类只能继承一个父类,但支持多层继承。
子类通过继承父类的属性和方法,以及进行重写和重载,增强的代码的复用性。
接口实现多态
接口的多态指在实现同一接口时可能具有不同的实现方式,那么接口变量在回调接口方法是就可能具有多种形态。
总结
封装可以隐藏实现细节,使得代码模块化,提高代码安全性;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。