2继承&抽象类 代码块

本文深入探讨了Java中的继承概念,包括继承的入门、特点、成员变量和方法的访问,以及构造方法的使用。此外,还介绍了方法重写、权限修饰符、继承的好处与弊端。进一步讲解了抽象类、抽象方法、模板设计模式和final关键字的应用。最后讨论了代码块的不同类型及其在实际项目中的优化应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、继承

1.继承入门【重点】(视频01) (8‘’)
  1. 继承的概念

    让类与类之间产生关系(子父类关系),子类可以直接使用父类的非私有成员

    注意: private修饰的成员是私有成员

  2. 如何实现继承

    //格式: public class 子类名  extends 父类名{}
    
    //范例
    public class Zi extends Fu{
        
    }
    
2. 继承的特点【理解】(视频03) (5‘’)
  1. 继承的特点

    java只支持单继承,不支持多继承,但支持多层继承

    public class A {
        public void methodA(){
            System.out.println("AAA..类中的method方法");
        }
    }
    
    public class B extends A {
        public void methodB(){
            System.out.println("BBB...类中的method方法");
        }
    }
    
    public class C extends B{
    
    }
    

    注意事项 : 多层继承具有传递性,即子类同样可以直接使用爷爷类的非私有成员

    public class TestExtends {
        
        public static void main(String[] args) {
            C c = new C();
            c.methodA();
            c.methodB();
        }
        
    }
    
3. 继承中成员变量的访问特点【了解】(视频04) (6‘’)
  1. 继承中成员变量的访问

    在子类方法中访问一个变量,采用的是就近原则

    注意: 如果一定要使用父类的,可以通过super关键字,进行区分

    public class Fu {
        int a = 10;
    }
    
    public class Zi extends Fu {
    
        // 子父类当中, 出现了重名的成员变量
        int a = 20;
    
        public void method(){
    
            int a = 30;
    
            System.out.println(a);  // 30
    
            // 需求1: 在控制台打印本类成员变量 20
            System.out.println(this.a);
    
            // 需求2: 在控制台打印父类成员变量 10
            System.out.println(super.a);
        }
    }
    
自由练习-6分钟 (继承的特点,相关代码)
4. this和super访问成员的格式【】(视频05) (2‘’)
  1. this和super访问成员的格式

    this : 代表本类对象的引用

    super : 代表父类对象的引用

    关键字成员变量成员方法构造方法
    thisthis.成员变量this.成员方法()this(…)
    supersuper.成员变量super.成员方法()super(…)
5. 继承中成员方法的访问特点【】(视频06) (5‘’)
  1. 继承中成员方法的访问

    子类对象访问一个方法,同样采用的是就近原则

    注意: 如果一定要使用父类的,可以通过super关键字,进行区分

    public class Fu {
        public void show(){
            System.out.println("父类show方法");
        }
    }
    
    public class Zi extends Fu {
        public void show(){
            System.out.println("子类show方法");
        }
    
        public void method(){
            this.show();
            super.show();
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Zi z = new Zi();
            z.method();
        }
    }
    
