一、继承
1、什么是继承,继承的作用是什么?
在父类中只定义一些通用的属性和方法,子类可以继承父类的特征和行为,使得子类具有父类的各种属性和方法(例如儿子继承父亲财产)。子类可以重写父类的方法,也可以自己重新定义特有的行为和属性。
继承的作用:提高了代码的复用性,避免重复代码的出现。
继承的基本语法:
class 子类 extends 父类{
} //父类的构造方法不可以被继承
特点:
①在继承关系中,父类和子类需要满足 is a 的关系。
②父类具有子类通用的特征和行为,而子类除了具有父类的特征和行为,还允许具有一些自己特殊的特征和行为。
③单继承性:Java 允许一个类仅能继承一个其它类,即一个类只能有一个父类,这个限制被称做单继承性(一个儿子只能有一个亲爸爸,一个爸爸可以有多个儿子)。后面学到的接口(interface)则允许多继承(接口与接口之间)。
2、继承的应用场景是什么时候?
当两个类具有相同的特征(属性)和行为(方法)时,就可以使用继承的想法,抽取出两个类中相同的特征和方法,将其放入一个具有共性的父类中,然后将这两个类去继承这个父类。
3、 什么是方法重写?
在子类中定义的一个方法,其方法名、返回类型及参数列表与父类中某个方法的方法名、返回类型及参数列表相同,那么子类的这个方法就是父类的方法重写。
方法重写在不同类,是实现多态的必要条件。
4、super关键字的用法
在子类的构造方法中,通过super关键字调用父类的构造方法。
如果子类中重写了父类的方法,能够通过 super.方法名 调用父类的方法。
父类:
public class Fu {
private String name;
private int age;
public Fu(String name, int age) {
this.name = name;
this.age = age;
}
public void method(){
System.out.println("我是父类方法");
System.out.println(this.name + "..." + this.age);
}
}
子类:
public class Zi extends Fu{
public Zi(String name, int age) {
super(name, age);
}
public void play(){
System.out.println("我是子类方法");
super.method();
}
}
测试类:
public class Test01 {
public static void main(String[] args) {
Zi a = new Zi("王大锤",18);
System.out.println("==============");
a.play();
System.out.println("==============");
a.method();
}
}
输出结果:
二、多态
1、什么是多态?多态的体现是什么?
定义(体现):一个引用就可以表现多种形态。(同一个行为,具有不同的形式)
2、多态有什么好处?
可以增强程序的可扩展性及可维护性,使代码更加简洁。
不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。
3、如何实现多态?多态的实现的前提有什么?
多态实现的前提:⑴ 有继承或者实现。
⑵ 要有方法重写。⑶ 父类引用指向子类对象(接口引用指向实现类对象)
4、多态的访问特点
成员变量:编译时看左边,运行时看左边
成员方法:编译时看左边,运行时看右边
这也导致了多态不能访问子类的特有方法,编译不通过。
如何实现:
public class Demo1 {
public static void main(String[] args) {
Cat cat = new Cat();
show(cat);
Dog dog = new Dog();
show(dog);
Monkey m = new Monkey();
show(m);
}
//多态的应用:方法的形参是父类,实参是子类对象
public static void show(Animal a){
a.eat();
}
}
class Animal{
public void eat(){
System.out.println("动物觅食");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃肉");
}
public void lookHome() {
System.out.println("狗看家");
}
}
class Monkey extends Animal{
@Override
public void eat() {
System.out.println("猴子吃香蕉");
}
}
运行结果:
5、多态的优缺点
优点:⑴ 实现组件化和代码解耦。
⑵ 当方法形参为父类或接口时,调用方法时就可以传入任何子类对象或者实现类对象。
缺点:多态的情况下,无法使用子类独有的功能。(规范和统一功能的调用)
6、多态的类型转换
向上转换:自动转换,子类转成父类。(小转大,可看成基本数据类型的转换)
向下转换:强制转换,父类转成子类。
//多态下无法使用子类独有的方法,需要强转才能调用
//强转前需要做类型判断
if(a instanceof Cat){
Cat c = (Cat) a;
c.catchMouse();
c.eat();
}