1 特点:extends关键字
1 单继承:
一个类只能有一个直接父类;多重继承,一个类可以有多个间接父类:父类、祖父类。。。
如果定义一个Java类时候,没有显式指定这个类的直接父类,则默认扩展java.lang.Object类。
子类扩展了父类,子类是一个特殊的父类。多数情况下,子类在父类的基础上新增成员变量和方法。有一种例外:子类重写父类的方法。
子类不能继承父类的private成员(属性,方法)。
如果父类方法具有private访问权限,则该方法对子类是隐藏的,子类无法访问,也无法重写该方法。
2 定义:
public class 父类 {
}
public class 子类 extends 父类 {
}
子类中:可以增加变量、增加方法或覆盖父类的方法
3 构造器
当调用子类构造器来初始化子类对象时:先初始化父类构造方法,再初始化子类构造方法。
创建本类对象之前会先初始化父类对象(因为子类可能用到父类属性,所以要先初始化父类)
如Object->Class A->Class B,当创建class B对象时候:
系统先执行Object类的构造器,再执行class A的构造器,然后才执行class B的构造器。
4 访问修饰符:public>protected>默认修饰符>private
1 Private:仅对本类可见
2 Default:对本包可见
3 Procted: 对本包和所有子类可见
4 Public:对所有类可见
2 方法重写Override:子类对父类方法的升级或改造。通过继承或实现接口两种方式。
1 子类中包含与父类同名方法的现象叫做重写。子类重写/覆盖了父类的方法。
修饰符、返回值、方法名、参数都必须一模一样。
两同两小一大:
两同:方法名相同,形参列表相同
两小:子类方法返回值类型<=父类方法返回值类型;子类抛出异常<=父类方法声明抛出的异常类
一大:子类访问权限>=父类访问权限。
如果一个方法是protected:很大可能告诉别人,这个方法是给子类重写用的。
2 子类
方法重写在eclipse中的快捷键:alt+/ 双击
会自动带上注解@Override,表明此方法是一个重写方法。如果不满足重写要求,会报错,可校验重写方法正确与否。
3 子类中重写了父类方法,则调用时一定调用的是子类重写过的方法。
子类覆盖父类方法后,如果想调用父类中被覆盖的方法:super关键字
设计类时:要将通用的方法放在父类中,而降特殊用途的方法放在子类中
4 super:
关键字:一般只在重写里用到
1 Super指向父类: 调用父类方法或属性。
this指向当前类:区分局部变量和成员变量同名
this/ super:不能出现在static修饰的方法中。
2 super/this必须出现在构造方法的第一行:所以super/this在构造方法里不会同时出现。
super() 调用父类构造方法
this() 调用本类其他构造
3 如果某成员变量只在父类中存在,在子类中不存在:在子类实例方法中访问该成员变量时,无需显式使用super或父类名。
某个方法中访问名为a的成员变量,但未显式指定调用者,系统查找a的顺序为:
1)该方法中是否有名为a的局部变量;
2)当前类中是否有名为a的成员变量;
3)a的直接父类中是否有名为a的成员变量,向前追溯a的所有父类,直至Object。如果一直没有,报编译错误。
3 final
1 final类:不能被继承
final类中的所有方法都隐式指定为final方法,因为不会有子类,也就不会被重写。
2 final方法:不能被重写(禁止覆盖)
3 final常量:
-一个永不改变的编译时常量:既是static又是final,一般用大写表示,并且用下划线分隔各个单词, e.g.: public static final double PI = 3.1415926
-一个在运行时被初始化的值,且不希望它的值被改变, e.g.: private final int period = 3;
4 所有类的超类:Object
1 如果某类没有明确指出父类,那么默认该类继承自Object类;
2 equals()方法:比较两个对象是否相等
如果两个对象指向同一块内存区域,方法返回true;否则返回false
1 public static boolean equals(int[] a, int[] a2)
如果两个数组长度相同,并且对应位置上数据元素也相同,则返回true
![](https://i-blog.csdnimg.cn/blog_migrate/8c5603107757be28488867446f26ce50.png)
2 public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
如果a和b都为null,返回true;如果只有一个为null,返回false;否则返回a.equals(b)
3 如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同
4 toString()方法:返回表示对象值的字符串
在自定义的类中,应该要重写、覆盖toString()方法
public String toString() {
return getClass().getName()
+ "[name=" + name
+ ", salary=" + salary +"]";
}
![](https://i-blog.csdnimg.cn/blog_migrate/1ae02e3b267efd1b3c0862a2749ac359.png)
5 多态
1 用父类的类型来接收子类的对象:
父类 对象名 = new 子类名(); //实际上new的还是子类对象。
多态:父类类型Animal接收子类对象Cat/Dog类
Animal a2 = new Cat();
Animal a3 = new Dog();
animalEat(a2);//Cat eat
animalEat(a3);//Dog eat
![](https://i-blog.csdnimg.cn/blog_migrate/ce2a252b3a0cb98b574e33591bb6d9fa.png)
2 先决条件:
继承/接口实现
父类类型接收子类对象
3 优点:
扩展性强,解决了代码复用,降低类型耦合度
可以少定义变量,少些重复代码。
案例:一个方法接受不同的子类类型。
4 缺点:
不能使用子类特有方法
可以使用强转,转成对应子类类型,解决这个问题。
使用方法:
父类 变量名1 = 子类对象;
子类 变量名2 = (子类)变量名1;
多态一般伴随重写使用。
e.g: Animal a = new Cat();
Cat cat = (Cat)a;
cat.catchMouse();
如果没有继承关系,就不能强转,classCastException
6 继承的设计技巧
1 将公共操作和域放在超类
2 不要使用procted域,Procted方法一般用来不提供用途而在子类中重新定义的方法
3 任何时候只要使用了以下条件,就应该考虑使用多态:为这个概念定义一个方法,并将其放在两个类的超类或接口中,就可以调用:x.action()
if(x is type 1)
action1(x)
else if (x is type 2)
action2(x)