CoreJava(第五章)继承-02

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:对本包和所有子类可见。

对本包可见,默认不需要修饰符。

发布了90 篇原创文章 · 获赞 284 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41293896/article/details/103979816