提高代码复用性
来看看为什么需要继承
三个类都有重复的代码,可以把这共同的代码抽出去,抽出去放到另外一个类里面;下面的3个类和上面的类需要发生一点关系(继承),上面的类叫做 父类(超类,基类,根类),下面的类叫子类(派生类,拓展类)。
① Java类中的继承的语法格式:
class A{}
class B extends A{} 子承父业
A 就是B的父类、基类、根类、超类
B是A的子类、派生类、拓展类
② 验证:子类中是否可以继承到父类中的东西(通过创建子类对象来操作从父类继承的东西)
//父类
public class Person {
static int age;
private String name;
String id;
String sex;
void play(){
System.out.println("人类可以打猎");
}
}
//子类1
public class Girl extends Person{
@Override
void play(){
System.out.println("逛街");
}
void p(){
super.play();
}
}
//子类2
public class Boy extends Person {
@Override
void play(){
System.out.println("打游戏");
}
}
//测试类 来看看能不能重父类拿到东西
public class MyText {
public static void main(String[] args) {
Girl girl = new Girl();
girl.play();
}
}
私有化的属性不能被子类继承但是可以提供一些公开的方法来获取私有化属性的值例如
package cn.rh.Text03;
public class Person {
static int age;
private String name;
String id;
String sex;
public Person(){
System.out.println("调用无参构造器");
}
public static void textStatis(){
System.out.println("调用静态方法");
}
private void text(){
System.out.println("调用私有化方法");
}
public Person(int age){
System.out.println("调用有参构造器");
}
}
1单继承-一个类只能有一个父类
2多重继承,一个类可以有子类,子类还可以有子类
3一个父类类可以有多个子类
4所有类都有一个隐藏的父类Object
从最高父类构造方法开始执行,逐级向下执行,直到当前类的构造方法结束
当父类提供的方法不不满足子类所需要的逻辑时,子类可以对父类的方法进行重写
重写的方法名应该与父类完全一致,如果不一致那就变成了子类自己创建了一个方法
重写的方法逻辑直接写在子类的方法体中。
---------------------------------------------以下知道就可------------------------------------------------
1)重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。
前提是父类的方法没有被被final(中文意思:最终的,以后讲)修饰
2)子类方法和父类方法的方法签名(方法名+参数列表)完全一致;
3)访问权限 : 子类方法的访问权限 大于等于父类方法的访问权限
4)static/private 方法不能够被重写 (java语法)
5)返回值类型 : 子类方法的返回值类型可以是父类方法的返回值类型的子类或者相等
6)子类抛出的异常(Exception)下是父类相应方法抛出的异常或者相等
public class Animal {
public void eat() {
System.out.println("吃");
}
}
public class Person extends Animal{
@Override//注解,编译期起作用,校验代码
public void eat() {
System.out.println("吃猪");
}
}
public class Pig extends Animal{
public void eat() {
System.out.println("吃白菜。。。。");
}
}
测试代码
/**
* 方法重写测试类
*/
public class AnimalTest {
public static void main(String[] args) {
//创建子类对象
Person person = new Person();
Pig pig = new Pig();
person.eat();//执行子类重写后方法
pig.eat();//执行子类重写后方法
}
}
public class Ostrich extends Bird{
public void fly() {
System.out.println("扑扑翅膀,快速奔跑...");
}
public void say() {
super.fly();//*调用父类被覆盖的方法**
fly();//*调用本类中的方法**
}
}
如果调用被覆写的方法不使用 super 关键字,此时调用的是本类中的方法。
super 关键字表示父类对象的意思,更多的操作,后面再讲。
super.fly()可以翻译成调用父类对象的 fly 方法
:没有方法体,且用abstract修饰的方法
语法:
修饰符 abstract 返回值类型 方法名(...);
抽象方法作用:为了保证业务逻辑合理性,强制子类根据自己的需求,重写方法。
抽象类:就是用abstract修饰的类。
抽象类作用:就是用来装抽象方法的。
语法:
命名一般类名AbstractXxx
修饰符 abstract class AbstractXxx{
实例变量
类变量
实例方法
类方法
构造方法 语法规定:抽象类不能创建对象。只能在子类中通过super使用
抽象方法:修饰符 abstract 返回值类型 方法名(...);
}
抽象类的使用场景: 一般作为业务父类(基类,模板类),且业务父类中,有的方法需要所有子类强制重写。例如,模板方法模式。