java面向对象下
1面向对象 之 继承
- 继承的引入;
格式:
[修饰符] class SubClass extends SuperClass - 按照这种关系,我们把SuperClass类称为父类或基类,把SubClass称为子类或派生类或拓展类;
- java.lang.Object是所有类的父类,Object要么是直接父类要么是间接父类。
继承
- 首先有反映一般事物特性的类,然后在此基础上反映出特殊事物的类;也就是说:继承是一种从一般到特殊的关系;
- 提高了代码的复用性,提高软件开发效率;
- 让类与类之间产生关系,多态的前提;
子类与父类: - 父类的私有成员子类不能继承到;
- Java只支持单继承,不支持多继承;
- 一个类有且只有一个直接父类;
- 在继承操作中,对于子类对象的实例化:子类对象在实例化之前必须首先调用父类中的构造方法之后再调用自身的构造方法。
2.子类访问父类
子类不能直接访问父类的私有成员;
但是子类可以调用父类中的非私有方法来间接访问父类的私有成员。
Person类中有私有字段name,Student继承Person
new Sudent().name; ×
new Student().getName(); √
3.方法的重写
- 产生原因:
当父类中某个方法不适合于子类时,子类出现父类一模一样的方法. - 判断必杀技:子类方法前加上@Override能编译通过,表明是方法的覆写。
- 调用被覆盖的父类方法:使用super.方法名(实参);
- 方法覆写时应遵循的原则(一同两小一大):
(一同):方法签名必须相同;
(两小):
子类方法的返回值类型比父类方法的返回值类型更小或相等
子类方法声明抛出的异常应比父类方法申明抛出的异常更小或相等;
(一大):子类方法的访问权限应比父类方法更大或相等;
方法的重写与方法的重载的区别
方法的重载: 同一个类,同一个方法名。与返回值无关,可以有不一样的返回值,方法的参数列表不同(顺序、类型、个数)
方法的重写:不同类,要存在继承关系。子类的返回值必须小于或等于父类返回值,异常雷同,父子类方法名和方法的参数列表一样,子类的访问修饰符大于或等于父类的。
4.super关键字
-
表示父类对象的默认引用
-
如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法。
-
使用super调用父类方法
-
使用super调用父类的构造方法
-
调用构造方法
本类中调用另一个重载构造方法用this(参数列表)
子类构造方法调用父类构造方法用super(参数列表) -
子类调用父类的构造方法时:
super必须放在第一句 -
Java在执行子类的构造方法前会先调用父类无参的构造方法,其目的是为了对继承自父类的成员做初始化操作。
-
子类在创建对象的时候,默认调用父类的无参构造方法,要是子类构造方法中显示指定调用父类其他构造方法,就调用指定的父类构造方法,取消调用父类无参构造方法。
this & super
5.面向对象 之 多态
-
编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给变量的对象决定。
-
如果编译时类型和运行时类型不同,就出现多态。
-
多态:指同一个实体同时具有多种形式
好比,你去面馆吃面,说我要吃面,那么;老板给我牛肉面,鸡蛋面等都可以,这就是说"面"有多种形态,也就是说实体有多种形态; -
实现多态的机制:
父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 -
多态的作用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。只修改方法的实现,不必修改方法的声明 -
继承是多态产生的前提条件;
-
分类:
编译时多态:方法重载
运行时多态:方法覆写
6.引用变量类型转换
-
向上转型(子类→父类):(自动完成)
父类名称 父类对象 = 子类实例 ; -
向下转型(父类→子类):(强制完成)
子类名称 子类对象 = (子类名称)父类实例 ; -
对象名 instanceof 类
判断指定的变量名此时引用的真正类型是不是当前给出的类或子类;
7.继承 & 组合关系
- 一般 → 特殊:继承关系,是 "is a"关系,Java 通过extends 表示这种关系。
- 整体 → 部分:组合关系 ,Java语言通过在一个类中保存另一个对象的引用实现这种关系. 是 "has a"关系。