5.1.5多态
01-描述
子类的每个对象也是父类的对象。
例,将子类对象赋给父类变量。
Employee e; // 父类
e = new Manager(); // 将子类的对象赋给父类变量。
反之则不能将父类引用赋给子类变量。
5.1.6方法调用
5.1.7final类和方法
01-描述
不允许被扩展的类称为final类,加了final修饰符,就说明这个类是final类。
将父类里面的方法声明为final,则子类就不能修改这个方法。
父类中的getName被声明为final后:
public final String getName() {
return name;
}
我们只能在子类中访问这个方法,不能修改这个方法,否则会出现错误。
02-目的
将方法或类声明为final的主要目的是:确保不会被修改。
5.1.8强制类型转换
01-定义
将一个类型强制转换成另一个类型的过程被称为类型转换。
我们将子类的引用赋给一个父类对象,是被允许的,反之,如果将一个父类的引用赋给一个子类变量,必须进行强制转换。
Manager m = (Manager) e; // 将父类Employee转换成子类Manager,需要进行类型转换
Employee q = m; // 将子类Manager转换成父类Employee,则不需要进行类型转换
5.·9抽象类
我们拿Person人和Student学生、雇员Employee进行举例说明。
01-定义
包含一个或多个抽象方法的类本身必须被声明为抽象的。
如果我们不清楚Person里面应该提供的内容,可以先返回一个字符串。我们可以使用abstract关键字,这样完全就不需要实现这个方法了。
public abstract class Person {
public abstract String getDescription();
}
02-扩展抽象类
1.在抽象类中定义部分抽象类方法或不定义抽象类方法,这样必须将子类也标记为抽象类。
2.定义全部的抽象方法,这样一来,子类就不是抽象的了。
03-代码
Person:抽象类
package com.eleven.duotai;
/**
* 定义了抽象类person
* @author eleven
*
*/
public abstract class Person {
public abstract String getDescription();
private String name;
// 构造方法
public Person(String name) {
super();
this.name = name;
}
// get方法
public String getName() {
return name;
}
}
Student:具体子类
package com.eleven.duotai;
/**
* 具体子类Student和Employee
* @author eleven
*
*/
public class Student extends Person{
private String major; // 专业
public Student(String name,String major) {
super(name);
this.major = major;
}
public String getDescription() {
return "学生主要学习" + major;
}
}
Employee:具体子类
package com.eleven.duotai;
import java.time.LocalDate;
public class Employee extends Person{
private double salary;
private LocalDate hireDay;
// get方法
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void setHireDay(LocalDate hireDay) {
this.hireDay = hireDay;
}
// 构造方法
public Employee(String name,double salary,int year,int month,int day) {
super(name);
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
}
// 描述方法
public String getDescription() {
return String.format("员工的工资为$%.2f", salary);
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary +=raise;
}
}
PersonTest:
package com.eleven.duotai;
public class PersonTest {
public static void main(String[] args) {
// 创建一个person数组
Person[] p = new Person[2];
// 引用子类的对象
p[0] = new Employee("李四",5000,2000,12,12);
p[1] = new Student("李四", "计算机科学与技术");
// 循环输出
for (Person people : p) {
System.out.println(people.getName() + "," + people.getDescription());
}
}
}
5.10受保护访问
类中的域标记为private,方法标记为public。
因为子类不能够访问父类中的私有域,为了能够让子类访问父类的方法或者是父类的某个域,我们可以声明为proteced,这样子类就可以直接访问它了。
private:仅对本类可见。
public:对所有类可见。
proteced:对本包和所有子类可见。
对本包可见,默认不需要修饰符。