复习JavaSE 5.继承
子类不可以访问超类的私有域,只能借助super 调用父类的域访问器
super用途:
调用超类方法的特殊关键字 不能将super赋给另一个对象变量
子类构造器中的super() 为调用超类构造器方法
子类没有显示调用超类构造器 则会默认调用超类默认构造器
如果超类没有不带参数的构造器 则会错误
this:引用隐式参数 调用该类中的其他构造器
super:调用超类方法 调用超类构造器
调用构造器,只能作为另一个构造器的第一语句
一个对象变量可以只是多种实际类型的现象被称为多态
在运行时能够自动地选择调用哪一个方法实现 被称为动态绑定
将子类的对象赋值给超类变量
Employee e;
e=new Employee();
e=new Manager();
f(int) f(String)
两个相同的名字 不同签名的方法
如果子类定义一个与超类签名相同的方法 那么子类就可以覆盖
覆盖方法时,允许子类将覆盖方法的返回类型为原类型的子类
private方法 static 方法 final 方法 可以准确知道调用哪个方法
覆盖 子类方法不能低于超类方法的可见性
**
方法名 形式参数相同
返回类型和异常 小于或者等于超类
访问权限 子类大于超类
**
阻止人们利用某个类定义子类,被称为final类
public final class Executive extends Manager
{
}
类中特定方法也可以被声明为final 如果这样做 子类就不能覆盖这个方法
final类所有方法自动成为final方法
public final String getName(){}
域 final 构造对象之后不允许改变他们的值
如果类声明为final 只有几种的方法会自动生成为final 域不变
将一个超类的引用赋给一个子类变量 必须进行类型转换
设计习惯 类型转换之前 先检查一下时候能成功转换
if (staff[i] instanceof Manager){
boss=(Manager) stagg[i];
}
只能在继承层次进行类型转换
在超类转换成子类以前 应该 instanceof 进行检查
多态
多态存在的三个条件 继承 方法重写 父类变量引用子类对象
覆盖的不需要强转 独有的需要
多态引用之间的关系 本身是什么类型 只不过引用不同
覆盖的方法正常调用 独有的方法需要转换类型
可以公有超类一起调用方法 执行各自的方法
抽象类的目的 使程序层次更加清晰
抽象类中也可以有具体方法和数据
抽象类无法实例化
可以定义一个抽象类的对象变量 但是只能引用非抽象子类的对象
protected 对本包或者所有子类可见
==
用来判断两个变量是否相等
对于引用变量 指向同一个对象 相等
equals
object类中的object判断对象相等于==
一致 如果覆盖 按照覆盖方法运行
instanceof
前面的对象是否满足后面类的实例或者子类
重新定义equals方法 必须重新定义hashCode方法
下面给出编写一个完美的equals方法的建议
1 判断是否为同一个对象
2 判断参数是否为空
3 判断是否来源于同一个类
4自定义判断 例如名字 工资
toString();
Object类定义的toString()方法 用来打印出对象所属的类和散列码
覆盖toString方法后
输出对象的引用变量会自动运行覆盖后的方法
打印数组 使用工具类Arrays.toString();
打印多维数组使用Arrays.deepToString();
强烈建议自定义的每一个类都增加一个toString方法
泛型数组列表
动态数组
ArrayList
创建数组方法
通过动态数组创建并转换
Employee[] employees=new Employee[staff.size()];
staff.toArray(employees);
System.out.println(Arrays.toString(employees));
继承设计方法
1.将公共才操作和域放在超类
2.不要使用受保护的域
3.使用继承实现is-a关系
4.除非所有继承的方法都在意义,否则不要使用继承
5.在覆盖方法时不要改变预期的行为
6.使用多态 而非类型信息
action1(x)
else if(x is oftype2)
action2(x)
多态
7.不要使用反射
package JavaSE.Unit5.equals;
import java.time.LocalDate;
import java.util.Objects;
/**
* @ClssName Employee
* @Autor Yu
* @Description TODO
* @Date 2019/2/27 16:21
* Version 1.0
*/
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary, int year,int month,int day) {
this.name = name;
this.salary = salary;
this.hireDay = LocalDate.of(year,month,day);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void raiseSalary(double byPercent){
double raise=salary*byPercent/100;
salary+=raise;
}
@Override
public boolean equals(Object obj) {
if (this==obj) return true;
if (obj==null) return false;
if (getClass()!=obj.getClass())return false;
Employee employee=(Employee) obj;
return this.name.equals(employee.name)&&
this.salary==employee.salary&&
this.hireDay.equals(employee.hireDay);
}
@Override
public int hashCode() {
return Objects.hash(name, salary, hireDay);
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", salary=" + salary +
", hireDay=" + hireDay +
'}';
}
}
package JavaSE.Unit5.equals;
import java.util.Objects;
/**
* @ClssName Manager
* @Autor Yu
* @Description TODO
* @Date 2019/2/27 16:32
* Version 1.0
*/
public class Manager extends Employee {
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
bonus=100;
}
@Override
public double getSalary() {
return super.getSalary()+bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Manager)) return false;
if (!super.equals(o)) return false;
Manager manager = (Manager) o;
return Double.compare(manager.bonus, bonus) == 0;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), bonus);
}
@Override
public String toString() {
return super.toString() +
", bonus=" + bonus +
'}';
}
}
package JavaSE.Unit5.equals;
/**
* @ClssName EqualsTest
* @Autor Yu
* @Description TODO
* @Date 2019/2/27 16:21
* Version 1.0
*/
public class EqualsTest {
public static void main(String[] args) {
Employee alice1=new Employee("Alice Adams",75000,1987,12,15);
Employee alice2=alice1;
Employee alice3=new Employee("Alice Adams",75000,1987,12,15);
Employee bob=new Employee("Bob Brandson",50000,1989,10,1);
System.out.println("alice1==alice2"+(alice1==alice2));
System.out.println("alice1==alice3"+(alice1==alice3));
System.out.println("alice1.equals(alice3)"+alice1.equals(alice3));
System.out.println(bob);
System.out.println(alice1.getClass());
}
}
package JavaSE.Unit5.arrayList;
import JavaSE.Unit5.equals.Employee;
import JavaSE.Unit5.equals.Manager;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @ClssName ArrayListTest
* @Autor Yu
* @Description TODO
* @Date 2019/2/27 16:47
* Version 1.0
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Employee> staff=new ArrayList<>();
staff.add(new Employee("Carl Cracker",75000,1987,12,15));
staff.add(new Employee("Harry Hacker",50000,1989,10,1));
staff.add(new Manager("Tony Jaler",40000,1990,3,15));
for (Employee e:staff)
e.raiseSalary(5);
for (Employee e:staff)
System.out.println("name: "+e.getName()+" salary: "+e.getSalary()+" hireDay: "+e.getHireDay());
// 将动态数组转化为数组
Employee[] employees=new Employee[staff.size()];
staff.toArray(employees);
System.out.println(Arrays.toString(employees));
}
}