美文网首页Java
复习JavaSE 5.继承

复习JavaSE 5.继承

作者: 第二套广播体操 | 来源:发表于2019-02-27 17:10 被阅读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));
        }
    
    
    }
    

    相关文章

      网友评论

        本文标题:复习JavaSE 5.继承

        本文链接:https://www.haomeiwen.com/subject/tuszyqtx.html