DAY01 面向对象回顾、继承、抽象类

news2025/1/29 8:02:49

学习目标

能够写出类的继承格式
	public class 子类 extends 父类{}
	public class Cat extends Animal{}
能够说出继承的特点
	子类继承父类,就会自动拥有父类非私有的成员
能够说出子类调用父类的成员特点
	1.子类有使用子类自己的
	2.子类没有使用,继承自父类的
	3.子类父类都没有编译报错
能够说出方法重写的概念
	发生在两个类之间
	子类出现了和父类一模一样(返回值类型,方法名,参数列表,修饰符子类大于等于父类)的方法,叫方法重写(Override)
能够说出this可以解决的问题
	1.this.变量名:代表本类的成员变量
	2.this.方法名称():代表本类的成员方法
	3.this(),this(参数):代表调用本类其他的构造方法
能够说出super可以解决的问题
	1.super.变量名:代表父类的成员变量
	2.super.方法名称():代表父类的成员方法
	3.super(),super(参数):代表调用父类的构造方法
描述抽象方法的概念
	没有方法体,被abstract修饰的方法
写出抽象类的格式
	public abstract class 类名{};
写出抽象方法的格式
	权限修饰符 abstract 返回值类型 方法名(参数);
	public abstract void aaa();
	public abstract int bbb();
	public abstract int ccc(String s);
能够说出父类抽象方法的存在意义
	在抽象类中定义类抽象方法,那么子类就必须重写这个抽象方法
	公司中所有的员工都必须工作
	作为模版:让子类强制重写抽象方法,不同的子类添加不同的方法体

一.面向对象回顾

1.面向对象的概念

package com.itheima.demo01Object;

/*
    面向对象:学习的重点记住概念,根据概念写出代码

    面向对象:基于面向过程
    面向过程:当我们遇到一件事情的时候,我们自己分析事情的解决步骤,按照步骤一步一步完成,重视的是解决事情的过程
    面向对象:当我们遇到一件事情的时候,我们不自己完成,找一个能够帮我们完成事情的对象,调用对象的功能完成.重视的是对象

    现实生活中的事物:属性,行为(功能)
        我们可以把现实生活中的事物抽象为java中的类(类是java的基本单位)
        把事物的属性抽象为类中的成员变量(定义在成员位置的变量:类中,方法外)
        把事物的行为抽象为类中的成员方法(定义在成员位置的方法,去掉static关键字)

    封装:私有成员变量,对外提供公共的get/set方法

    构造方法:创建对象就是调用类中的构造方法
    定义格式:
        修饰符 构造方法名-类名(参数){
            为成员变量赋值
        }
    特点:
        1.没有返回值类型,不是void,是根本就没有
        2.没有返回值
        3.必须和类名相同
    构造方法的注意事项:
        1.类中没有定义构造方法,JVM会为类添加一个 默认的空参数的构造方法
            格式: public Student(){ }
        2.类中已经定义了构造方法(空参,带参),那么JVM就不会给类添加默认的构造方法了
            所以我们要使用空参数的构造方法,必须自己手动写出
        3.构造方法是可以重载(在一个类中方法名称相同,但是参数列表不同(个数,顺序,数据类型)的方法)
 */
public class Student {
    //私有成员变量
    private String name;
    private int age;

    public Student() {
        System.out.println("Student类的空参数构造方法!");
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student类的满参数构造方法!");
    }

    //对外提供公共的get/set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.itheima.demo01Object;

/*
    测试类:包含main方法的类
 */
public class Demo01Student {
    public static void main(String[] args) {
        //使用Student类的空参数构造方法创建对象
        Student s1 = new Student();
        //使用set方法给成员变量赋值
        s1.setName("迪丽热巴");
        s1.setAge(18);
        //使用get方法,获取成员变量的值
        System.out.println(s1.getName()+"\t"+s1.getAge());

        //使用Student类的满参数构造方法创建对象
        Student s2 = new Student("古力娜扎",18);
        //使用set方法,修改成员变量的值
        s2.setAge(20);
        //使用get方法,获取成员变量的值
        System.out.println(s2.getName()+"\t"+s2.getAge());
    }
}

2.this关键字

package com.itheima.demo02this;

/*
    this关键字:
        代表本类对象的引用==>根据类创建的对象
        哪个对象调用的方法,方法中的this就是哪个对象

    this关键字作用:当局部变量和成员变量重名时,使用this关键字可以区分局部变量和成员变量
        this.变量名==>成员变量
 */
public class Person {
    private String name;

