Java【14_1】初始化块、多态(测试题)
测试题
1、写出程序结果 (仔细认真)
public class MyClass{
static int x,y;
{
x=5;
x--;
}
static{
x--;
}
public static void main(String[] args) {
x--;
myMethod();
System.out.println(x+y + ++x);
}
public static void myMethod() {
y=x++ + ++x;
}
}
2、写出下列程序运行结果
public class MyClass {
public static void main(String[] args) {
Base b1 = new Base();
Base b2 = new Sub();
System.out.println(b1.name);
System.out.println(b2.name);
}
}
class Base {
String name="Base";
Base() {
this.method(100);
}
public void method(int i) {
System.out.println("base : " + i);
}
}
class Sub extends Base {
String name="Sub";
Sub() {
super.method(70);
}
public void method(int j) {
System.out.println("sub : " + j);
}
}
测试题1:-1
【分析1】
{
x=5;
x--;
}
实例初始化块
每次实例化对象自动执行的一个代码块。
MyClass中的main函数,没有出现过 new MyClass ,实例初始化块不会执行!
测试题2:
base : 100
sub : 100
base : 70
Base
Base
【分析2】
Base b2 = new Sub();
执行到上面这一句时,
因为每一个构造器的首行都默认存在一行代码 super() 默认调用父类无参。Java【11】中提到过!
Sub() {
super();
super.method(70);
}
案例1:
1、在com.atguigu.bean包中声明员工类(Employee)、程序员类(Programmer)、设计师类(Designer)、架构师类(Architect),这四个类相邻为父子关系。
- 员工类属性:编号、姓名、年龄、薪资
- 程序员类属性:编程语言,默认都是"java"
- 设计师类属性:奖金
- 架构师类属性:持有股票数量
要求:属性私有化,无参有参构造,get/set,getInfo方法(考虑重写)
2、在com.atguigu.test包中声明Test13测试类
(1)在main中有一些常量和一个二维数组
final int EMPLOYEE = 10;//表示普通员工
final int PROGRAMMER = 11;//表示程序员
final int DESIGNER = 12;//表示设计师
final int ARCHITECT = 13;//表示架构师
String[][] EMPLOYEES = {
{"10", "1", "段誉", "22", "3000"},
{"13", "2", "令狐冲", "32", "18000", "15000", "2000"},
{"11", "3", "任我行", "23", "7000"},
{"11", "4", "张三丰", "24", "7300"},
{"12", "5", "周芷若", "28", "10000", "5000"},
{"11", "6", "赵敏", "22", "6800"},
{"12", "7", "张无忌", "29", "10800","5200"},
{"13", "8", "韦小宝", "30", "19800", "15000", "2500"},
{"12", "9", "杨过", "26", "9800", "5500"},
{"11", "10", "小龙女", "21", "6600"},
{"11", "11", "郭靖", "25", "7100"},
{"12", "12", "黄蓉", "27", "9600", "4800"}
};
(2)创建一个员工数组
(3)根据以上数据,初始化员工数组
提示:把字符串转为int和double类型的值,可以使用如下方式:
String idStr = "1";
int id = Integer.parseInt(idStr);
String salaryStr = "7300";
double salary = Double.parseDouble(salaryStr);
(4)遍历数组,使用如下格式
编号 姓名 年龄 薪资 语言 奖金 股票
【操作步骤】
步骤1:打开“IntelliJ IDEA 2019.2.3 x64”Java开发软件,顶部菜单选择:
File - New - Project... ,弹出窗口中选择“Empty Project”- 点击 Next
Project name: java0225
Project location: D:\javademo\java0225
点击 Finish
步骤2:顶部菜单选择:
File - New - Module... ,弹出窗口中选择“Java”- Module SDK: 1.8 - 点击 Next
Module name: day13
Content root: D:\javademo\java0225\day13
Module file location: D:\javademo\java0225\day13
点击 Finish
步骤3:点击 day13 下面的 “src”右击:
New - Java Class - 输入:com.atguigu.bean.Employee
回车(键盘Enter确定)创建如下类:
【路径】bean/Employee.java
package com.atguigu.bean;
public class Employee {
private int id;
private String name;
private int age;
private double salary;
public Employee(int id, String name, int age, double salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public Employee() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getInfo(){
return id+"\t"+name+"\t"+age+"\t"+salary;
}
}
【路径】bean/Programmer.java
package com.atguigu.bean;
public class Programmer extends Employee {
private String language="java";
public Programmer(int id, String name, int age, double salary, String language) {
super(id, name, age, salary);
this.language = language;
}
public Programmer() {
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
/*public String getInfo(){
return getId()+""+getName()+""+getAge()+""+getSalary()+""+language;
}*/
public String getInfo(){//死递归
return super.getInfo()+"\t"+language;
}
}
【路径】bean/Designer.java
package com.atguigu.bean;
public class Designer extends Programmer {
private double bonus;
public Designer(int id, String name, int age, double salary, String language, double bonus) {
super(id, name, age, salary, language);
this.bonus = bonus;
}
public Designer() {
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
public String getInfo(){
return super.getInfo()+"\t"+bonus;
}
}
【路径】bean/Architect.java
package com.atguigu.bean;
public class Architect extends Designer{
private double stock;
public Architect(int id, String name, int age, double salary, String language, double bonus, double stock) {
super(id, name, age, salary, language, bonus);
this.stock = stock;
}
public Architect() {
}
public double getStock() {
return stock;
}
public void setStock(double stock) {
this.stock = stock;
}
public String getInfo(){
return super.getInfo()+"\t"+stock;
}
}
【路径】test/Test13.java
package com.atguigu.test;
import com.atguigu.bean.*;
public class Test13 {
public static void main(String[] args) {
final int EMPLOYEE = 10;//表示普通员工
final int PROGRAMMER = 11;//表示程序员
final int DESIGNER = 12;//表示设计师
final int ARCHITECT = 13;//表示架构师
String[][] EMPLOYEES = {
{"10", "1", "段誉", "22", "3000"},
{"13", "2", "令狐冲", "32", "18000", "15000", "2000"},
{"11", "3", "任我行", "23", "7000"},
{"11", "4", "张三丰", "24", "7300"},
{"12", "5", "周芷若", "28", "10000", "5000"},
{"11", "6", "赵敏", "22", "6800"},
{"12", "7", "张无忌", "29", "10800","5200"},
{"13", "8", "韦小宝", "30", "19800", "15000", "2500"},
{"12", "9", "杨过", "26", "9800", "5500"},
{"11", "10", "小龙女", "21", "6600"},
{"11", "11", "郭靖", "25", "7100"},
{"12", "12", "黄蓉", "27", "9600", "4800"}
};
//1. 创建存储员工的数组
Employee[] employees=new Employee[EMPLOYEES.length];
//2. 循环二维数组,产生对象的属性值
for (int i = 0; i < EMPLOYEES.length; i++) {
String flag=EMPLOYEES[i][0];//每个小数组的第一个值
//兼容性好以下(String被switch支持是1.7的版本)
int num=Integer.parseInt(flag);
int id=Integer.parseInt(EMPLOYEES[i][1]);
String name=EMPLOYEES[i][2];
int age=Integer.parseInt(EMPLOYEES[i][3]);
double salary=Double.parseDouble(EMPLOYEES[i][4]);
switch (num){
case EMPLOYEE:
employees[i]=new Employee(id,name,age,salary);
break;
case PROGRAMMER:
employees[i]=new Programmer(id,name,age,salary,"java");
break;
case DESIGNER:
double bonus=Double.parseDouble(EMPLOYEES[i][5]);
employees[i]=new Designer(id,name,age,salary,"java",bonus);
break;
case ARCHITECT:
double bonus1=Double.parseDouble(EMPLOYEES[i][5]);
double stock=Double.parseDouble(EMPLOYEES[i][6]);
employees[i]=new Architect(id,name,age,salary,"java",bonus1,stock);
break;
}
}
//展示信息
System.out.println("编号\t姓名\t年龄\t工资\t语言\t奖金\t股票");
for (int i = 0; i <employees.length ; i++) {
System.out.println(employees[i].getInfo());
}
}
}
在Test13.java文件中,右击 - Debug 'Test13.main()'
输出如下:
编号 姓名 年龄 工资 语言 奖金 股票
1 段誉 22 3000.0
2 令狐冲 32 18000.0 java 15000.0 2000.0
3 任我行 23 7000.0 java
4 张三丰 24 7300.0 java
5 周芷若 28 10000.0 java 5000.0
6 赵敏 22 6800.0 java
7 张无忌 29 10800.0 java 5200.0
8 韦小宝 30 19800.0 java 15000.0 2500.0
9 杨过 26 9800.0 java 5500.0
10 小龙女 21 6600.0 java
11 郭靖 25 7100.0 java
12 黄蓉 27 9600.0 java 4800.0