高级类特性2

关键字——static

  • 使用范围:

    • 在Java类中,可用static修饰属性、方法、代码块、内部类。
  • 被修饰后的成员具备以下特点:

    • 随着类的加载而加载(类加载之后,静态的方法或者属性就能使用了)
    • 优先于对象存在(不用new就能用)
    • static修饰的成员,被所有对象所共享
    • 访问权限允许时,可不创建对象,直接被类调用

类属性、类方法的设计思想

  • 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
  • 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

单例(Singleton)设计模式

  • 设计模式就是在我们实际编程过程中,逐渐总结出的一些解决问题的套路。
  • 单例指的是有且只有一个实例(实例化对象),在整个软件系统运行过程中,这个类只被实例化一次,以后不论在哪儿都只调用这一个实例。
  • 使用单例模式能解决什么问题?一般都是new对象太费劲,或者是频繁的new新的对象没有必要

饿汉式与懒汉式

区别:就是什么时候new这个对象。

  • 懒汉式:是在第一次有人来调用getInstance()方法时来创建对象,以后再有人调用getInstance()方法直接就返回之前第一次new的对象。
  • 饿汉式:是在类加载之后,还没有人调用的时候,就先new一个对象,以后不论谁来调用getInstance()方法,都是直接返回之前new好的对象。

理解main方法的语法

  • 由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
  • 又因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的。
  • 该方法又接收一个String类型的数据参数,该数组中保存执行Java命令时传递给所运行的类的参数。

类的成员之四:初始化块

  • 初始化块(代码块)作用:对Java对象进行初始化。
  • 程序的执行顺序:

    1. 声明成员变量的默认值
    2. 显式初始化、多个初始化块依次被执行(同级别下按先后顺序执行)
    3. 构造器再对成员进行赋值操作。

静态代码块

  • 一个类中,初始化块若有修饰符,则只能被static修饰,称为静态代码块。当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只被执行一次。
  • 在程序运行过程中,非静态代码块每次new对象都有重新执行,静态代码块只执行一次。

关键字——final

  • 在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”。

    • final标记的类不能被继承。提高安全性,提高程序可读性。

      final class A{
      }
      class B extends A{//错误,不能被继承。
      }
    • final标记的方法不能被子类重写。

      class A{
          public final void print(){
              System.out.println("A");
          }
      }
      class B extends A(){
          @Override    //错误,不能被重写。
          public void print(){
              System.out.println("B");
          }
      }
    • final标记的变量(成员变量或局部变量),称为常量。名称大写,如果多个单词组成名称,用_链接,且只能被赋值一次。

      class A{
          //final修饰的变量是常量,常量必须显式赋值,
          private final String INFO = "中国";//声明常量
          static final double PI = 3.14;//final static 一起修饰变量,就是全局常量
      }

抽象类(abstract class)

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

  • 用abstract关键字来修饰一个类时,这个类叫做抽象类
  • 用abstract来修饰一个方法时,该方法叫做抽象方法。抽象方法只有方法的声明,没有方法的实现。
  • 含有抽象方法的类必须被声明为抽象类。(只要类中有一个抽象方法,类就必须是一个抽象类)
  • 抽象类不能被实例化。抽象类是用来作为父类被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
  • 不能用abstract修饰属性、私有方法、构造器、静态方法、final方法。

模板方法设计模式(TemplateMethod)

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上保留抽象类的行为方式。

解决的问题:

  • 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
  • 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

接口(interface)

  • 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口就可以得到多重继承的效果。
  • 接口是抽象方法和常量值的定义的集合。
  • 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
  • 实现接口类:用 implements 实现

    class SubClass implements InterfaceA,InterfaceB{}
  • 一个类可以实现多个接口,接口也可以继承其它接口。

接口的特点:

  • 用interface来定义。
  • 接口中的所有成员变量都默认是由 public static final 修饰的。
  • 接口中的所有方法都默认是由 public abstract 修饰的。
  • 接口没有构造器。
  • 接口采用多层继承机制。

接口定义举例

public interface Runner{
    int ID = 1;        //实际上是public static final int ID = 1;
    void start();    //实际上是public abstract void start();
    public void run();    //实际上是public abstract void run();
    void stop();        //实际上是public abstract void stop();
}

接口的实现:

  • 实现接口的类中,必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。
  • 接口的主要用途就是被实现类实现。(面向接口编程)
  • 与继承关系类似,接口与实现类之间存在多态性
  • 定义Java类的语法格式:先写extends,后写implements。

总结

  • 抽象类是对一类事物的高度抽象,其中既有属性也有方法。
  • 接口是对方法的抽象,也就是对一系列动作的抽象。
  • 当需要对一类事物抽象的时候,应该使用抽象类,以便形成一个父类。
  • 当需要对一系列动作抽象的时候,就使用接口,用需要使用这些动作的类去实现相应的接口即可。

工厂方法(FactoryMethod)

工厂方法模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。工厂方法模式解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

类的成员之五:内部类(Inner class)

  • 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
  • Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。Inner class 的名字不能与包含它的类名相同。
  • Inner class 可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可以互相访问。而外部类要访问内部类中的成员需要:内部类.成员 或者 内部类对象.成员。
  • 分类:

    • 成员内部类(static成员内部类和非static成员内部类)
    • 局部内部类(不谈修饰符)、匿名内部类。

内部类特性

  • Inner class 作为类的成员

    • 可以有多个,可以声明为final的。
    • 和外部类不同,Inner class可声明为private 或 protected。
    • Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量。
  • Inner class 作为类

    • 可以声明为abstract类,因此可以被其他的内部类继承
  • 注意:非static的内部类中的成员不能声明为static的,只有在外部类或者static的内部类中,才可以声明static成员。
  • 内部类的最大作用是实现多重继承。
Last modification:January 20th, 2020 at 07:44 pm
If you think my article is useful to you, please feel free to appreciate