目录
一、继承
1.1 什么是继承?
继承是面向对象的三大特性(封装、继承、多态)之一。
复习:
封装的意义:封装的意义在于可以很好的防止其他类对本类的一些数据随意访问。
封装的体现主要有两点:
1、private关键字
2、getXxxx和setXxx函数
继承指的是子类继承父类的一些属性和行为,使得子类具有和父类相同的属性和行为。
继承的意义:
1、提高了代码的复用性
2、父类和子类的关系,是多态的前提
1.2 继承的写法
extends关键字
class 子类名 extends 父类名{
}
1.3 继承后的一些特性
继承父类后可能会出现父类变量名和方法名与子类变量名和方法名重名的问题,下面分情况说明:
1.3.1 父类变量名与子类变量名重名时
此时若需要调用父类变量,需要用到super.父类变量名;
如果需要调用本类的变量且存在重名的局部变量,需要用到this.子类变量名,
重名的局部变量,直接变量名即可。
public class Father {
int num = 10;
}
public class Son extends Father{
int num = 20;
public void method(){
int num = 30;
// 1、局部变量 直接写
// 2、本类的成员变量 this.成员变量名
// 3、父类的成员变量 super.成员变量名
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(super.num);//10
}
}
1.3.2 父类方法名与子类方法名重名时
此时就会有一个新的概念:覆盖重写(需要注意重写和重载的区别)
方法重写的概念:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效 果,也称为重写或者复写。声明不变,重新实现。
重写的应用:子类可以在父类的方法基础上,实现具有自己特点的功能。
调用父类的构造方法时,可以使用super();调用父类的构造方法。
注意事项:子类对父类的方法进行覆盖重写时,需保证权限大于等于父类的方法。
二、抽象类
2.1 什么是抽象类?
前面有说到继承的概念,当子类继承父类后,就有可能出现父类的原有方法过时或者没有存在的意义,这个时候我们使用抽象方法,即没有方法主体的方法;而类中存在抽象方法的类就是抽象类。
抽象方法:没有方法主体的方法;
抽象类:类中存在抽象方法的类。
2.2 抽象类的定义方式
定义抽象类需要使用到abstract关键字
//Animal抽象类
/*
abstract关键字的位置在权限修饰符之后,返回值之前
抽象方法所在的类必须是抽象抽象类
如何使用抽象类或者抽象方法
1、不能直接创建抽象类对象
2、必须用一个子类来继承抽象类
3、子类必须覆盖抽象父类中的所有抽象方法
*/
public abstract class Animal {
//这是一个抽象方法,代表吃东西但不知道吃什么
public abstract void eat();
//这是普通方法
// public void normalMethod(){
//
// }
}
//Cat子类
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼!!!");
}
}
//Dog子类
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头!!!");
}
}
注意事项:
1、继承了抽象类的子类必须覆盖重写父类的所有的抽象方法,若没有完全的覆盖重写,那么这个子类仍然是一个抽象类。
2、抽象类不能创建对象
3、抽象类可以没有抽象方法,但是有抽象方法的类一定是抽象类