java基础第5天

来源:互联网 发布:java switch语句 编辑:程序博客网 时间:2024/03/29 23:04

1、继承

继承:用来表达概念上具体化延续的具体概念。

  • 子类继承父类的属性和方法
  • 构造器丌能继承!
  • 实例化子类,会递归分配所有父类的空间
  • 子类构造器一定调用父类构造器
  • 类一定有构造器(父类、子类)

示例代码:

  • 父类
public class Question {    String text;//题干属性    String[]options;//选项    //检测标准答案 参数answers为用户提供的答案    public boolean check(char[]answers) {        return false;    }    public void print() {        System.out.println(this.text);        for (int i = 0; i < this.options.length; i++) {            System.out.println(options[i]+"  ");        }        System.out.println();    }}
  • 子类

方法的覆盖,又叫重写(Overwrite)是根据子类的具体业务对父类方法的重写,如下中的check(char[]answers)

public class SingleQuestion extends Question {    char answers;//单选标准答案    public SingleQuestion(String text,String[]options,char answers) {        this.text=text;        this.options=options;        this.answers=answers;    }    public boolean check(char[]answers) {        if (answers==null||answers.length!=1) {            return false;        }        return this.answers==answers[0];    }}
import java.awt.Checkbox;import java.util.Arrays;public class MultiQuestion extends Question {    char[]answers;//多选标准答案    public MultiQuestion(String text,String[]options,char[]answers) {        this.text=text;        this.options=options;        this.answers=answers;    }    public boolean check(char[] answers) {        return Arrays.equals(this.answers,answers);    }}
  • 调用
import java.util.Arrays;import java.util.Scanner;public class QuestionDemo {    public static void main(String[] args) {        // 考试卷paper是试题的集合        Question[] paper = new Question[2];        paper[0] = new SingleQuestion("题目1(A正确):",                 new String[] { "A:", "B:", "C", "D" },                 'A');        paper[1] = new MultiQuestion("题目2(BCD正确):",                 new String[] { "A:", "B:", "C", "D" },                 new char[] { 'B', 'C', 'D' });        Scanner console = new Scanner(System.in);        for (int i = 0; i < paper.length; i++) {            Question quetsion=paper[i];//取出试卷上的第一题            question.print();            System.out.println("请选择");            String str=console.nextLine();            char[]answers=str.toCharArray();            if (question.check(answers)) {                System.out.println("正确");            }else {                System.out.println("错误");            }        }    }}

2、多态

多态:父类型引用子类型,编译期丌确定什么类型(统一都是 Question 的),运行期才能确定

代码中的question.check(answers)变量 question 既能表示 SingleQuestion,又能表示 MultiChoiseQuestion,体现了多态

question 和 check()方法都是通过”对象的动态绑定“ 实现的多态现象

注:

Java 引用变量有两种类型:一个编译期类型,一个运行时类型。编译时类型由该声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定,如果编译时类型和运行时类型丌一致,就会出现“多态”现象

3、继承中的构造器

这里写图片描述
注:
 子类构造器默认调用父类无参数构造器!
 super()表示调用父类构造器
 使用 super()调用父类构造器,必须写在子类构造器第一行
 this() 必须写在子类构造器第一行
 有 super()就丌能有 this(),两者互斥

这里写图片描述

解决办法:显式调用父类有参构造器

这里写图片描述

注:
 如果父类没有无参数构造器,就必须在子类中明确指定调用父类的有参数构造器!
 编程建议:所有的类都提供无参数构造器!减少继承时候的麻烦

4、对象的实例化过程

实例化过程主要步骤如下:

第 1 步: 在创建类之前,检查类是否加载(是将硬盘上的.class 文件加载到内存中),如果没有加载就加载这个类,在这个类加载之前要加载所有父类。
Java 运行时采用的策略:懒惰式加载(按需加载):如果第一次用到就加载,只加载一次。通过 CLASSPATH 指定的路径寻找类文件(.class),加载以后是一个对象,类型是Class。
第 2 步: 在内存堆中分配对象空间。递归分配所有父类和子类属性空间。属性默认自劢初始化。自劢初始化为“ 0”值。
第 3 步: 迚行属性的赋值。
第 4 步: 递归调用父类构造器。 (默认调用父类无参数构造器!)
第 5 步: 调用本类构造器。

图示及说明如下:
第 1 步: 检查并加载类
首先检查内存中 Koo 有没有加载,如果 Koo 没有加载会加载 Koo 并加载父类 Foo

第 2 步: 在内存堆中分配对象空间
先递归的分配父类型空间(Foo):int a=0(int 类型空间,默认值为 0)
再分配子类型空间(Koo):int b = 0
这里写图片描述

第 3 步: 迚行属性的赋值。
这里写图片描述

第 4 步: 递归调用父类构造器。
这里写图片描述

第 5 步: 调用本类构造器
这里写图片描述

0 0
原创粉丝点击