Java学习笔记(六)
初始化块
用{代码块}对Java对象进行初始化,也可以被static修饰,此时称为静态代码块,只能访问静态方法和变量
程序的执行顺序如下:
- 声明成员变量的默认值及显示初始化
- 多个初始化块依次执行(静态只执行依次一次且优于非静态执行 ,非静态执行多次)
- 构造器对成员进行赋值
静态代码块常常用来对静态成员变量进行赋值,非静态代码块常常用在匿名内部类中,用代码块替代构造方法:
// 这是一个Person的匿名子类(可以看出子类独有的重写标志),此时要想改变父类的属性值(又不能重写构造方法,因为没有名字),可以通过代码段来代替构造方法(Java高级编程)
Person p=new Person(){
{
super.name="李四";
}
@Override
public void test(){
//TODO
}
}
final
- 修饰类不可以继承
- 修饰方法不可以重写
- 修饰变量为常量(最好为大写)
抽象类 abstract
将父类设计的十分抽象,以至于其没有具体的实例
- 抽象方法,只有方法的声明,以分号结束:abstract int abstractMethod(int a); 含有抽象方法的类都必须被声明为抽象类
- 抽象类不能实例化
模板方法设计模式(TemplateMethod)
利用抽象类的设计模式,将确定的部分实现,将不确定的部分暴露给子类去实现
public abstract class Template{
public abstract void code();
public final void getTime(){
long start=System.currentTimeMillis();
code();
long end=System.currentTimeMIllis();
System.out.println("code方法执行时间:"+(end-start));
}
}
接口(interface)
利用接口实现多重继承的效果,接口是一种特殊抽象类,这种抽象类中只包含常量和方法的定义而没有实现(相当于声明语句)。接口也可以直观理解为一类事物一系列动作的定义
- 定义 interface
- 所有成员都是public static final
- 所有方法都是public abstract
- 没有构造器
- 接口可以采用多层继承机制
- 接口和类也存在多态
抽象类增加新的抽象方法存在的问题
如果抽象类增加抽象方法,则子类必须实现该抽闲方法,否则将改为抽象类
引入接口后,可以在新建的接口中新增抽象方法而不必改变父类,在必要时实现接口。
用Java描述会唱歌的厨子是个老师/font>
public abstract class Person{
int age;
String name;
int sex;
}
public interface Cooking{
void fry();
}
public interface Singing{
void sing();
}
public SCTercher extends Person implements Cooking,Singing{
string course;
@Override
public void fry(){
}
public void sing(){
}
}
工厂方法(FactoryMethod)
将对象创建工作延迟到了子类
在合作开发的场景中,开发人员A设计BWM类,而开发人员B需要使用BWM的对象,如果直接使用对应BWM类进行对象的创建,当BWM改名时,会导致对象的创建也需要改名:
此时通过定义interface BWM和interface BWMFactory,并利用多态性质即可解决这个问题。
内部类
与外部类对应的是内部的类,外部类得new内部类对象才能访问内部类,内部类访问外部类对象可以通过类名.this.xx来访问
内部类可以变相解决多重继承问题
class A{
private class InnerB extends B{
@Overwrite
public void testB(){
}
}
private class InnerC extends C{
@Overwrite
public void testC(){
}
}
}
class B{
public void testB(){};
}
class C{
public void testC(){};
}