    //定义成员方法
    public void show(){
        System.out.println("this:"+this);//this:com.itheima.demo02this.Person@4554617c
        String name = "小强";
        System.out.println("name:"+name);//name:小强 变量的就近访问原则
        System.out.println("this.name:"+this.name);//this.name:旺财 this.变量名代表成员变量
    }

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.itheima.demo02this;

public class Demo01This {
    public static void main(String[] args) {
        //创建Person对象
        Person p = new Person("旺财");
        System.out.println("p:"+p);//p:com.itheima.demo02this.Person@4554617c
        p.show();
    }
}

3.对象的内存图

请添加图片描述

4.匿名对象

package com.itheima.demo03Object;

import java.util.ArrayList;

/*
    匿名对象:
        创建对象时,只有创建对象的语句,没有把对象赋值给某个变量,这个对象叫匿名对象
        没有名字的对象
    特点:
        只能使用一次,使用完毕会被JVM在空闲的时候进行垃圾回收
    好处:
        可以节约内存,可以提高程序的效率
    作用:
        一般可以作为方法的参数和返回值使用
 */
public class Demo01Animal {
    public static void main(String[] args) {
        //创建一个有名字的对象:可以重复使用
        Animal a1 = new Animal("Tom");
        a1.eat();
        a1.eat();

        //创建一个匿名对象:只能使用一次
        new Animal("Jerry").eat();
        //如果想要在使用匿名对象,需要重新创建
        new Animal("熊大").eat();
        System.out.println("---------------------------");
        //调用show方法,创建Animal对象为变量a2赋值
        show(a1);
        //如果方法的参数传递的对象只使用一次,就可以使用匿名对象
        show(new Animal("熊二"));
        System.out.println("----------------------------");
        //调用getAnimal方法
        //Animal a4 = getAnimal();==> new Animal("光头强");
        Animal a4 = getAnimal();
        a4.eat();
        System.out.println("----------------------------");
        ArrayList<Animal> list = new ArrayList<>();
        list.add(a1);
        //对象只使用一次,就可以使用匿名对象
        list.add(new Animal("加菲猫"));
    }

    /*
        定义一个方法,方法的参数使用Animal类型
        Animal a2 = a1 = new Animal("Tom");
        Animal a2 = new Animal("熊二")
     */
    public static void show(Animal a2){
        a2.eat();
    }

    /*
        定义一个方法,方法的返回值类型使用Animal
            方法的返回值类型是Animal,就必须在方法中创建一个Animal对象返回
            方法的返回值类型是int,就必须在方法中返回一个整数
            ...
     */
    public static Animal getAnimal(){
        //Animal a3 = new Animal("光头强");
        //return a3;
        //对象只使用一次,就可以使用匿名对象
        return new Animal("光头强");
    }
}
package com.itheima.demo03Object;

public class Animal {
    private String name;

    public void eat(){
        System.out.println(name+"在吃饭!");
    }

    public Animal() {
    }

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

二.继承

1.继承的概念

子类继承父类,子类就会自动拥有父类非私有的成员变量和成员方法
请添加图片描述

2.继承的定义格式

package com.itheima.demo04extends;

/*
    定义父类员工类
        属性:姓名,年龄
        方法:工作
 */
public class Employee {
    //属性:姓名,年龄
    String name;
    int age;

    //方法:工作
    public void work(){
        System.out.println(name+"在呕心沥血的工作!");
    }
}
package com.itheima.demo04extends;

/*
    定义讲师类:讲师是公司员工的一种,所以可以继承员工类
    什么时候使用继承:我是你的一种的使用(is...a)

    继承的格式:
        public class 子类 extends 父类{ }
        子类:Teacher
        父类:Employee
    继承的特点:
        子类继承父类,子类就会自动拥有父类非私有的成员变量和成员方法
        在子类中可以定义子类特有的成员
 */
public class Teacher extends Employee{

