1. 设计模式
1)单例模式之恶汉式
class Single {
private Single( ){ } //私有构造函数,目的不让其他类创建本类的对象;
private static Single s = new Single(); //对外提供一种公共的访问方式,可以访问本类创建的对象;
public static Single getInstance(){
return s;
}
}
2)单例模式之懒汉式 --单例的延迟加载
这个目前会有多线程访问的问题,一般面试的时候用;
class Single{
private Single(){}
private static Single s = null;//声明一个本类的引用,先不去创建对象;
public static Single getInstance(){
if(s == null){
s = new Single();
}
return s;
}
}
3) 第三种单例模式
class Single{
private Single){ }
public static final Single s = new Single();
}
2.继承 关键字extends
好处:提高了代码的复用性,在父类中定义子类可以继承过来用;
让类与类之间产生了关系,提供了多态的前提;
特点:
1)java只支持单继承,不支持多继承;2)Java支持多层继承;当子父类的成员变量重名时,可以使用super区分;当成员变量和局部变量重名时,可以用this区分;子类创建对象调用方法,先看本类有没有方法,有则调用;如果没有则去看父类有无,无则报错;子类构造函数的第一行默认有一条隐式的super();
易错题:
class Fu {String name;Fu(String name) {this.name = name;System.out.println("父类构造函数");}}class Zi extends Fu {Zi( ) { //编译报错System.out.println("子类构造函数");}Zi(String name){ //编译报错this.name = name;System.out.println("子类有参构造函数");}}这个程序在编译的时候报错,在子类的构造方法中有一个隐式super(),但父类中没有无参构造函数;
子类实例化过程:
1)子类中所有的构造函数默认都会访问父类中的空参构造函数,因为每一个子类构造函数的第一行都有一个默认的super();
2)当父类中没无参构造函数时,子类的构造函数必须通过this或者super语句来执行要访问的构造函数;
2.1覆盖:
1)子类重新写父类的方法,返回值类型、方法名、参数都要一模一样;2)访问权限不能是private,在子类中继续使用父类被覆盖的方法可以super.函数名 获取。3)子类重写父类的方法权限必须大于等于父类的权限,静态只能覆盖静态。
2.2 final
1)final修饰的类不能有子类;2)final修饰的方法不能被复写;3)final修饰的变量一旦初始化就不能再改变其值->常量。初始化分为:显示初始化: final int num = 15;构造函数初始化:class Fu{final int NUM;Fu(){NUM = 10;}}
3. 抽象(abstract)
定义:抽象就是从多个事物中将共性的、本质的内容抽取出来。抽象类:Java 中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
3.1 abstract 不能共存的关键字
1).不能和final共存abstract修饰的类就是为了让子类继承,abstract修饰的方法就是为了让子类重写;final修饰的类时不可以被继承的,final修饰的方法不可以被重写;2).不能与private共存abstract修饰的类就是为了让子类继承父类的方法,如果函数私有了子类将无法直接访问,就覆盖不了了!3).不能与static共存static不需要对象,类既可以调用抽象方法,调用抽象方法没有意义。
3.2 重载和重写的区别
1)重载特点:
** 在同一类中;
** 方法名相同,参数列表不同;
2)重写的特点:
** 要有继承的关系,在子父类中;
**方法的声明相同(方法名、参数列表、返回值类型要相同);
**子类方法的权限一定要大于等于父类方法权限;
**静态只能覆盖静态;
4.接口 implements实现
interface Inter {int num = 0; //num为常量,默认被 public static final 修饰void show(); //show 方法默认有public abstract 修饰;}在jdk1.8之前接口不能定义非抽象方法。如果成员变量什么也没加,系统会加上: public static final一个类可实现多个接口,因为接口中的方法都是抽象的,没有方法体,子类去重写不存在安全隐患,打破了单继承的局限性。4.1 接口定义:是抽象方法和常量值的集合。接口和接口之间是 extends 关系,一个接口继承另一个接口会拿到它里面的所有的成员。接口里面定义的是扩展功能,类和抽象类定义的是这个体系的共性功能。4.2 接口的特点:1)接口是对外暴露的规则;2)是程序功能的扩展;3)降低耦合性;4)可以用来多实现;5)多个无关类可以实现同一个接口;6)一个类可以实现多个无关接口;7)接口与实现类之间存在多态;4.3 接口和抽象类的区别:共性:都是不断抽取出来的抽象概念;区别:1)抽象类体现继承关系,一个类只能单继承;接口体现是实现关系,一个类可以多实现;2)抽象是继承,接口是实现;3)抽象类定义基本共性功能;接口定义对象扩展功能;4)抽象类可以定义非抽象方法供子类使用;接口的方法都是抽象的,接口中的成员都有固定的修饰符 public static final
5. 多态 (polymorphic)
5.1 定义:一类事物存在的多种形态。5.2实现多态满足条件:1)父类引用指向了子类对象,动态绑定;2)要有继承或则实现;3)要有重写;如:Animal a = new Cat();
动态绑定:
是指在执行期间判断引用对象的实际类型,根据实际类型调用相应的方法;
多态好处:提高了程序的扩展性;
多态弊端:不能访问子类特有的;
Animal a = new Cat(); //类型提升,向上转型;a.eat();Cat cat = (cat)a; //调用特有方法,强制将父类的引用转成子类类型;cat.catchMouse();多态自始至终都是子类对象在做着变化。
instanceof //判断对象是否属于该类型
if( a instanceof Cat) //instanceof前面是一个类型的引用,判断前面面的类型引用是不是后面的数据类型;
多态调用:只有非静态的成员方法,在编译的时候看左边,运行的时候看右边;
其他的都是编译看左边,运行看左边;