文章目录
面向对象的三个基本特征是:封装、继承、多态
继承
继承可以使我们更容易实现类的扩展,在现实世界中比比皆是。并且继承实现了代码的重用,不用再重新发明轮子,提高了代码的复用性。
继承是用extends关键字实现的,例如:
class 子类 extends 父类{
Java语句;… … …
}
可以通过一个哺乳动物的例子来理解:
public class ExtendsTest {
public static void main(String[] args) {
Human human=new Human("人类",173);
//拥有自己定义的方法
human.study();
//继承了来自父类的方法
human.suckle();
human.viviparous();
System.out.println("------------------------");
Dog dog=new Dog("狗",50);
dog.bark();
//dog.study();无法使用Human类中的方法
//继承了来自父类的方法
dog.suckle();
dog.viviparous();
}
}
//Mammal是父类,Human和Dog是Mammal的子类
class Mammal{
String name;
int height;
//哺乳动物的特性
public void suckle() {
System.out.println("哺乳");
}
public void viviparous() {
System.out.println("胎生");
}
}
class Human extends Mammal{
//天然拥有父类的属性
public Human(String name,int height){
this.name=name;
this.height=height;
}
//可以重写父类的方法
@Override
public void suckle() {
System.out.println("人类是胎生的");
}
//可以自己定义方法
public void study(){
System.out.println(this.name+"身高"+this.height+",拥有高等智慧。");
}
}
class Dog extends Mammal{
public Dog(String name,int height){
this.name=name;
this.height=height;
}
public void bark(){
System.out.println(this.name+"身高"+this.height+",会汪汪汪。");
}
}
继承的使用要点
- 父类也称作超类、基类、派生类等。
- Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
- Java中类没有多继承,接口有多继承。
- 子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
- 如果定义一个类时,没有调用extends,则它的默认继承的父类是:java.lang.Object。
常用的关键字
this关键字
this的本质就是“创建好的对象的地址”,由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。
this常用的用法:
- 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
- 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
- 静态方法不需要定义类的对象就可以直接使用的,而this表示调用这个方法的对象,两个同时使用就矛盾了,静态方法被调用的时候是不存在类的对象的。所以,this不能用于static方法中。
static关键字
在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:
- 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
- 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享。
- 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)
- 在static方法中不可直接访问非static的成员。
核心要点(参考上文this最常的用法的第三点):
- static修饰的成员变量和方法,从属于类。
- 普通变量和方法从属于对象的。
super关键字
-
super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。
-
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
-
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法,这里的super()可以省略。
final关键字
- 修饰变量:被他修饰的变量不可改变,一旦赋了初值,就不能被重新赋值。
- 修饰方法:该方法不可被子类重写,但是可以被重载(因为重载本质上是两个不同的方法)。
- 修饰类:修饰的类不能被继承。比如:Math、String等。
封装及权限修饰符
封装的作用及其优点
- 封装的作用
- 封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
- 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
- 要访问该类的代码和数据,必须通过严格的接口控制。
- 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
- 适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
- 编程中封装的具体优点:
- 提高代码的安全性。
- 提高代码的复用性。
- “高内聚”:封装细节,便于修改内部代码,提高可维护性。
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
权限修饰符
Java中使用权限修饰符来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种权限修饰符分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。
权限修饰符的访问范围:
权限修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|---|---|---|---|
private | √ | |||
无修饰符(default) | √ | √ | ||
protected | √ | √ | √ | √ |
public | √ | √ | √ | √ |
-
私有权限(private):private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
-
默认权限(default):类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。
-
受保护权限(protected):protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。
-
公共权限(public):public可以修饰类,数据成员,构造方法,方法成员。被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包&