类之间的关系
1继承
使用extends表示
类和类之间是单继承
class A{};
class B extends A{};
接口和接口之间是多继承,多个用逗号隔开。
interface C{}
interface D{}
interface E extends C,D{}
2实现
类和接口之间是多实现,多个用逗号隔开。
class 类名 implements 接口,接口,…{}
class F implements C,D,E{}
3依赖
局部变量保存了另外一个类对象引用,方法执行完,关系就不存在了。
4关联
关联关系,成员变量保存了另外一个对象引用,关系是长期的。
5聚合
是关联关系,但不手动创建对象,需要调用处传递,就与组合不同,即使test对象销毁,调用处依然保留了person对象的引用,所以person就不是垃圾,不会被回收,还可以复用。
class Test{
Person person;
//构造方法
public Test(Person person){
this.person=person;
}
}
class Person{}
在main方法中
Person person=new Person();
Test t1=new Test(person);
System.out.println(t1.person);
6组合
是关联关系,但对象是自己创建的,person对象的生命周期会和test对象的生命周期绑定。当创建多个test对象,一般会创建多个person对象,因为person对象是手动创建的,意味着没有其他的地方保存person对象的引用,当test对象销毁的时候,该person对象也被视为垃圾,等待被回收。
class Test{
Person person=new Person();
}
class Person{}
内部类
1概述
当一个事物的内部,还需要一个完整的结构进行描述,而这个内部完整结构,又只为外部事物提供服务,那么这个内部完整结构最好使用内部类。
内部类优点:可访问外部类的私有属性。
2成员内部类
成员内部类,可看作成员变量。
1.可使用访问权限控制修饰符。
private class InnerClass{}
2.不能有静态声明。
3.可直接访问外部类所有属性。
4.内部类类名,编译后:外部类类名$内部类类名
如何创建及使用:
1.创建外部类对象
2.创建内部类对象
3.访问属性
3静态内部类
静态内部类,可看作静态变量。
1.可声明静态属性和成员属性。
2.无法直接访问外部类的成员属性,需要创建外部类对象才能访问。
3.如何创建及使用:
InnerClass1 inner1=new OuterClass_01.InnerClass1();
调用:外部类.内部类.方法();
4局部内部类
局部内部类,可看作局部变量
1.通过局部内部类访问外部方法中的局部变量,该变量加final修饰,但1.8开始,final可以省略。
2.不能使用权限控制修饰符,不能使用static
3.类名:外部类类名$1内部类类名
若内部类类名一样,就是外部类类名$2内部类类名以此类推.
4.静态方法中的局部内部类,无法直接使用外部类中的成员属性。
成员方法中的内部类,可以直接访问外部类中的所有属性。
5匿名内部类
在方法调用的时候,需要实现一个接口的实现类对象,可以不写实现类,直接写一个匿名内部类。
1.类名:外部类类名$1, 外部类类名$2 以此类推
2.优点:少定义一个类,而且能访问外部类中的私有化属性。
3.缺点:无法复用。
test(new IUserService() {
@Override
public void login() {
System.out.println(“登陆成功”);
}
});
设计模式
设计模式:在编码实践中,发现很多编码被经常用到,于是总结出来,形成固定的结构,该结构一般代表了最佳的实现方式,让当前对象只能创建一个实例化对象。
1单例模式
让当前对象只能创建一个实例化对象
1.要先创建对象的数量,意味着不能让客户直接操作构造方法,所以需要构造方法私有化。
2.对外提供一个用于获取对象的方法,没有入参,出参是当前类类型,静态方法。
3.创建一个静态变量,用来保存实例化之后的对象。
结合对象的创建时机不同,分为两种情况:
1.加载阶段创建对象,称为饿汉模式。
2.用到的时候创建对象,称为懒汉模式。
饿汉模式:
public class Singleton_01 {
private static Singleton_01 s=new Singleton_01();
public static Singleton_01 getInstance(){
return s;
}
}
懒汉模式:
public class Singleton_02 {
private static Singleton_02 s=null;
public static Singleton_02 getInstance(){
if(s==null){
s=new Singleton_02();
}
return s;
}
}