继承
继承是基于已有的类创建新类的机制
语法如下:class <子类> extends class <父类>
public class Father {
} //父类
public Son extends Father {
} //子类
1:java中每个类只允许继承一个父类
2:被final修饰的类不能被继承,java中已有的类(Void、 String、 Class、 Scanner、 System、八种基本类型对应的包装类)已被final修饰,不能被继承。
3:Object类是所有类的直接父类或间接父类
父类构造方法对子类的影响
1:如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法时,使用super()隐式调用父类的无参构造方法。
public class Father {
public Father(){
system.out.print("父类中无参构造方法");
}
} //父类
public Son extends Father {
public Son(){
system.out.print("子类中无参构造方法");
public static void main(String [] args){
Son son = new Son();
}
}
} //子类
输出如下:
父类中无参构造方法子类中无参构造方法
2:如果父类没有无参构造方法,则子类必须指定调用父类那种构造方法
当子类成员变量与父类成员变量同名时,如果需要在子类非static语句里使用同名的父类成员变量需要用super()调用,否则,是用的还是子类成员变量。
重写
简单来说就是继承一个父类后,对父类方法进行改写。
使用子类创建的对象来调用方法时,调用的是重写后的方法。如果在子类非static里面调用重写的方法,可以用如下形式:super.方法;
重写方法需要注意:
1:父类中的静态方法以及final修饰的方法不能被子类重写,且 重写的方法不能加static修饰
2:重写后的方法的方法名与参数列表(参数个数及类型)需要与重写前的的相同
3:返回值类型:如果父类被重写的方法没有返回值类型或者返回值类型为基本数据类型,则要求子类重写的方法的返回值类型和父类被重写方法的返回值类型相同;
4: 如果父类被重写的方法返回值类型为引用数据类型,则要求子类重写的方法的返回值类型和父类被重写方法的返回值类型相同或是其子类。
:5:重写后的方法访问权限必须大于等于原来方法的访问权限
多态
举例说明:
定义一个Mammal 类和一个继承Mammal 类的Whale 类:
public class Mammal {
public void move(){
system.out.println("哺乳动物可以移动");
};
} //父类
public Whale extends Mammal {
//重写父类Mammal 中的方法move()
public void move(){
system.out.println("鲸鱼靠鱼鳍移动");
}
Mammal mammal = new Whale ();
fanther.move();
} //子类
结果输出:鲸鱼靠鱼鳍移动
说明:
(1)子类新建对象new Whale ();赋值给了父类类型的变量mammal,该变量mammal调用move()方法输出不同于父类类型父类对象应输出的结果,此时便出现了多态;
(2)Java引用变量有两种类型:
编译时类型:由声明该变量时使用的类型决定;
运行时类型:由实际赋给该变量的对象决定;
上例中:mammal的编译时类型是Mammal,运行时类型是Whale,其调用的move()表现出父类方法被重写后的特征,而不是父类里move()的特征,这也就出现了多态;
注意:但如果子类Whale并没有重写move(),且继续调用move()方法输出:哺乳动物可以移动
此时就不能称为多态了;
上转型对象
子类实例化的对象赋值给父类声明变量,则该对象称为上转型对象,这个过程称为对象上转型
例如下;
public class Father {
} //父类
public Son extends Father {
Father father = new Son();
} //子类
father 调用父类方法时,若已被重写则使用的是重写后的方法,若未被重写则为重写前的方法