    //定义子类特有的打印姓名和年龄的方法
    public void print(){
        System.out.println(name+"\t"+age);
    }
}
package com.itheima.demo04extends;

/*
    定义班主任类:班主任是公司员工的一种,所以可以继承员工类
 */
public class BanZhuRen extends Employee {

}
package com.itheima.demo04extends;

/*
    测试继承:
        测试子类继承父类之后,是否会自动拥有父类非私有的成员

    继承的好处:
        1.可以提高代码的复用性(重复使用)
        2.继承使类与类之间产生了关系,是多态的前提
 */
public class Demo01Extends {
    public static void main(String[] args) {
        //创建子类Teacher对象
        Teacher t = new Teacher();
        //使用子类继承自父类的成员变量
        t.name = "老白";
        t.age = 18;
        //使用子类继承自父类的成员方法
        t.work();
        //使用子类特有的成员
        t.print();

        //定义子类BanZhuRen对象
        BanZhuRen bzr = new BanZhuRen();
        //使用子类继承自父类的成员变量
        bzr.name = "美女";
        bzr.age = 18;
        //使用子类继承自父类的成员方法
        bzr.work();

    }
}

3.继承的注意事项

package com.itheima.demo05extends;

public class Fu {
    private String name;
    private int age;

    //定义一个私有的成员方法
    private void siFangQian(){
        System.out.println("父亲老王的私房钱!");
    }

    public Fu() {
    }

    public Fu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.itheima.demo05extends;

public class Zi extends Fu {
}
package com.itheima.demo05extends;

/*
    继承的注意事项:
        1.构造方法是不能继承的,构造方法是本类创建对象使用的
        2.父类私有成员子类是不能继承的
 */
public class Demo01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        //私有的成员变量子类是不能继承使用
        //System.out.println(zi.name);//'name' has private access in 'com.itheima.demo05extends.Fu'
        //子类可以使用继承自父类公共的get/set方法,通过方法来操作变量
        zi.setName("小王");
        zi.setAge(10);
        //私有的成员方法子类是不能继承使用
        //zi.siFangQian();//'siFangQian()' has private access in 'com.itheima.demo05extends.Fu'
    }
}

4.继承后的特点—成员变量

package com.itheima.demo06Variable;

public class Fu {
    int a = 10;
}

package com.itheima.demo06Variable;

public class Zi1 extends Fu{
    int b = 20;
}

package com.itheima.demo06Variable;

public class Zi2 extends Fu{
    int a = 100;
    int b = 200;
}

package com.itheima.demo06Variable;

/*
    继承后的特点—成员变量
        1.子类有使用子类自己的成员变量
        2.子类没有使用子类继承自父类的成员变量
        3.子类和父类都没有,编译报错
 */
public class Demo01Variable {
    public static void main(String[] args) {
        //创建子类对象
        Zi1 zi1 = new Zi1();
        System.out.println(zi1.a);//10 子类继承父类的
        System.out.println(zi1.b);//20 使用子类自己的

        //创建子类对象
        Zi2 zi2 = new Zi2();
        System.out.println(zi2.a);//100 使用子类自己的
        System.out.println(zi2.b);//200 使用子类自己的
        //System.out.println(zi2.c);//Cannot resolve symbol 'c' 子类和父类都没有,编译报错
    }
}

5.继承后的特点—成员方法

package com.itheima.demo07Method;

public class Fu {
    public void show01(){
        System.out.println("Fu类的show01方法!");
    }
}

package com.itheima.demo07Method;

public class Zi1 extends Fu{
    public void show02(){
        System.out.println("Zi1类的show02方法!");
    }
}

package com.itheima.demo07Method;

public class Zi2 extends Fu{
    public void show01(){
        System.out.println("Zi2类的show01方法!");
    }

