java_day5

初始化块

初始化块的作用:对java对象进行初始化

  • 在new Person()执行的时候,类的属性的默认初始化和显示初始化
  • 执行代码块的代码
  • 执行构造器的代码
  • 如果有多个代码块,按照从上到下的顺序来

静态代码块中只能使用静态修饰的变量和方法

静态代码块只会运行一次,而非静态代码块,每次new对象都要重新执行

在实际开发中,static代码块用的多,用于初始化类的对象属性

关键字final

在java中,凡是用关键字final来修饰,表示“最终”

  • final修饰的类不能被继承
  • final修饰的方法不能被子类重写
  • final标记的变量(成员变量或局部变量)即称为常量,名称大写,且只能被赋值一次

final修饰的static,就是全局常量

抽象类 abstract class

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

  • abstract修饰一个类:抽象类

  • abstract修饰一个方法:抽象方法

    • 抽象方法:只有一个方法的声明,没有方法的实现,以分号结束:abstract int abstractMethod(int a)
  • 有抽象方法的类必须被声明为抽象类

  • 抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍然为抽象类。

  • 不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

抽象类不能用final来修饰,因为final修饰的类不能被继承,而如果要使用抽象类,不许继承抽象类,实现抽象方法
抽象类可以有定义构造器,不能直接使用,因为不能实例化

模板方法设计模式

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

解决的问题

  • 当功能内部一部分实现是确定的,一部分是现实不确定的,这时可以把不确定的部分暴露出去,让子类实现
  • 编写一个抽象父类 ,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,这就是一种模板模式
  • 抽象类就相当于一个大纲,里面的抽象方法就是每个章节的标题,子类,根据这些标题将每个章节写出

接口

接口:

  • 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,java不支持多重继承。有了接口,就可以得到多重继承的效果。

  • 接口是抽象方法和常量值定义的集合

  • 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,没有变量和方法的实现

  • 实现:

    • class SubClass implements InterfaceA(){}
  • 一个类可以实现多个接口,接口也可以继承其他的接口

特点:

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

for instance:

在前面都会默认加上修饰符

实现接口的方式

子类可以继承父类,但只能继承一个,而类可以实现多个接口,接口之间用逗号隔开

  • 接口之间可以继承
  • 如果一个类既需要继承父类,又要实现接口,那么先继承,再实现

抽象类与接口十分相似,但是如果抽象类要新增方法,在子类中需要实现此方法,否则子类也是抽象类。

但有时我们需要给父类新增一些方法,那么不能直接在父类上下手,只能新增一个接口,在接口上扩展方法,其他需要的子类自行去实现接口。

如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类

工厂模式 FactoryMethod

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

即使将BMW改成别的名字,也不影响后续的代码

内部类

  • 在java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

  • Inner class一般用在定义它的类或语句块之前,在外部引用时必须给出完整的名称

    • Inner class的名字不能与包含它的类名相同
  • Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可以相互访问。而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。

  • 分类:成员内部类(static成员内部类和非static成员内部类)

    • 局部内部类、匿名内部类

内部类的特性:

  • 可以是final的
  • 和外部类不同,Inner class可以声明为private或protected
  • Inner class 可以声明为static,这是就不能再使用外层类的非static成员变量
  • 可以声明为abstract类

用处:主要是为为了解决java不能多重继承的问题

 


立志成为一名攻城狮