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 步: 调用本类构造器
- java基础第5天
- java基础第5天
- Java基础总结第(5)天
- java基础第1天
- java基础第2天
- java基础第3天
- java基础第4天
- java基础第6天
- java基础第7天
- java基础第8天
- java基础第9天
- java基础第10天
- java基础第11天
- java基础第12天
- java基础第13天
- java基础第14天
- java基础第15天
- java基础第16天
- https和http有何区别
- iCloud之获取记录
- iScroll 4.2.5 中文API
- CSS控制文字只显示一行,超出部分显示省略号
- 面试题之求两个字符串的最大公共子串
- java基础第5天
- objectAnimation与ValueAnimation的使用
- 什么是机器学习?
- 字符串相关算法
- js上传图片预览
- 对于单行/多行 字符串文本size的 获取,如何取得文本高度和宽度
- Eclipse Hibernate 入门小程序
- 分享一个链接
- HTTP 协议详解