6. 方法重写概述和应用场景【重点】(视频07) (9‘’)
  1. 方法重写概述

    子类出现了和父类中一模一样的方法声明(方法名, 参数列表, 返回值类型 都必须一样)

      public class iPearV1 {
      
          public void smallBlack() {
              System.out.println("speak english...");
          }
          
      }
    
      public class iPearV2 extends iPearV1 {
      
          public void smallBlack(){
              System.out.println("说中文");
          }
          
      }
    
  2. 方法重写的应用场景

    在原有的功能上做扩展 :当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这 样,即沿袭了父类的功能,又定义了子类特有的内容

    public class iPearV1 {
    
        public void smallBlack() {
            System.out.println("speak english...");
        }
        
    }
    
    public class iPearV2 extends iPearV1 {
        /*
           方法重写的应用场景:
                当子类需要父类的功能,而功能主体子类有自己特有内容
                可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
         */
    
        public void smallBlack(){
            super.smallBlack();
            System.out.println("说中文");
        }
    }
    
    

    完全抛弃原有功能,自己重做

    public class Fu {
    
        public void eat() {
            System.out.println("吃胡萝卜丝");
            System.out.println("吃胡萝卜叮");
            System.out.println("喝胡萝卜汤");
        }
        
    }
    
    class Zi extends Fu {
    
        public void eat() {
            System.out.println("吃牛肉");
            System.out.println("吃羊肉");
            System.out.println("喝鱼汤");
        }
    
    }
    
    class test {
        public static void main(String[] args) {
            Zi zi = new Zi();
            zi.eat();
        }
    }
    
  3. 方法重写、方法重载的区别

    方法重写: 在继承体系中, 子类出现了和父类一模一样的方法声明 (方法名, 参数列表, 返回值类型)

    方法重载: 在同一个类中, 方法名相同, 参数列表不同, 与返回值无关.

    public class TestOverload {
    	//方法重载 : 参数列表不同的三种情况
        
        //1.参数个数不同
        private void a(int a) {}
        private void a(int a, int b) {}
    
        //2.参数类型不同
        private void b(String a) {}
        private void b(int a) {}
    
        //3.参数类型不同的情况下,顺序不同
        private void c(String a, int b) {}
        private void c(int a, String b) {}
    
    }
    
7. 方法重写的注意事项【】(视频08) (9‘’)
  1. 方法重写的注意事项

    • 父类中私有方法不能被重写(父类私有成员子类是不能继承的)
    • 父类中静态方法不能被子类重写(如果子类也有一个一模一样的,并不是重写)
    • 子类重写父类方法时,访问权限必须大于等于父类(public > 默认 > 私有)
  2. Override注解

    用来检测当前的方法,是否是重写的方法,起到【校验】的作用

    public class Fu {
        public static void show(){
            System.out.println("Fu...");
        }
    
        void method(){
            System.out.println("Fu...method");
        }
    }
    
    public class Zi extends Fu {
        //@Override   静态方法不能被子类重写
        public static void show() {
            System.out.println("Zi...");
        }
    
        @Override  // 注解: 检查当前的方法是否是一个正确的重写方法
        public void method() {
            
        }
    }
    
自由练习-8分钟(方法重写应用场景)
8. 权限修饰符【了解】(视频09) (7‘’)
  1. 权限修饰符

    修饰符同一个类中同一个包中不同包的子类不同包的无关类
    private
    默认
    protected
    public

    常用

    private 私有的,只有本类可以访问

    public 公共的,所有类都可以访问

9. 继承中构造方法的访问特点【】(视频10) (14‘’)
  1. 继承中构造方法的访问

    子类中所有的构造方法都会默认访问父类中无参的构造方法

    为什么?

    ​ 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有初始化,子类将无法使用父类的数据

    ​ 子类初始化之前,一定要先完成父类初始化

    怎么初始化?

    ​ 构造方法的第一条语句默认都是:super()

    注意: 如果我们编写的类,没有手动指定父类,系统也会自动继承Object(Java继承体系中的最顶层父类)

    public class Person {
        private String name;
        private int age;
    
        public Person(){
            System.out.println("我是父类的空参数构造方法");
        }
        
        public Person(String name, int age){
            this.name = name;
            this.age = age;
            System.out.println("我是父类的带参数构造方法");
        }
    }
    
    public class Student extends Person {
        // 子类自己特有的属性.
        private int score;
    
        public Student(){
            super();
            System.out.println("我是子类的空参数构造方法..........");
        }
    
        public Student(String name, int age, int score){
            super(name,age);
            this.score = score;
            System.out.println("我是子类的带参数构造方法!!!");
        }
    }
    
10. 构造方法的访问特点-父类没有空参构造【】(视频11) (7‘’)
  1. 父类没有空参构造方法,只有带参构造方法,子类怎么办?

    子类需要通过super,手动调用父类的带参的构造方法

    注意: this(…) super(…) 必须放在构造方法的第一行有效语句,并且二者不能共存

    public class Test2 {
        public static void main(String[] args) {
            Zi z = new Zi();
        }
    }
    
    class Fu {
        int age;
    
        //带参数构造方法
        public Fu(int age) {
            this.age = age;
        }
    }
    
    class Zi extends Fu {
    
        public Zi() {
            //this(10);
            super(10);
        }
    
        public Zi(int age) {
            super(age);
        }
    }
    
