Java学习(超详细)七(继承)

目录

1.继承

1.1 为什么使用继承

1.2 继承语法

1.3 super

1.4 访问修饰符

1.5 继承初始化顺序

2.重写

2.1 重写

2.2 重写规范规则

3.抽象

3.1 抽象类

3.2 抽象方法

3.3 抽象实战

4.final


本章将开始继承的学习,Java的三大特性(继承,多态,封装)之一

1.继承

1.1 为什么使用继承

多类之间拥有多个相同的属性或是方法,解决方式是将相同的属性和方法抽取出来,封装到一个新的类中,并继承新的类

1.2 继承语法

A  extends  B

核心要点1:如果A extends B==》得出结论:A是B的子类,B是A的父类

核心要点2:Java中一个类只能继承一个父类(单继承关系)

核心要点3:继承的关键字是extends

1.3 super

(1)定义:super关键字来访问(调用)父类的成员

(2)规范:super只能出现在子类的方法和构造方法中

                    super调用构造方法时,只能是第一句

                    super不能访问父类的private成员

(3)super使用方法

public class Pet {
    String name;
    int health;
    private int honey;
    public Pet(){}
    public Pet(int a){}
    public void show(){}
}
public class Dog extends Pet{
    String name;
    int height;
    public void show(){
        //调用父类属性值
        int health = super.health;
        name = super.name;

        //调用父类方法
        super.show();
    }
    public Dog(){
        //调用父类无参构造器
        //特点:必须在第一行,并且在构造器中
        super();
    }
    public Dog(int a){
        //调用父类有参构造器
        //特点:必须在第一行,并且在构造器中
        super(a);
    }
}

1.4 访问修饰符

核心要点1:

  1. private,默认,protected,public都可以在本类中被使用
  2. 在同包不同类中,private修饰的属性不可以被访问,其它三者可以被访问
  3. 在不同包,但属于父子类关系,private,默认修饰的属性不可被访问,其余两者可以被访
  4. 在不同包,也不属于父子类关系,只有public修饰的属性可被访问,其余均不可以被访问

1.5 继承初始化顺序

执行顺序:

1.父类属性初始化-》2.父类构造器初始化-》3.子类属性初始化-》4.子类构造器初始化

2.重写

2.1 重写

核心要点:如下方法构成了重写,子类重写了父类的show()方法

public class Father{
    public void show(){
        System.out.println("父亲的show方法。。。");
    }
}
public class Son extends Father{
    public void show(){
        System.out.println("儿子的show方法。。。");
    }
} 

2.2 重写规范规则

1.方法名相同

2.参数列表相同

3.返回值类型相同或者是其子类

4.访问权限不能严于父类

拓展1:方法重载和重写的区别: 

拓展2:构造方法不能重写 

3.抽象

3.1 抽象类

核心要点:

  1. 抽象类的关键字是abstract
  2. 抽象类的特点是不能实例化(例如new Pet()会报错)
  3. 抽象的方法没有方法体
  4. 抽象类中可以有非抽象方法【特例】
public abstract class Pet{
    String name;
    public abstract void eat();
    public void play(){
        System.out.println("飞盘游戏");
    }
}
public class Dog extends Pet{
    public void eat(){
        System.out.println("吃狗粮");
    }
}
public class Test{
    public static void main(String[]args){
        Dog dog = new Dog();
        System.out.println(dog.name);
        dog.eat();
        dog.play();
    }
}

3.2 抽象方法

1.抽象方法没有方法体

public abstract void eat();

2.抽象方法必须在抽象类里

//Pet类中有抽象方法则Pet类必须是抽象类(或接口)否则报错
public abstract class Pet{
    String name;
    public abstract void eat();
}

3.抽象方法必须在子类中被实现,除非子类是抽象类

//子类必须实现父类抽象方法,除非子类是抽象类
public abstract class Dog extends Pet{
}
public class Dog extends Pet{
    public void eat(){
        System.out.println("吃狗粮");
    }
}

3.3 抽象实战

public abstract class Pet {
    String name;
    int health = 100;
    int honey = 20;
    public abstract void print();
    public void show(){

    }
}
public class Dog extends Pet{
    String pingZhong;
    @Override
    public void print(){
        System.out.println("我是"+name);
        System.out.println("我的健康值:"+health);
        System.out.println("我的亲密度:"+honey);
        System.out.println("我的种类;"+pingZhong);
    }
}
package mykb.day09.demo04;

public class Penguin extends Pet{
    String sex;

    @Override
    public void print(){
        System.out.println("我是"+name);
        System.out.println("我的健康值:"+health);
        System.out.println("我的亲密度:"+honey);
        System.out.println("我的性别;"+sex);
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("欢迎来到宠物店");
        System.out.printf("请输入要领养的宠物名字");
        String name = scanner.next();
        System.out.printf("选择要领养的宠物种类:(1、狗狗 2、企鹅)");
        int n = scanner.nextInt();
        switch (n){
            case 1:
                System.out.println("输入狗狗的种类:(1、聪明的拉布拉多犬  2、酷酷的雪纳瑞");
                int zhongLei = scanner.nextInt();
                Dog dog = new Dog();
                dog.name = name;
                if (zhongLei == 1){
                    dog.pingZhong = "聪明的拉布拉多犬";
                }else if (zhongLei == 2){
                    dog.pingZhong = "酷酷的雪纳瑞";
                }else {
                    System.exit(0);
                }
                dog.print();
                break;
            case 2:
                System.out.println("请选择企鹅的性别:(1、Q仔  2、Q妹");
                int sex = scanner.nextInt();
                Penguin penguin = new Penguin();
                penguin.name = name;
                if (sex == 1){
                    penguin.sex = "Q仔";
                }else if (sex == 2){
                    penguin.sex = "Q妹";
                }else {
                    System.exit(0);
                }
                penguin.print();
                break;
            default:
                System.out.println("输入准确种类");
        }

    }
}

4.final

  1. final修饰类        特点:不能被继承
  2. final修饰方法    特点:不能被重写
  3. final修饰属性    特点:不被二次赋值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值