zoukankan      html  css  js  c++  java
  • Java学习笔记-4.继承与多态

    一、继承机制

    1.继承:允许一个类作为另一个类的扩充版本

    2.单继承:一个类只继承了一个父类    多继承:一个类继承了多个父类

       Java只支持单继承,C++支持多继承

    二、类的继承

    1.形式:

       class SubClass extends BaseClass {

           //子类类体,定义子类的新成员

       }

       Java中所有的类都直接或间接地继承类 java.lang.Object

    2.构造方法

      (1)显式构造方法    形式:super(参数表);

              系统执行到这条语句时,会根据参数表判断调用父类中哪个构造方法(参数表可以为空)

              注意:使用super调用父类构造方法时,必须放在子类构造方法中的第一句

                       super的参数不可以是this或当前对象的对象成员,因为构造方法还没完成

      (2)隐式构造方法:若子类没有显式构造方法,系统会依次调用父类的默认构造方法和子类的默认构造方法

    3.子类对象的初始化

    顺序:(1)载入类的类文件  (2)从父类到子类,依次初始化静态成员变量

             (3)从父类到子类,依次初始化对象的成员变量  (4)调用类构造方法(首先调用父类)

             (5)从Object类开始初始化块和构造方法,然后回归执行其子类的初始化块和构造方法,依次类推,直至当前类的初始化块和构造方法

    4.子类的对象拥有父类中定义的所有成员,但不能访问父类中的私有成员(private)

    5.覆写:在子类中定义一个与父类中方法名和参数表完全相同的方法

       注意:若子类中方法func()覆写了父类中的方法,则相对于父类的func()方法,子类中方法func()的访问控制不能缩小

                子类中func()方法声明抛出的异常不能超过父类中func()方法声明的

       例:父类中:

             double getIncome() {

                return wage + bonus;    //wage和bonus均为private修饰的

             }

             子类中:

             double getIncome() {

                return super.getIncome() + dividend;    //super表示调用父类的getIncome方法

             }

    三、对象类型转换和多态

    1.多态:同一个实体同时具有多种形式,这样可以提高代码的可重用性

    2.对象类型转换分为向上转型和向下转型

       向上转型:子类的对象被看做父类的对象来使用

                      这样的类型转换是安全的,但会丢失子类中新定义的那些信息

       向下转型:父类的对象被看做子类的对象来使用(需要使用强制转换)

                      这种类型转换时不安全的,有可能造成信息的缺失

    3.Java中通过覆写机制可以在继承关系的若干类中定义方法名、参数表、返回值相同但方法体不同的方法,在程序运行时,根据所引用对象的类型来判断执行哪个方法,这称为动态绑定(即运行时确定执行哪个方法)

       Java中只有私有方法、final修饰的方法、静态方法是静态绑定(即编译时绑定)的

    四、关键词final

    1.final可以用于修饰变量、方法和类,表示被修饰的东西只能做一次初始化,之后不能发生改变

       当final修饰方法参变量时,表示方法中不会对参变量的值做修改

       final修饰的静态成员变量必须在声明时或在静态初始化块中初始化

       final修饰的方法在继承过程中不能被覆写

       final修饰的类不能被其他类继承

    2.final类没有子类,final类的成员方法不会被覆写,final类的成员变量却不一定是常变量

    五、抽象方法与抽象类

    1.抽象方法:只有方法名、参数表、返回值,没有方法体(不能被执行)

       声明语法: abstract returnType function(parameters list);    //没有大括号

                       在方法声明前用关键字abstract修饰

       抽象方法可以被覆写

       静态方法、私有方法和final修饰的方法不能被覆写,因此不能定义为抽象方法

    2.抽象类:没有具体对象的类,语法:在类定义前用关键词abstract修饰

    3.注意:

       (1)如果某个类含有抽象方法,那么这个类必须定义为抽象类,但抽象类可以没有抽象方法

       (2)抽象类不可以创建对象

    4.若抽象类的一个子类未实现父类的抽象方法,这个子类也是抽象类,必须用关键字abstract修饰

       作用:抽象类保证了其所有子类若可以实例化,则必须实现抽象类中声明的抽象方法

    六、接口

    1.定义形式:interface interfaceName {…}

       成员方法默认为抽象的、公有的,成员属性默认为静态的、final修饰的

       接口只是提供一种形式,具体的实现细节交由它的类完成

       由于接口不涉及具体的实现,因此在接口中的成员变量是静态常变量,默认为static和final修饰

    2.类实现一个接口:class MyClass implements A, B, C {…}

       一个类可以实现多各个接口

       注意:虽然在接口中没有显式声明方法是公有的,但接口中默认的访问控制是公有的,而类中默认的访问控制是包内友好,所以必须在类中将这个方法用public修饰

    3.接口和抽象类的选择:

       Java中类之间不支持多继承,但类可以实现多个接口

       若类需要包含一些方法的实现,必须实现为抽象类,其他情况两者皆可,优先选择使用接口,使程序更加易于扩展

    七、内部类和匿名内部类

    1.Java允许在类的内部定义另一个类,称这个在类体内部的类为内部类,包含内部类的类为外部类

       内部类中可以访问外部类的方法、属性

       与一般类的不同:外部类可以访问其内部类的私有成员

    2.在其他类中只可以访问public或默认访问控制的内部类,不能创建私有的内部类对象

       且创建内部类对象时必须有相应的外部类对象,但创建静态内部类的对象时可以通过外部类类名

    3.在其他类中创建内部类对象

       例:

    class OuterClass {
        class InnerClassA{}    //创建内部类对象时需要外部类对象
        private class InnerClassB{}    //不能创建私有内部类对象
        static class InnerStaticClass{}    //可通过类名创建静态内部类对象
    }
    class InnerClassDemo {
        public static void main(String[] args) {
            OuterClass out = new OuterClass();
            OuterClass.InnerClassA inner = out.new InnerClassA();
            OuterClass.InnerStaticClass a = new OuterClass.InnerStaticClass();
        }
    }

    4.匿名内部类:没有类名的内部类

       匿名内部类无法定义构造方法

    八、Object类

    1.类java.lang.Object是所有Java类的父类

       设计Object类的作用:(1)可以声明Object类型的对象引用指向任何类型的对象

                                      (2)在Object类中定义的一些方法,自动地继承给所有的类

    2.Object类的常用方法:

       (1)boolean equals(Object oth)    作用:比较两对象引用是否相等

       (2)String toString()    作用:将对象转换为字符串

       (3)finalize()    作用:释放对象

       (4)wait()    作用:线程等待

       (5)notify()    作用:唤醒线程

       注:方法(1)在使用时必须覆写

             方法(2)返回的字符串是由对象引用的类型、字符@、对象哈希码的无符号十六进制数三部分组成的,一般没什么价值,也须覆写

    九、包装类

    1.8种基本数据类型:byte short int long float double char boolean

       对应的包装类:Byte Short Integer Long Float Double Character Boolean Void

    2.基本数据类型的数据与包装类对象的转换:typeValue()方法

       例:

    int a = 10;
    Integer obj = new Integer(a);
    System.out.println(obj.intValue());

    3.包装类对象或基本数据类型的数据与字符串的转换:toString方法

       形式:public String toString();

       将字符串转换为包装类的对象:

       例:public Integer(String s);

       将字符串转换为基本数据类型的数据:valueof(String)方法 或 parseType()静态方法

    4.在JDK5.0版本之后,Java虚拟机支持自动装箱、拆箱机制

       自动装箱:将基本数据类型的数据自动封装为相应的包装类对象

       自动拆箱:从包装类对象中自动提取基本数据类型的数据

  • 相关阅读:
    我们怎样确保从大数据计算中获得价值
    大数据恐惧症
    大数据恐惧症
    一文读懂聚类算法
    一文读懂聚类算法
    用Python实现一个大数据搜索引擎
    用Python实现一个大数据搜索引擎
    No mysqld or mysql.server after mariadb-server install
    pip下载默认绕过代理
    linux下解压 tar.bz2
  • 原文地址:https://www.cnblogs.com/trj14/p/4293356.html
Copyright © 2011-2022 走看看