Java

复习JavaSE 5.继承

2019-02-27  本文已影响0人  第二套广播体操

子类不可以访问超类的私有域,只能借助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));
    }


}
上一篇下一篇

猜你喜欢

热点阅读