面向对象三大特性
封装性
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
封装的好处(优点):
- 通过隐藏对象的属性来保护对象内部的状态(隐藏信息、实现细节)。
- 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展(将变化隔离,类内部的结构可以自由修改,增加内部实现部分的可替换性)。
- 禁止对象之间的不良交互提高模块化(良好的封装能够减少耦合)。
- 可以对成员变量进行更精确的控制。
- 容易保证类内部数据间的一致性,从而提高软件的可靠性。
实现Java封装
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getxxx()和setxxx()实现对该属性的操作,以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节;
- 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
- 便于修改,增强代码的可维护性;
封装实例:
class Tom {
private float weight;
private float f (float a,float b) {
return a+b;
}
}
public class Person {
private String name;
private int age;
public int getAge {
return age;
}
public String getName () {
return name;
}
public void setAge (int age) {
this.age = age;
}
public void setName (String name) {
this.name = name;
}
}
继承
访问权限
Java权限修饰符public protected private置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | Yes | |||
default(不用输入) | Yes | Yes | ||
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
对于class权限修饰只用public和default。
- public类可以在任何地方被访问。
- default类只可以被同一个包内部的类访问。
继承性
class Parent {
...
}
class Child extends Parent {
...
}
-
Java中使用extends关键字实现类的继承机制
-
通过继承,子类自动拥有了基类(父类)的所有成员(成员变量和方法)。
-
Java只支持单继承,不允许多继承:一个子类只能有一个基类,一个基类可派生出多个子类。
-
子类比父类大,子类对象包含一个父类对象。
Student类继承了person类 的name和age,同时又拥有Student类独有的school。
子类可以继承父类的属性和行为,及继承父类所具有的数据和数据上的操作,同时又可以增添子类独有的数据和数据上的操作。 -
父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,即子类对象不继承父类的私有成员变量。同样,如果子类和父类不在同一包中,尽管父类的友好成员变量分配了内存空间,但也不作为子类对象的变量,即如果子类和父类不在同一包中,子类不继承父类的友好成员变量。
如:
class People {
private int averHeight = 166;
public int getAverHeight () {
return averHeight;
}
}
class ChinaPeople extends People {
int height;
public void setHeight (int h) {
//height = h+averHeight; //非法,子类没有继承averHeight
height = h;
}
public int getHeight () {
return height;
}
}
public class Example {
public static void main (String args[]) {
ChinaPeople zhangSan = new ChinaPeople ();
System.out.println ("子类对象未继承的averHeight的值是:"+zhangSan.getAverHeight ());
zhangSan.setHeight (178);
System.out.println ("子类对象的实例变量height的值是:"+zhangSan.getHeight ());
}
}
运行结果:
成员变量的隐藏
子类所声明的成员变量的名字和从父类继承来的成员变量名字相同(声明的类型可以不同),在这种情况下,子类就会隐藏所继承的成员变量。
子类隐藏继承的成员变量特点如下:
- 子类对象以及子类自已定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
- 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。
方法重写
- 如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法。所谓方法重写,是指子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。子类如此定义的方法称作子类重写的方法。
- 子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
super关键字
- 用super操作被隐藏的成员变量和方法
如果在子类中想使用被子类隐藏的成员变量或方法,就需要使用关键字super。
如super.x、super.play()就是访问和调用被子类隐藏的成员变量x和方法play()。 - 使用super调用父类的构造方法
由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句。
final关键字
- final类
可以使用final将类声明为final类。final不能被继承,即不能有子类。
final class A{
...
}
A就是一个final类,将不允许任何声明成A的子类
- final方法如果用final修饰父类中的一个方法,那么这个方法不允许子类重写,也就是说,不允许子类隐藏可以寄继承的final方法。
- 常量
如果成员变量或局部变量被修饰为final,那他就是常量。程序在声明常量时必须指定该常量的值。
多态
多态性就是指父类的某个方法在被其子类重写时,各自产生自己的功能行为。
例:
class animal {
void cry () {
}
}
class dog extends animal {
void cry () {
System.out.println ("汪汪汪...");
}
}
class cat extends animal () {
void cry () {
System.out.println ("喵喵喵...");
}
}
public class Example1 {
public static void main (String args[]) {
animal 动物;
动物 = new dog ();
动物.cry ();
动物 = new cat ();
动物.cry ();
}
}
运行结果: