继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。
java中的继承是**单继承,即一个类只有一个父类。**
子类可以通过继承拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用。
子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
重写要注意:
a、返回值类型
b、方法名
c、参数类型及个数
都要与父类继承的方法相同,才叫方法的重写。
重载和重写的区别:
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
- 初始化父类再初始化子类
- 先执行初始化对象中属性,再执行构造方法中的初始化。
基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:
父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化--->子类对象构造方法
使用final关键字做标识有“最终的”含义。
1. final 修饰类,则该类不允许被继承。
2. final 修饰方法,则该方法不允许被覆盖(重写)。
3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在**构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),**且初始化之后就不能改了,只能赋值一次。
4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
在对象的内部使用,可以代表父类对象。例如:
1、访问父类的属性:super.age
2、访问父类的方法:super.eat()
封装就是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。(get/set)
- 只能通过规定的方法访问数据。
- 隐藏类的实例细节,方便修改和实现。
- 修改类属性的可见性
- 创建getter/setter方法
- 在getter/setter方法中加入属性控制语句
访问修饰符 | 本类 | 同包 | 子类 | 其它 |
---|---|---|---|---|
private | 可以 | |||
默认 | 可以 | 可以 | ||
protected | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
作用:
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
内部类种类:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
多态就是对象的多种形态。
java中的多态体现在以下两个方main:
- 引用多态
- 方法多态
- 父类的引用可以指向本类的对象;
- 父类的引用可以指向子类的对象;
示例代码如下:
public class multipleDemo {
public static void main(String[] args) {
Animal dog1 = new Animal(); //父类的引用指向本类
Animal dog2 = new Dog(); //父类的引用指向子类
//Dog ani = new Animal();报error
}
}
上述代码Dog类是Animal类的子类。
为什么子类的引用不能用来指向父类的对象呢?
- 创建本类对象时,调用的方法为本类方法;
- 创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
继承是多态的基础。
- 父类引用可以指向子类对象,子类引用不能指向父类对象。
- 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。如Father father = new Son();
- 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
- upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
- 向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
- 变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。