面向对象——继承、访问权限
包的声明:package关键字
包是java语言有效管理类的方式,将同一个应用的类打入一个包中,把不相关或者是完成不同功能的类放入不同的包中,使得管理类变的更容易。
package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。package语句的一般语法格式为:package <包名>
包的引入:import关键字
使用import关键字可以将其他包中的类引入到当前类中以备使用。在编写源文件时,除了自己编写类外,我们经常需要使用Java提供的许多类,这些类可能在不同的包中。如果需要引入其他包中的类,可以使用如下语法格式:import <包名.类名>;
如果要引入某个包中的所有类,可以使用如下语法格式:import <包名>.*;
继承关键字(extends)
继承是面向对象编程的三大特征之一。
继承是一种基于已有的类创建新类的机制。利用继承,我们可以先创建一个具有共有属性的一般类,根据该一般类再派生出具有特殊属性的新类,新类继承一般类的状态(成员变量)和行为(方法),并根据需要增加额外的状态(成员变量)和行为(方法)。由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类)
Java中每个类只允许有一个父类。语法如下:class <子类> extends <父类>
访问级别
在Java中共有4种访问级别,按访问权限由高到低为:public(公有的)、protected(受保护的)、友好的(没有任何访问权限关键字修饰)和private(私有的)。
访问级别规则表:
成员变量的隐藏和方法的重写
当子类的成员变量和父类中的成员变量同名时,父类的成员变量不能被子类继承(即被子类的成员变量覆盖),此时称子类的成员变量隐藏了父类的成员变量。
若子类的方法名与父类相同,参数个数和参数类型也完全相同时,叫做方法重写(不等于重载)。
成员变量的隐藏和方法重写可以使子类替换父类中并不适合子类的状态(变量)和行为(方法),从而使继承更加灵活。
重载(Overloading)
- Java中方法重载是在一个类中发生进行的。当有多个方法具有相同的名字、不同的参数列表时,便产生了方法的重载,此时方法的返回值类型与修饰符相同与不同均无关系。参数列表的不同包括参数的类型、参数的个数、参数的顺序,这三者之中至少有一项不同。当调用这些重载的方法时,根据列表的不同来自动匹配方法,这也体现了Java的多态性
重写(Overriding)
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
- 子类中不能重写父类中的final方法
- 子类中必须重写父类中的abstract方法
子类覆盖父类的同名方法叫做重写,重写必须满足如下条件:
方法的参数个数必须相同。
方法的参数对应的数据类型必须相同。
方法重写时不得修改返回值的类型。
子类不得降低父类同名方法的访问级别。
对于子类实例化的一个对象,如果在子类中重写了父类的方法,则运行时系统调用子类重写的方法;如果子类继承了父类的方法(未重写),那么子类实例化的对象会调用继承自父类的方法
关键字this
this关键字表示当前类的内部实例对象,类似于外部实例,但是this可以访问所有级别的成员变量和方法。
this使用原则:
this是当前类的内部对象,所以和类的外部对象访问类成员变量和方法的规则一致,语法:this.<变量名>和this.<方法名>
this只能在当前类的内部使用,但是,不能在static修饰的方法(即类方法)中使用
this在实例方法中通常被省略,除非实例方法中包含与成员变量同名的局部变量时,访问成员变量需要使用this
当一个类中包含多个构造方法的时,如果其中一个构造方法要调用另外的构造方法时,使用this关键字
关键字super
如果子类继承父类时,出现了成员变量的隐藏和方法重写,此时子类的对象对应的成员变量和方法都是在子类中重新定义的,如果需要在子类中调用父类被隐藏的成员变量或者被重写的方法,可以使用super关键字。
super使用原则:
super可以访问被子类重写的父类同名方法和被子类隐藏的父类的成员变量。
可以使用super关键字调用父类的构造方法。
super调用父类构造方法
如果父类提供了构造方法,并且父类不拥有无参构造方法。则要求子类拥有相同结构的构造方法。即:子类构造方法的参数个数和类型必须和父类的构造方法一致。
如果父类拥有默认的构造方法,子类又没有明确指定调用父类的哪个构造方法,则子类的构造方法隐式的有super()操作;