小结-继承中的构造方法

子类中所有的构造方法都会默认访问父类中无参的构造方法

如果父类没有空参构造方法,子类需要通过super,手动调用父类的带参的构造方法

(注意:实际企业开发中,要保证每一个类都有无参构造)

11.继承的好处和弊端【了解】(视频02) (7‘’)
  1. 继承的好处

    提高了代码的复用性

    提高了代码的维护性

    让类与类之间产生了关系,是多态的前提

  2. 继承的弊端

    继承是入侵性的

    降低了代码的灵活性

    ​ 继承关系,导致子类必须拥有父类非私有属性和方法,让子类自由的世界中多了些约束

    增强了代码的耦合性

    ​ 代码与代码之间存在关联都可以将其称之为”耦合“

在这里插入图片描述

  1. 什么时候去使用继承

    当类与类之间,存在相同(共性)的内容,并且产生了is a 的关系,就可以考虑使用继承,来优化代码

    举例:

    ​ 学生: 姓名,年龄 项目经理: 姓名,工号,工资

    ​ 老师: 姓名,年龄 程序员: 姓名,工号,工资


    ​ 人 : 姓名,年龄 员工: 姓名,工号,工资

12. 代码优化和内存图解【】(视频12) (8‘’)
  1. 继承内存图解

    对象在堆内存中,会单独存在一块super区域,用来存放父类的数据
    在这里插入图片描述

