zoukankan      html  css  js  c++  java
  • Java基础:复用类

    1、复用方式:组合、继承、代理

    组合是功能上的复用,继承是形式上的复用,代理位于二者之间。

    2、创建一个子类对象时,该对象包含了一个基类的子对象。这个子对象与用基类直接创建的对象是一样的。二者的区别在于:后者来自于外部,而子对象被包装在子类对象内部。

    3、基类的无参构造器可以隐式地自动被调用,有参构造器必须被显式地调用(通过super关键字)。

    子类构造器中调用基类构造器的语句须位于第一句。

    注意:如果已经定义了有参数的构造器,则编译器就不会再为该类自动生成一个无参构造器,除非主动为该类提供无参构造器,否则该类不会拥有无参构造器。

    4、注意重载(overload)与重写(override)

    重写只有在某方法是基类的接口(基类所暴露出的方法)的一部分是才会出现,试图覆盖一个private方法时编译器不会给出错误信息,但是这并不意味着覆盖成功,而仅仅意味着子类有了一个基类接口未提供的新方法。

    5、向上转型,见 JAVA继承过程中方法覆盖问题——“=”左右两边分别为父类和子类类型

    6、涉及到继承时类的初始化问题,先看下面的代码:

     1 public class Test {
     2     public static void main(String[] args) {
     3         Student student = new Student(16, "李四");
     4     }
     5 }
     6 
     7 class People {
     8     static String spieces = getSpieces();
     9 
    10     int age = getAge();
    11     String name = getName();
    12     
    13     private static String getSpieces() {
    14         Sop("initialize static field spieces in type People");
    15         return "People";
    16     }
    17     private int getAge() {
    18         Sop("initialize nonstatic field age in type People out of constructor");
    19         return 15;
    20     }
    21     private String getName() {
    22         Sop("initialize nonstatic field name in type People out of constructor");
    23         return "张三";
    24     }
    25     
    26     People(int age, String name){
    27         this.age = age;
    28         this.name = name;
    29         Sop("in People(int age, String name):");
    30         Sop(name+":"+age);
    31     }
    32     
    33 }
    34 
    35 class Student extends People{
    36     static String major = getMajor();
    37     String collage = getCollage();
    38     
    39     Student(int age, String name) {
    40         super(age, name);
    41         Sop("in Student(int age, String name):");
    42         Sop(name+":"+age+":"+collage+":"+major);
    43     }
    44     private String getCollage() {
    45         Sop("initialize nonstatic field collage in type Student out of constructor");
    46         return "TJU";
    47     }
    48     private static String getMajor() {
    49         Sop("initialize static field major in type Student");
    50         return "EE";
    51     }
    52 }

    其输出是:

     1 /*
     2 initialize static field spieces in type People
     3 initialize static field major in type Student
     4 initialize nonstatic field age in type People out of constructor
     5 initialize nonstatic field name in type People out of constructor
     6 in People(int age, String name):
     7 李四:16
     8 initialize nonstatic field collage in type Student out of constructor
     9 in Student(int age, String name):
    10 李四:16:TJU:EE
    11 */

    通过上面的例子可以看出,初始化的顺序依然是和前面JAVA基础:初始化与清理中所说一致,先初始化静态成员、然后创建对象时初始化非静态成员、最后执行构造器。

    但是当涉及到继承时,情况稍微复杂些,因为需要同时考虑基类与子类的初始化问题。这时的顺序是这样的:

    当要使用子类时(使用其静态成员、创建对象),子类和基类的类文件依次被加载,然后依照从基类到子类的顺序开始初始化静态成员(之所以从基类开始,是因为子类的初始化过程有可能依赖于基类的成员)。

    如果要继续创建子类对象,则按照这样的顺序进行初始化:基类非静态成员>>>基类构造器>>>子类非静态成员>>>子类构造器。

    7、final关键字

     见JAVA基础:FINAL关键字

  • 相关阅读:
    Git for Windows之基础环境搭建与基础操作
    TFS2018环境搭建一单实例安装(适用于小型团队)
    TFS2018环境搭建一硬件要求
    Proxy代理模式(结构型模式)
    Flyweight享元模式(结构型模式)
    Facade外观模式(结构性模式)
    Decorator装饰者模式(结构型模式)
    Composite组合模式(结构型模式)
    mybatis中 #{} 和 ${} 的区别
    解决mybatis中#{}导致的The error may involve defaultParameterMap的问题
  • 原文地址:https://www.cnblogs.com/QuentinYo/p/3603443.html
Copyright © 2011-2022 走看看