    public void show02(){
        System.out.println("Zi2类的show02方法!");
    }
}

package com.itheima.demo07Method;

/*
    继承后的特点—成员方法
        1.子类有使用子类自己的成员方法
        2.子类没有使用子类继承自父类的成员方法
        3.子类和父类都没有,编译报错
 */
public class Demo01Method {
    public static void main(String[] args) {
        //创建子类对象
        Zi1 zi1 = new Zi1();
        //使用子类继承自父类的成员方法show01
        zi1.show01();
        //使用子类自己的成员方法show02
        zi1.show02();

        //创建子类对象
        Zi2 zi2 = new Zi2();
        //使用子类自己的成员方法show01,show02
        zi2.show01();
        zi2.show02();
        //zi2.show03();//Cannot resolve method 'show03()'  子类和父类都没有,编译报错
    }
}

6.方法重写(Override)

package com.itheima.demo08Override;

public class Fu {
    public void show01(){
        System.out.println("Fu类的show01方法!");
    }
}
package com.itheima.demo08Override;

/*
    方法重写:发生在两个类之间,在子类中出现了和父类一模一样的方法,叫方法重写(Override)
        一模一样:
            方法名一样
            参数列表一样
            返回值类型一样
            修饰符一样(子类的修饰符权限大于等于父类的修饰符)
        注解:
            @Override:检查方法是否为重写的方法
   ------------------------------------------------------------
   方法重载:发生在一个类中,在一个类中出现了方法名相同,但是参数列表不同的方法,叫方法重载(Overload)
 */
public class Zi extends Fu{
    @Override
    public void show01(){
        System.out.println("Zi类重写父类的show01方法!");
    }

    public void show01(int a){
        System.out.println("Zi类特有的show01方法!"+a);
    }

    //@Override//Method does not override method from its superclass
    public void show02(){
        System.out.println("Zi类的show02方法!");
    }
}
package com.itheima.demo08Override;

public class Demo01Override {
    public static void main(String[] args) {
        //创建子类对象
        Zi zi = new Zi();
        zi.show01();//调用的是子类重写父类的show01方法
    }
}

7.方法重写的注意事项(了解)

package com.itheima.demo09Override;

public class Fu {
    public void show01(){
        System.out.println("Fu类的show01方法");
    }

    void show02(){
        System.out.println("Fu类的show02方法");
    }

    public void show03(){
        System.out.println("Fu类的show03方法");
    }

    public void show04(){
        System.out.println("Fu类的show04方法");
    }

    private void show05(){
        System.out.println("Fu类的show05方法");
    }
}

package com.itheima.demo09Override;

/*
    方法重写的注意事项:
        1. 方法重写是发生在子父类之间的关系。
        2. 子类方法重写父类方法,必须要保证权限大于等于父类权限。
            java中四大权限修饰符
                public:公共的
                protected:受保护的
                :默认的,不写就是默认的
                private:私有的
        3. 子类方法重写父类方法,返回值类型、方法名和参数列表都要和父类方法一模一样
        4. 私有方法不能被重写(父类的私有方法子类是不能继承)
 */
public class Zi extends Fu{
    //2. 子类方法重写父类方法,必须要保证权限大于等于父类权限。
    /*void show01(){
        System.out.println("Fu类的show01方法");
    }*/

    public void show02(){
        System.out.println("Fu类的show02方法");
    }

    //3. 子类方法重写父类方法,返回值类型、方法名和参数列表都要和父类方法一模一样
    //@Override//Method does not override method from its superclass
    public void show03(int a){
        System.out.println("Zi类的show03方法");
    }

    /*public int show04(){
        System.out.println("Fu类的show03方法");
        return 1;
    }*/

    //@Override//Method does not override method from its superclass
    public void show08(){
        System.out.println("Fu类的show03方法");
    }

    //@Override//Method does not override method from its superclass
    //就相当于在子类中定义了一个自己特有的私有方法,恰好名字和父类方法一样
    private void show05(){
        System.out.println("Zi类的show05方法");
    }
}

8.继承后的特点—构造方法

package com.itheima.demo10Constructor;

public class Fu {
    int a = 10;

