封装
定义
隐藏内部细节,提供公共的访问方法,便于调用。提高程序可展性、维护性。实现高内聚,低耦合
语法
私有化属性,提供公共的get/set方法
体现
属性、方法、构造器、内部类
class的权限修饰只可以用public和default(缺省)。
核心是访问权限
访问权限 | 本类 | 同包 | 子类 | 其他 |
private | √ |
|
|
|
缺省 | √ | √ |
|
|
protected | √ | √ | √ |
|
public | √ | √ | √ | √ |
好处
提高程序可展性、维护性。实现高内聚,低耦合
继承
定义
继承
多个类有相同的属性和方法时,将这些相同的属性和方法提取到一个类中,让多个类和这个类产生的一种关系
子类、超类、基类
此处的多个类称为子类,单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”
语法
class Subclass extends Superclass{
//代码
}
好处
1、继承的出现提高了代码的复用性。
2、继承的出现让类与类之间产生了关系,提供了多态的前提。
3、不要仅为了获取其他类中某个功能而去继承, 要考虑类之间是否有分类学关联
子类可以继承父类的内容
所有成员,不包括构造器
继承特性
1、子类继承了父类,就继承了父类的方法和属性。
2、在子类中,自动拥有父类中定义的方法和属性,也可以创建新的数据和方法。
3、在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
继承规则
子类不能直接访问父类中私有的(private)的成员变量和方法。
单继承性
1、Java只支持单继承,不允许多重继承
①一个子类只能有一个直接父类
②一个父类可以派生出多个子类
class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2...//error
方法的覆盖(override)
定义:
1、在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重写、重置。在程序执行时,子类的方法将覆盖父类的方法。
要求:
1、覆盖方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型。
2、覆盖方法不能使用比被重写方法更严格的访问权限。
3、覆盖和被覆盖的方法必须同时为非static的。
4、子类方法抛出的异常不能大于父类被重写方法的异常
小结
1、若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中
2、对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量
多态
定义
同一对象,在程序不同时刻的额多种运行状态
体现
对象的多态性
子类对象的多种父类形态, 换言之就是把子类对象作为父类对象来使用.
引用变量的多态性
一个基本型变量只能有一种确定的数据类型
一个引用类型变量可能指向(引用)多种不同类型的对象
举例
Person p = new Student();
Object o = new Person();
//Object类型的变量o,指向Person类型的对象
o = new Student();
//Object类型的变量o,指向Student类型的对象
多态对象的确定
1、Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。编译看左边,运行看右边
2、若编译时类型和运行时类型不一致,就出现多态(Polymorphism)
多态副作用
定义
一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法(多态副作用)
举例
Student m = new Student();
m.school = “pku”; //合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”; //非法,Person类没有school成员变量
结论:
属性和方法是在编译时确定的,编译时引用变量e为Person类型,Person类型中并没有school成员变量,因而编译错误, 方法的使用也是一样
虚拟方法调用(Virtual Method Invocation)
定义
多态引用调用子类重写父类的方法
举例
正常的方法调用
Person e = new Person();
e.getInfo();
Student e = new Student();
e.getInfo();
虚拟方法调用(多态情况下)
Person e = new Student();
e.getInfo(); //调用Student类的getInfo()方法
小结
前提:
需要存在继承或者实现关系
要有覆盖操作
成员变量:
不具备多态性,只看引用变量所属的类。
成员方法:
编译时:要查看引用变量所属的类中是否有所调用的方法。(编译时检查父类类型)
运行时:调用实际对象所属的类中的重写方法。
(运行时执行子类类型)
instanceof 操作符
作用
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
如果x属于类A的子类B,x instanceof A值也为true。
举例
public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}
-------------------------------------------------------------------
public void method1(Person e) {
if (e instanceof Person)
// 处理Person类及其子类对象
if (e instanceof Student)
//处理Student类及其子类对象
if (e instanceof Graduate)
//处理Graduate类及其子类对象
}
对象类型转换 (Casting )
1、基本数据类型的Casting:
①自动类型转换:小的数据类型可以自动转换成大的数据类型
如long g=20; double d=12.0f
②强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
如 float f=(float)12.0; int a=(int)1200L
2、对Java对象的强制类型转换称为造型
①从子类到父类的类型可以自动进行
②从父类到子类的类型转换必须通过造型(强制类型转换)实现
③无继承关系的引用类型间的转换是非法的
④在造型前可以使用instanceof操作符测试一个对象的类型