继承
为什么使用继承:
- 提升代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码)
- 代码存在重复了,导致后果就是代码量大且臃肿(减少代码的冗余)
继承:
- 继承就是子类继承父类的特征和行为,使得子类具有父类的实例域和方法, 或子类从 父类 继承方 法,使得子类具有父类相同的行为(类和类之间的关系)
- 在Java所有类都默认继承自Object
- 单根性:一个类只能存在一个父类
- 在Java中的继承:子类可以继承父类的任何非私有成员(变量 方法 构造) 子类永远比父类拥有更多的成员 子>父
注意事项
- Object:任意一个类都直接或间接继承Object 在MyEclipse中查看继承架构图的快捷键为ctrl+T ctrl+O 查看类中的所有成员
- native:不是由java实现的,而是由C语言实现的
- final:常量 类(代表该类不能被继承) 方法(该方法不能被子类重写)
如何使用继承:
//父类
public class Parent {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent() {
System.out.println("Parent的无参构造");
}
}
子类使用extends关键字
//子类
public class Child extends Parent {
public Child (){
System.out.println("Child 类的无参构造");
}
}
}
---------------------
类型转换:
向上转型: 子类向父类转换 自动
向下转型: 父类向子类转换 强制编译可以通过但是运行会报错 ClassCastException 要使用instanceof (在调用子类特有的成员时)
定义了两个类型,FatherClass和SonClass,然后构造了一个SonClass类型的对象,用一个FatherClass类型的变量father引用了,就像这样:FatherClass father = new SonClass();那么,需要将这个对象的类型还原的时候,就可以用这个表达式。SonClass son = (SonClass)father;
子类可以再任何时刻替代父类: is a关系
方法重写
子类对象调用方法的时候:先找子类本身,再找父类。(就近原则)
父类中的方法不能满足子类的需求时,就可以重写父类中的方法,子类自己实现该方法。
方法重写的注意事项
子类重写父类的方法之后,调用方法不再调用父类中方法,而是调用子类重写后的方法。 * 子类重写父类方法时使用的权限修饰符要大于等于父类方法中使用的权限修饰符 * public > protected > 默认权限 > private
如果父类的方法使用private修饰了,则子类不能重写该方法,即使子类有方法声明一样的方法也不属于重 写,属于子类重新定义了一个方法。因为父类私有方法子类根本就无法继承
//父类
public class Parent {
public void play() {
System.out.println("打篮球");
}
public void run(){
System.out.println("跑步");
}
}
//子类
public class Child extends Parent {
public void play() {
System.out.println("打篮球");
System.out.println("踢足球");
}
}
//运行测试
public class Test {
public static void main(String[] args) {
// 创建父类对象
Parent p = new Parent();
p.play();
System.out.println("------------");
// 创建子类对象
Child p2 = new Child();
p2.play();
p2.run();
}
}
运行结果
super关键字
super用于限定该对象调用它从父类继承得到的实例变量或方法。
super和this相同,都不能出现在静态方法中,因为静态方法属于类的,调用静态方法的可能是个类,而不是对象,而super和this都是限定对象调用。
super同样也可以在子类中调用父类中被子类隐藏和覆盖的同名实例变量和同名方法。
在构造器中使用super,则super会用于限定于该构造器初始化的是该对象从父类继承得到的实例变量,而不是该类自己定义的实例变量。意思就是调用父类的构造器。
使用实例:
super.name; super.walk();
super调用:super紧跟圆括号