    public Fu() {
        System.out.println("Fu类的空参数构造方法!"+a);
    }
}
package com.itheima.demo10Constructor;

public class Zi extends Fu{
    //int a = 1;
    //int b = 2;

    /*
        继承后的特点—构造方法
        在子类构造方法的第一行,有一个默认的super();
        super();作用就是调用父类的空参数构造方法
        子类继承父类,子类想要使用继承自父类的成员,就必须把父类加载到内存中,调用父类的构造方法创建父类对象
        父类进入到内存中,子类才可以使用父类的成员
     */

    public Zi() {
        super();
        System.out.println("Zi类的空参数构造方法!"+a);
    }
}
package com.itheima.demo10Constructor;

public class Demo01Constructor {
    public static void main(String[] args) {
        //创建子类对象
        Zi zi = new Zi();
    }
}

请添加图片描述

9.子父类的内存图解

请添加图片描述

10.使用this关键字和super关键字访问成员

package com.itheima.demo11ThisAndSuper;

public class Animal {
    String name = "猫科动物";

    public void eat(){
        System.out.println("动物在吃饭!");
    }
}

package com.itheima.demo11ThisAndSuper;

/*
    this关键字:本类对象的引用(根据Cat创建的对象)
        this.成员变量:本类的成员变量
        this.成员方法(参数):本类的成员方法
    super关键字:父类对象的引用(根据Animal创建的对象)
        super.成员变量:父类的成员变量
        super.成员方法(参数):父类的成员方法
 */
public class Cat extends Animal {
    String name = "加菲猫";

    public void eat(){
        System.out.println("加菲猫在吃饭!");
    }

    public void show(){
        System.out.println(name);//加菲猫 变量的就近访问原则
        System.out.println("this.name:"+this.name);//加菲猫
        System.out.println("super.name:"+super.name);//猫科动物
        eat();//加菲猫在吃饭!
        this.eat();//加菲猫在吃饭!
        super.eat();//动物在吃饭!
    }
}
package com.itheima.demo11ThisAndSuper;

public class Demo01ThisAndSuper {
    public static void main(String[] args) {
        //创建子类Cat对象
        Cat cat = new Cat();
        cat.show();
    }
}

11.this关键字:调用本类其他的构造方法

package com.itheima.demo12this;

/*
    this关键字:可以调用本类其他的构造方法
    格式:
        this();调用空参数构造方法
        this(参数);调用带参数构造方法
    注意:
        1.this();|this(参数);调用构造方法必须写在构造方法中的第一行,创建对象必须优先执行
        2.构造方法不能相互调用(不能你调用我,我在调用你-->死循环)
 */
public class Animal {
    private String name;
    private int age;

    public Animal() {
        //this("tom",10);//调用带参数构造方法
        System.out.println("Animal类的空参数构造方法!");
    }

    public Animal(String name, int age) {
        this();//调用空参数构造方法
        this.name = name;
        this.age = age;
        System.out.println("Animal类的带参数构造方法!");
    }

