一.继承
二.重写父类
三.多态
一.继承
面向对象的编程语言特点之一就是代码复用性更强,继承则是这一特点的基础。
java语言继承规则和继承特点:
1.只能直接继承于一个类
2.可以继承父类的属性和方法,但不能继承父类的构造方法
3.通过继承,可以继承除去构造方法外的所有方法和属性,但私有方法和属性只能通过调用父类提供的访问方法访问。
继承格式:
修饰符 Class 子类名字 extend 父类名字{
}
继承原则:
1.在访问子类中成员变量或方法时,先去子类中寻找子类中的变量和方法,没有则去父类中查找,再没有就编译不通过。
2.访问问到被子类重写的方法时,有先使用被重写的方法。
3.要向父类方法传递参数时使用super(参数)函数。(该函数只能在构造函数的第一句)
二.重写
重写格式:
@Override
修饰符 返回值 被重写方法名(参数列表){
}
重写原则:
1.必须保证被重写的方法名相同,参数列表相同
@override只是帮助检查是否重写错误,可以省区
2.被重写方法返回值范围一定要小于等于父类方法返回值范围
3.修饰符范围要大于等于父类方法返回值范围。
三.多态
多态:多态是同一个行为具有多个不同表现形式或形态的能力。
下面例子中在Human的Car方法里参数是Parent类,但后面使用是却用的Child类但程序可正常运行,就是多态的体现,
多态特点:
1.只能把子类对象传给父类,不能父类传给子类
2.如果要使某个子类独有方法时可以用条件语句限制,再将将其强转
public class Parent {
private float high;//定义一个私有变量,它不可被子类直接访问,但可被间接访问
private int weight;
public Parent(float high){
System.out.println("Parent");
this.high = high;
}
public void eat(){
System.out.println("Parent--->eat()方法被调用!");
}
public void sleep(){
System.out.println("Parent--->sleep()方法被调用!");
}
private void think(){
System.out.println("Parent--->think()方法被调用!");
}
public void appearance(int high){
System.out.println("Parent high = " + high);
System.out.println("Parent weight = " + weight);
}
public void gethigh(){
System.out.println(high);
}
public void car(){
System.out.println("我有一量车");
}
public void test(){
System.out.println("此方法Child2独有!");
}
}
public class Child1 extends Parent {
public Child1(float highs){
super(highs);
System.out.println("Child");
}
@Override//@override不是必须的,写上它可以帮助检查重写是否有误
public void eat() {
System.out.println("子类修改了eat()方法!");
}
@Override
public void car() {
System.out.println("我有一辆宝马");
}
}
public class Child2 extends Parent{
public Child2(float high) {
super(high);
}
@Override
public void car() {
System.out.println("我有一辆奔驰");
}
}
public class Human {
public void car(Parent parent) {
parent.car();
if (parent instanceof Child2) {//instanceof判断某个前者类型是不是后者类型
Child2 child2 = (Child2) parent;
child2.test();
}
}
}
public class Main {
public static void main(String[] args) {
Child1 child1 = new Child1(1.8f);
child1.eat() ;
child1.sleep();
child1.gethigh();
Child2 child2 = new Child2(1.5f);
Human human = new Human();
human.car(child1);//这里参数类型时Parent但传值却是Child1类,就是多态的体现
human.car(child2);
}
}