案例一
需求
人类: (Person)
成员变量: 姓名, 年龄
老师类
成员变量: 姓名, 年龄
成员方法: teach
姓名为张三, 年龄为30岁的老师正在讲课
学生类
成员变量: 姓名, 年龄, 成绩
成员方法: study
姓名为李四, 年龄为20岁, 成绩为100分的学生, 正在学习
父类
package test;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
}
子类
老师类
package test;
public class Teacher extends Person {
public Teacher() {
}
public Teacher(String name, int age) {
super(name, age);
}
public void teach() {
System.out.println("姓名为" + super.getName() + ", 年龄为" + super.getAge() + "岁的老师正在讲课");
}
}
学生类
package test;
public class Student extends Person {
private double score;
public Student() {
}
public Student(String name, int age, double score) {
super(name, age);
this.score = score;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public void study() {
// 因为在同一个类中
// 所以score可以直接使用,不需要用this关键字
System.out.println("姓名为" + super.getName() + ", 年龄为" + super.getAge() + "岁, 成绩为" + score + "分的学生, 正在学习");
}
}
主方法
package test;
public class Test1 {
public static void main(String[] args) {
Teacher t = new Teacher("张三", 30);
t.teach();
Student stu = new Student("李四", 20, 100);
stu.study();
}
}
案例二
需求
员工类: Employee
成员变量: 姓名,年龄,工资
成员方法: work方法
1、私有成员变量
2、提供空参,带参构造函数
3、提供setXxx和getXxx方法
4、编写work方法(员工工作…)
程序员类: Coder
成员变量: 姓名、年龄、工资
成员方法: work方法
姓名为张三,年龄为23,工资为15000的程序员正在编写代码
1、继承Employee父类
2、提供空参和带参构造函数
3、重写work方法
项目经理类: Manager
成员变量: 姓名,年龄,工资,奖金
成员方法: work方法
姓名为李四,年龄为24,工资为18000,奖金为5000的项目经理正在分配任务…
1、继承Employee父类
2、编写子类特有的成员变量(奖金)。私有化,提供setXxx和getXxx方法
3、提供空参和带参构造函数
4、重写work方法
父类(员工类)
package test;
public class Employee {
private String name;
private int age;
private double salary;
public Employee() {
}
public Employee(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
/**
* 获取
*
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
*
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
*
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
*
* @return salary
*/
public double getSalary() {
return salary;
}
/**
* 设置
*
* @param salary
*/
public void setSalary(double salary) {
this.salary = salary;
}
public void work() {
System.out.println("员工工作...");
}
}
子类
程序员类
package test;
public class Coder extends Employee {
public Coder() {
}
public Coder(String name, int age, double salary) {
super(name, age, salary);
}
@Override
public void work() {
System.out.println("姓名为:" + getName() + ", 年龄为:" + getAge() + ", 工资为" + getSalary() + "的程序员正在编写代码");
}
}
项目经理类
package test;
public class Manager extends Employee {
private double bonus;
public Manager() {
}
public Manager(String name, int age, double salary, double bonus) {
super(name, age, salary);
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("姓名为:" + getName() + ", 年龄为:" + getAge() + ", 工资为:" + getSalary() + ", 奖金为:" + bonus + "的项目经理正在分配任务");
}
}
主方法
package test;
public class Test2 {
public static void main(String[] args) {
Coder c = new Coder("张三", 23, 15000);
c.work();
Manager m = new Manager("李四", 24, 18000, 5000);
m.work();
}
}
this和super
关键字 访问成员变量 访问成员方法 访问构造方法 this
this.本类 成员变量;
this.本类成员方法();
this();
this(...);
本类构造方法super
super.父类成员变量;
super.父类成员方法();
super();
super(...);
父类构造方法
this
代表本类对象的应用
super
代表父类存储空间的标识
this()
和super()
都在争夺构造方法第一行位置,所以二者不能共存。