    public String getName() {
        //this();//Call to 'this()' must be first statement in constructor body
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package com.itheima.demo12this;

public class Demo01This {
    public static void main(String[] args) {
        //使用空参数构造方法创建Animal对象
        Animal a1 = new Animal();
        System.out.println(a1.getName()+"\t"+a1.getAge());

        /*
            执行结果:
                Animal类的带参数构造方法!
                Animal类的空参数构造方法!
                tom	10
         */

        //使用带参数的构造方法创建Animal对象
        Animal a2 = new Animal("jerry",5);
        System.out.println(a2.getName()+"\t"+a2.getAge());

        /*
            执行结果:
                Animal类的空参数构造方法!
                Animal类的带参数构造方法!
               jerry	5
         */
    }
}

请添加图片描述

12.super关键字:调用父类的构造方法

package com.itheima.demo13super;

public class Fu {
    public Fu() {
        System.out.println("Fu类的空参数构造方法!");
    }

    public Fu(int a) {
        System.out.println("Fu类的带参数构造方法!"+a);
    }
}
package com.itheima.demo13super;

/*
    super关键字:调用父类的构造方法
    格式:
        super();调用父类的空参数构造方法
        super(参数);调用父类带参数构造方法
    注意:
        1.在子类的构造方法中没有写super();有一个默认的super();用于调用父类的空参数构造方法
        2.super();|super(参数);必须写在子类构造方法有效代码的第一行,构造方法必须优先执行
        3.在子类的构造方法中this和super不能同时出现,都必须写在有效代码第一行
 */
public class Zi extends Fu {
    public Zi() {
        super();//调用父类的空参数构造方法,不写默认
        System.out.println("Zi类的空参数构造方法!");
    }

    public Zi(int a){
        super(a);//调用父类的带参数构造方法
        System.out.println("Zi类的带参数构造方法"+a);
    }
}
package com.itheima.demo13super;

public class Demo01Super {
    public static void main(String[] args) {
        //使用Zi类空参数构造方法创建对象
        Zi zi = new Zi();

        //使用Zi类带参数构造方法创建对象
        Zi zi2 = new Zi(100);
    }
}

请添加图片描述

13.继承的特点

请添加图片描述

三.抽象类

1.抽象类&抽象方法概述

请添加图片描述

2.抽象类&抽象方法使用

package com.itheima.demo14abstractClass;

/*
    定义父类员工类:是根据子类共性抽取形成
    定义成员变量:
        姓名,年龄
    定义成员方法:
        工作的方法
            每个子类方法的方法体不同,但是方法的声明相同(public void work())
            只抽取方法的声明,不抽取方法体
            抽取出来的方法声明添加一个关键字abstract,这个方法叫抽象方法
        定义格式:
            修饰符 abstract 返回值类型 方法名(参数);
            public abstract void work();
            public abstract void work(String a);
            public abstract int work(String a);
    包含抽象方法的类,也必须被abstract修饰,叫抽象类
        定义格式:
            public abstract class 类名{}
    ----------------------------------------------------------
    注意:
        1.抽象类是无法直接创建对象使用的
            a.有一些类就是为了不让别人创建对象使用,可以定义为抽象类
            b.抽象类中一般都包含抽象方法,抽象方法没有方法体,创建对象调用抽象方法没有意义
        2.需要创建子类继续抽象父类,重写抽象类中的抽象方法,创建子类对象使用
    ------------------------------------------------------------------------
    好处:
        在抽象类中定义抽象方法,那么子类就必须重写这个抽象方法
        公司中所有的员工都必须工作==>定义了一个模版==>子类都必须根据模版重写抽象方法
 */
public abstract class Employee {
    private String name;
    private int age;

    //定义抽象的工作方法
    public abstract void work();

    public Employee() {
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package com.itheima.demo14abstractClass;

/*
    讲师类是一个员工类的一种,所以可以继承员工类
    讲师类已经能明确自己的工作内容了
    所以需要重写工作的方法,添加方法体

    注意:
        子类继承抽象类有两种处理方式 alt+回车
            1.子类也声明为抽象类(子类包含继承自父类的抽象方法)
            2.子类重写抽象方法,添加方法体
 */
public class Teacher extends Employee{
    @Override
    public void work() {
        System.out.println("正在给大家讲解java!");
    }
}

package com.itheima.demo14abstractClass;

/*
    班主任类是一个员工类的一种,所以可以继承员工类
    班主任类已经能明确自己的工作内容了
    所以需要重写工作的方法,添加方法体

 */
public class BanZhuRen extends Employee{
    @Override
    public void work() {
        System.out.println("正在监督大家学习!");
    }
}

package com.itheima.demo14abstractClass;

//抽象类是无法创建对象使用的
public abstract class JiuYeZhiDao extends Employee{
}
package com.itheima.demo14abstractClass;

public class Demo01AbstractClass {
    public static void main(String[] args) {
        //Employee ee = new Employee();//'Employee' is abstract; cannot be instantiated 抽象类是无法直接创建对象使用的

        //创建子类对象
        Teacher t = new Teacher();
        t.work();

        BanZhuRen bzr = new BanZhuRen();
        bzr.work();

        //JiuYeZhiDao jyzd = new JiuYeZhiDao();//'JiuYeZhiDao' is abstract; cannot be instantiated
    }
}

3.模版设计模式

package com.itheima.demo15driver;

/*
    定义开车类的模版:在父类中调用子类重写后的方法
        定义一些固定的内容(开门,点火,刹车,熄火)
        不同的内容定义为抽象方法(开车姿势不同)
 */
public abstract class Driver {
    //定义开车的方法
    public void driver(){
        System.out.println("开门..............");
        System.out.println("点火..............");
        ziShi();
        System.out.println("刹车..............");
        System.out.println("熄火..............");
    }

    //新司机和老司机开车的姿势不同,定义为抽象方法
    public abstract void ziShi();
}
package com.itheima.demo15driver;

//定义新司机类,是司机类的一种,所以继承司机类
public class NewDriver extends Driver{
    @Override
    public void ziShi() {
        System.out.println("新司机开车的姿势:双手紧握方向盘!");
    }
}
package com.itheima.demo15driver;

//定义老司机类,是司机类的一种,所以继承司机类
public class OldDriver extends Driver{
    @Override
    public void ziShi() {
        System.out.println("老司机开车姿势:右手握方向盘左手抽烟");
    }
}
package com.itheima.demo15driver;

public class Demo01Driver {
    public static void main(String[] args) {
        //创建新司机对象
        NewDriver nd = new NewDriver();
        nd.driver();

        //创建老司机对象
        OldDriver od = new OldDriver();
        od.driver();
    }
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…

PyTorch入门 - 为什么选择PyTorch?

PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后&#xff0c;可以使用以下命令&#xff0c;导入第三方库。 $ import pytorch

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

Linux相关概念和易错知识点(26)(命名管道、共享内存)

目录 1.命名管道 &#xff08;1&#xff09;匿名管道 -> 命名管道 ①匿名管道 ②命名管道 &#xff08;2&#xff09;命名管道的使用 ①创建和删除命名管道文件 ②命名管道文件的特性 ③命名管道和匿名管道的区别 &#xff08;3&#xff09;用命名管道实现进程间通信…

K8S 启动探测、就绪探测、存活探测

先来思考一个问题&#xff1a; 在 Deployment 执行滚动更新 web 应用的时候&#xff0c;总会出现一段时间&#xff0c;Pod 对外提供网络访问&#xff0c;但是页面访问却发生404&#xff0c;这个问题要如何解决呢&#xff1f;学完今天的内容&#xff0c;相信你会有自己的答案。 …

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…

Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

hadoop==docker desktop搭建hadoop

hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f

Linux下的编辑器 —— vim

目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…

C25.【C++ Cont】初识运算符的重载和sort函数

目录 1.为什么要引入运算符重载 2.运算符重载写法 格式 例子 示例代码 运行结果 3.sort函数 两种声明 声明1:默认情况 参数 示例代码1:排整型 示例代码2:排浮点数 ​编辑 示例代码3:排字符串 声明2:自定义情况 参数 comp比较函数的两种写法 写法1:创建比较函…

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

实战网络安全:渗透测试与防御指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增&#xff0c;从数据泄露…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

详解最基本的数据顺序存储结构:顺序表

新的一年&#xff0c;我觉得这张图很合适&#xff01;有梦想&#xff0c;敢拼&#xff0c;马上就是除夕了&#xff0c;希望新的一年我们逢考必过&#xff0c;事事顺心&#xff0c;看见朝阳的你是不是嘴角微微上扬&#xff01; 本篇从0基础白话文讲述顺序表的概念、用法、注意事…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

代码审查中的自动化与AI应用

代码审查&#xff08;Code Review&#xff09;作为软件开发中的一项重要实践&#xff0c;通常被认为是提高代码质量、减少bug和提升团队协作的重要手段。随着开发规模的不断扩大&#xff0c;手动代码审查在效率、准确性、以及可扩展性上都存在明显的局限性。尤其是在敏捷开发和…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…