13. 黑马信息管理系统-继承改进【】(视频13) (12‘’)
  • 代码图
    在这里插入图片描述

  • 把学生类和老师类共性的内容向上抽取,抽取到出一个 Person 父类,让学生类和老师类继承 Person 类

    //Person 类
    
    public class Person {
        private String id;
        private String name;
        private String age;
        private String birthday;
    
        public Person() {
        }
    
        public Person(String id, String name, String age, String birthday) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    }
    
    //Student类
    
    public class Student extends Person {
        public Student() {
        }
    
        public Student(String id, String name, String age, String birthday) {
            super(id, name, age, birthday);
        }
    }
    
    //Teacher类
    
    public class Teacher extends Person {
        public Teacher() {
        }
    
        public Teacher(String id, String name, String age, String birthday) {
            super(id, name, age, birthday);
        }
    }
    
  • 优化StudentController类中,inputStudentInfo方法,将setXxx赋值方式,改进为构造方法初始化

    注意:直接修改这种操作方式,不符合我们开发中的一个原则

    ​ 开闭原则 ( 对扩展开放对修改关闭 ) : 尽量在不更改原有代码的前提下以完成需求

    解决:重新创建一个OtherStudentController类,编写新的inputStudentInfo方法

    ​ 在由StudentController类、OtherStudentController类,提取出一个父类BaseStudentController类

    //OtherStudentController类
    
    public class OtherStudentController extends BaseStudentController {
    
        private Scanner sc = new Scanner(System.in);
    
        // 键盘录入学生信息
        // 开闭原则: 对扩展内容开放, 对修改内容关闭
        @Override
        public Student inputStudentInfo(String id) {
            System.out.println("请输入学生姓名:");
            String name = sc.next();
            System.out.println("请输入学生年龄:");
            String age = sc.next();
            System.out.println("请输入学生生日:");
            String birthday = sc.next();
            Student stu = new Student(id,name,age,birthday);
            return stu;
        }
    }
    
    //StudentController类
    
    public class StudentController extends BaseStudentController {
    
        private Scanner sc = new Scanner(System.in);
    
        // 键盘录入学生信息
        // 开闭原则: 对扩展内容开放, 对修改内容关闭
        @Override
        public Student inputStudentInfo(String id) {
            System.out.println("请输入学生姓名:");
            String name = sc.next();
            System.out.println("请输入学生年龄:");
            String age = sc.next();
            System.out.println("请输入学生生日:");
            String birthday = sc.next();
            Student stu = new Student();
            stu.setId(id);
            stu.setName(name);
            stu.setAge(age);
            stu.setBirthday(birthday);
            return stu;
        }
    }
    
    //父类BaseStudentController
    
    public class BaseStudentController {
        // 业务员对象
        private StudentService studentService = new StudentService();
    
        private Scanner sc = new Scanner(System.in);
    
        // 开启学生管理系统, 并展示学生管理系统菜单
        public final void start() {
            //Scanner sc = new Scanner(System.in);
            studentLoop:
            while (true) {
                System.out.println("--------欢迎来到 <学生> 管理系统--------");
                System.out.println("请输入您的选择: 1.添加学生  2.删除学生  3.修改学生  4.查看学生  5.退出");
                String choice = sc.next();
                switch (choice) {
                    case "1":
                        // System.out.println("添加");
                        addStudent();
                        break;
                    case "2":
                        // System.out.println("删除");
                        deleteStudentById();
                        break;
                    case "3":
                        // System.out.println("修改");
                        updateStudent();
                        break;
                    case "4":
                        // System.out.println("查询");
                        findAllStudent();
                        break;
                    case "5":
                        System.out.println("感谢您使用学生管理系统, 再见!");
                        break studentLoop;
                    default:
                        System.out.println("您的输入有误, 请重新输入");
                        break;
                }
            }
        }
    
        // 修改学生方法
        public final void updateStudent() {
            String updateId = inputStudentId();
            Student newStu = inputStudentInfo(updateId);
            studentService.updateStudent(updateId, newStu);
            System.out.println("修改成功!");
        }
    
        // 删除学生方法
        public final void deleteStudentById() {
            String delId = inputStudentId();
            // 3. 调用业务员中的deleteStudentById根据id, 删除学生
            studentService.deleteStudentById(delId);
            // 4. 提示删除成功
            System.out.println("删除成功!");
        }
    
        // 查看学生方法
        public final void findAllStudent() {
            // 1. 调用业务员中的获取方法, 得到学生的对象数组
            Student[] stus = studentService.findAllStudent();
            // 2. 判断数组的内存地址, 是否为null
            if (stus == null) {
                System.out.println("查无信息, 请添加后重试");
                return;
            }
            // 3. 遍历数组, 获取学生信息并打印在控制台
            System.out.println("学号\t\t姓名\t年龄\t生日");
            for (int i = 0; i < stus.length; i++) {
                Student stu = stus[i];
                if (stu != null) {
                    System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
                }
            }
        }
    
        // 添加学生方法
        public final void addStudent() {
            // StudentService studentService = new StudentService();
            // 1. 键盘接收学生信息
            String id;
            while (true) {
                System.out.println("请输入学生id:");
                id = sc.next();
                boolean flag = studentService.isExists(id);
                if (flag) {
                    System.out.println("学号已被占用, 请重新输入");
                } else {
                    break;
                }
            }
    
            Student stu = inputStudentInfo(id);
    
            // 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
            boolean result = studentService.addStudent(stu);
            // 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
            if (result) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        }
    
        // 键盘录入学生id
        public String inputStudentId() {
            String id;
            while (true) {
                System.out.println("请输入学生id:");
                id = sc.next();
                boolean exists = studentService.isExists(id);
                if (!exists) {
                    System.out.println("您输入的id不存在, 请重新输入:");
                } else {
                    break;
                }
            }
            return id;
        }
    
        // 键盘录入学生信息
        // 开闭原则: 对扩展内容开放, 对修改内容关闭
        public Student inputStudentInfo(String id){
            return null;
        }
    }
    
自由练习-10分钟

二、抽象类

1. 抽象类入门【】(视频14) (9‘’)
  1. 抽象方法

    将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法

  2. 抽象类

    如果一个类中存在抽象方法,那么该类就必须声明为抽象类

  3. 抽象类和抽象方法的定义格式

    //抽象类
    public abstract class Animal {
        public void drink(){
            System.out.println("喝水");
        }
    
        public Animal(){
    		
        }
    	
        //抽象方法
        public abstract void eat();
    }
    
  4. 如何使用抽象方法

    1、继承抽象类

    2、重写抽象方法

    public class Dog extends Animal {
        @Override
        public void eat() {
            System.out.println("狗吃肉");
        }
    }
    
