zoukankan      html  css  js  c++  java
  • 核心技术读书笔记----第5章 继承(一)

    第5章 继承(一)

    1、super:当希望子类调用超类的方法时,使用super.方法名super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。

    public double getSalary(){
    	double baseSalary=super.getSalary();
    	return baseSalary+bonus;
    }
    

    2、子类构造器:子类构造器不能访问超类私有域,必须利用超类构造器对这部分私有域进行初始化,并且此语句必须是子类构造器的第一句话。如果子类没有显示调用超类构造器,则自动调用超类默认构造器。构造函数必须出现在第一行上,注定了只能调用一个构造函数。

    public Manager(String name,double salary,int year,int month,int day){
    	super(name,salary,year,month,day);
    	bonus=0;
    }
    

    3、this作用:1.引用隐式参数 2.调用该类其他的构造器
    super作用:1.调用超类方法 2.调用超类构造器
    注意:调用构造器的语句只能作为另一个构造器的第一条语句出现;构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器。

    4、引用论坛

    java规定,在执行构造函数之前必须执行父类的构造函数,直到这个类是java.lang.Object类的构造函数。
    然而函数的入口是子类构造函数,因此任何构造函数第一句必须是执行父类构造函数,如果没有添加super关键字,那么编译器会为该构造函数第一句添加一个super()语句(你可以这么理解,当然编译以后并不是这样)。如果有super关键字显示的调用父类构造函数,就是用指定的那个父类构造函数,否则使用默认的无参数构造函数。也有一种情况例外,就是存在this关键字,调用本类其它构造函数,但是按照递归调用,最终还是会调用父类构造函数。
    如果你继承的父类没有无参数构造函数,那么你这个类第一句必须显示的调用super关键字来调用父类对应的有参数构造函数,否则不能通过编译。调用本类或者父类的构造函数,必须在构造函数的第一句,或者逻辑上的第一句。

    /*
    作者:mys
    功能:在执行子类构造函数前必须先执行父类的构造函数
    日期:2018/7/19
     */
    package cn.mys;
    
    public class Text7 {
        public static void main(String []args){
            Father father=new Father(40,"sky");
            System.out.println("father:"+father.getName()+" "+father.getAge());
            Son son=new Son(19,"mys");
            System.out.println("father:"+son.getName()+" "+son.getAge());
        }
    }
    //超类
    class Father
    {
        private int age;
        private String name;
    
        public int getAge() {
            return age;
        }
    
        public String getName() {
            return name;
        }
        //无参构造函数
        public Father(){}
        //带参构造函数
        public Father(int age, String name) {
            this.age = age;
            this.name = name;
            System.out.println("超类构造函数");
        }
    }
    //子类
    class Son extends Father{
        public Son(int age, String name){
            super(age,name);//调用超类构造函数初始化超类私有域
            System.out.println("子类构造函数");
        }
    }
    

    5、一个变量可以指示多种实际类型的现象称为多态,在运行时能自动调用哪个方法的现象叫动态绑定。在Java中,不需要将方法声明为虚拟方法,动态绑定是默认的处理方式,如果不希望一个方法具有虚拟方法的特征,则标记为final。

    6、由一个公共类派生出来的所有类的集合称为继承层次;在继承层次中,从某个特定的类到祖先的路径称为该类的继承链。一个祖先类可以有多个子孙继承链,Java不支持多继承

    7、置换法则:“is a ”程序中出现超类对象的任何地方都可以用子类对象替换,可以将一个子类的对象赋值给超类。
    在Java中,对象变量是多态的,一个超类变量可以引用一个超类对象,也可以引用超类的任一个子类对象,不能将一个超类的引用赋值给子类对象
    子类数组的引用可以转换成超类数组的引用,而不需要采用强制转换。注意:所有数组都要牢记创建他们的元素类型,并负责监督仅将类型兼容的引用存到数组中。

    //超类变量可以引用超类的任一个子类对象
    Employee e;
    e=new Employee(...);
    e=new Manager(...);//ok
    
    //不能将一个超类的引用赋值给子类对象
    Manager boss=new Manger(...);
    Employee []staff=new Employee[3];
    boss=staff[0];//变量staff[0]与boss引用同一个对象
    Employee e=staff[0];//Error
    
    //子类数组的引用可以转换成超类数组的引用,而不需要采用强制转换。
    Manager []managers=new Manager();
    Employee []staff=managers;
    
    

    8、方法的调用
    1)编译器查看对象的声明类型和方法名
    2)编译器查看调用方法时提供的参数类型
    重载解析:在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫重载解析
    方法的签名:方法的名字和参数列表
    3)如果是private、public、final或者构造器,那么编译器可以准确知道应该调用那个方法,此调用方式称为静态绑定
    4)当程序运行时,并采用静态绑定的方式,虚拟机一定调用与其引用对象的实际类型最合适的那个类方法。虚拟机事先为每个类创建一个方法表,其中列出所有方法的签名和实际调用方法。如果调用super.f(),编译器将对隐式参数超类的方法表进行搜索。

    9、动态绑定无需对现存的代码进行修改,就可以对程序进行扩展。在覆盖一个方法时,子类方法不能低于超类方法的可见性。

    10、final
    1)不允许扩展的类称为final类
    2)域可以被声明为final,但对域来说,构造对象之后就不能改变它的值
    3)如果将一个类声明为final,只有其中的方法自动成为final,而不包括域。
    4)为了避免动态绑定带来的系统开销而使用final

    11、只能在继承层次内进行类型转换;在将超类转换成子类之前,应先使用instanceof进行检查

  • 相关阅读:
    ExplorerControls的显示问题
    VS选项中没有C#相关设置选项?
    根据点提取栅格值
    原来我的代码暴露在外面!
    .NET反编译之manager,base.AutoScaleMode修复
    无法加载Dll”ArcGISVersion.dll”:0x8007007E
    ArcEngine9.3迁移至ArcObject10.1
    地籍宗地出图(二)
    地籍宗地出图(一)
    CAD设置图层透明显示
  • 原文地址:https://www.cnblogs.com/xq-mys/p/9350191.html
Copyright © 2011-2022 走看看