2. 抽象类的注意事项【】(视频15) (6‘’)
  1. 抽象类注意事项

    • 抽象类不能实例化
    • 抽象类可以有构造方法
    • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
    • 抽象类的子类
      • 要么重写抽象父类中所有的抽象方法
      • 要么子类本身也是一个抽象类
3.模板设计模式【】(视频16) (10‘’)
  1. 模板设计模式

    设计模式(Design pattern)是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性

    模板设计模式: 把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法
    让使用模板的类(继承抽象类的类)去重写抽象方法实现需求

    小结:模板设计模式的优势,模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可

    /*
        作文模板类
     */
    public abstract class CompositionTemplate {
    
        public void write() {
            System.out.println("<<我的爸爸>>");
    
            body();
    
            System.out.println("啊~ 这就是我的爸爸");
    
        }
    
        public abstract void body();
    

}


```java
public class Tom extends CompositionTemplate {

    @Override
    public void body() {
        System.out.println("那是一个秋天, 风儿那么缠绵,记忆中, " +
                "那天爸爸骑车接我放学回家,我的脚卡在了自行车链当中, 爸爸蹬不动,他就站起来蹬...");
    }

}
自由练习-8分钟
4. final关键字【重点】(视频17) (14‘’)
  • fianl关键字概述

    final代表最终的意思,可以修饰: 类、成员方法、成员变量

  • final修饰类、成员方法、成员变量的效果

    fianl修饰类: 表示该类是最终类,不能被继承。 (不能有子类,但是可以有父类)

    final修饰方法: 表示该方法是最终方法, 不能被重写

    final修饰变量: 表明该变量是一个常量,不能再次赋值

    ​ 变量是基本类型: 数据值不能发生改变

    ​ 变量是引用类型: 地址值不能发生改变,但是地址里面的内容是可以发生改变的

  • 常量的命名规范

    如果是一个单词, 所有字母大写, 如果是多个单词, 所有字母大写, 但是中间需要使用_分隔

    public class TestFinal {
        /*
            final修饰变量:
    
                基本数据类型变量: 其值不能被更改
    
                引用数据类型变量: 地址值不能被更改, 但是可以修改对象的属性值
         */
        public static void main(String[] args) {
            // 常量的命名规范: 如果是一个单词, 所有字母大写, 如果是多个单词, 所有字母大写, 但是中间需要使用_分隔
            final int A = 10;
            // a = 10;
            final int MAX = 10;
            final int MAX_VALUE = 20;
    
            final Student stu = new Student();
            stu.setName("张三");
            stu.setName("李四");
    
            // stu = new Student();
        }
    }
    
    class Student {
        // final修饰成员变量 初始化时机
        // 1. 在创建的时候, 直接给值
        // 2. 在构造方法结束之前, 完成赋值
        final int a = 10;
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
  • String是引用类型,为什么使用fianl修饰后不能改变值呢

    String每次赋值都是创建了一个新的对象,地址值发生了改变

    public class Demo1String {
        /*
            Java程序中, 所有的双引号字符串, 都是String这个类的对象
    
            字符串是常量;它们的值在创建之后不能更改
         */
        public static void main(String[] args) {
            String s1 = "abc123";
            int length = s1.length();
            System.out.println(length);
    
            s1 = "def";  // 这一步是让s1这个字符串类型的变量, 记录了一个新的对象.
    
            System.out.println(s1);
    
        }
    }
    
5. 黑马信息管理系统-抽象类改进【】(视频18) (2‘’)
  • BaseStudentController类改为抽象类,inputStudentInfo方法改为抽象方法

  • BaseStudentController类中不需要重写的方法,使用final进行修饰

    public abstract class BaseStudentController {
        // 业务员对象
        private StudentService studentService = new StudentService();
    
        private Scanner sc = new Scanner(System.in);
    
        // 开启学生管理系统, 并展示学生管理系统菜单
        public final void start() {
            //Scanner sc = new Scanner(System.in);
            studentLoop:
            while (true) {
                System.out.println("--------欢迎来到 <学生> 管理系统--------");
                System.out.println("请输入您的选择: 1.添加学生  2.删除学生  3.修改学生  4.查看学生  5.退出");
                String choice = sc.next();
                switch (choice) {
                    case "1":
                        // System.out.println("添加");
                        addStudent();
                        break;
                    case "2":
                        // System.out.println("删除");
                        deleteStudentById();
                        break;
                    case "3":
                        // System.out.println("修改");
                        updateStudent();
                        break;
                    case "4":
                        // System.out.println("查询");
                        findAllStudent();
                        break;
                    case "5":
                        System.out.println("感谢您使用学生管理系统, 再见!");
                        break studentLoop;
                    default:
                        System.out.println("您的输入有误, 请重新输入");
                        break;
                }
            }
        }
    
        // 修改学生方法
        public final void updateStudent() {
            String updateId = inputStudentId();
            Student newStu = inputStudentInfo(updateId);
            studentService.updateStudent(updateId, newStu);
    
            System.out.println("修改成功!");
        }
    
        // 删除学生方法
        public final void deleteStudentById() {
            String delId = inputStudentId();
            // 3. 调用业务员中的deleteStudentById根据id, 删除学生
            studentService.deleteStudentById(delId);
            // 4. 提示删除成功
            System.out.println("删除成功!");
        }
    
        // 查看学生方法
        public final void findAllStudent() {
            // 1. 调用业务员中的获取方法, 得到学生的对象数组
            Student[] stus = studentService.findAllStudent();
            // 2. 判断数组的内存地址, 是否为null
            if (stus == null) {
                System.out.println("查无信息, 请添加后重试");
                return;
            }
            // 3. 遍历数组, 获取学生信息并打印在控制台
            System.out.println("学号\t\t姓名\t年龄\t生日");
            for (int i = 0; i < stus.length; i++) {
                Student stu = stus[i];
                if (stu != null) {
                    System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
                }
            }
        }
    
        // 添加学生方法
        public final void addStudent() {
            // StudentService studentService = new StudentService();
            // 1. 键盘接收学生信息
            String id;
            while (true) {
                System.out.println("请输入学生id:");
                id = sc.next();
                boolean flag = studentService.isExists(id);
                if (flag) {
                    System.out.println("学号已被占用, 请重新输入");
                } else {
                    break;
                }
            }
    
            Student stu = inputStudentInfo(id);
    
            // 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
            boolean result = studentService.addStudent(stu);
            // 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
            if (result) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        }
    
        // 键盘录入学生id
        public String inputStudentId() {
            String id;
            while (true) {
                System.out.println("请输入学生id:");
                id = sc.next();
                boolean exists = studentService.isExists(id);
                if (!exists) {
                    System.out.println("您输入的id不存在, 请重新输入:");
                } else {
                    break;
                }
            }
            return id;
        }
    
        // 键盘录入学生信息
        // 开闭原则: 对扩展内容开放, 对修改内容关闭
        public abstract Student inputStudentInfo(String id);
    }
    

三、代码块

1. 代码块【】(视频19) (12‘’)
  1. 代码块概述

    在Java中,使用 { } 括起来的代码被称为代码块

  2. 代码块分类

    • 局部代码块

      位置:方法中定义
      作用:限定变量的生命周期,及早释放,提高内存利用率

    • 构造代码块

      位置:类中方法外定义
      特点:每次执行构造方法时,都会执行该代码块中的代码,并且在super()语句之后执行
      作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性

    • 静态代码块

      位置:类中方法外定义
      特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
      作用:在类加载的时候做一些数据初始化的操作

2. 黑马信息管理系统-代码块改进【】(视频20) (3‘’)
  • 添加静态代码块-初始化学生信息

    public class StudentDao {
        // 创建学生对象数组
        private static Student[] stus = new Student[5];
    
        static {
            Student stu1 = new Student("heima001","张三","23","1999-11-11");
            Student stu2 = new Student("heima002","李四","24","2000-11-11");
    
            stus[0] = stu1;
            stus[1] = stu2;
        }
        
    	........
    }
    
    System.out.println("您输入的id不存在, 请重新输入:");
            } else {
                break;
            }
        }
        return id;
    }
    
    // 键盘录入学生信息
    // 开闭原则: 对扩展内容开放, 对修改内容关闭
    public abstract Student inputStudentInfo(String id);
    

    }

    
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InLoadwetrust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值