当前位置:首页 > java知识体系 - 图文
2.1.4 总结
封装可以隐藏实现细节,使得代码模块化。 继承可以扩展已存在的代码模块(类)。 封装和继承属于代码重用。 多态是为了接口重用。
2.1.5 继承、聚合、组合、关联的区别
继承很好理解,下图表示(实线):
实现也很好理解,下图表示(虚线):
依赖(代码中通常表示的是局部变量、方法参数、返回值),下图表示:
关联(代码中通常表示的类的属性),下图表示:
聚合(关联的一种,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;has-a,空心菱形),下图表示
组合(关联的一种,表示更强的关系,整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,contains-a,实心菱形),下图表示
2.2 抽象、接口定义及区别
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
2.3 匿名类、内部类、匿名内部类
在一个类中定义另外一个类,这个类就叫做内部类或内置类 (inner class) 。 内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
我们为什么使用内部类?
A、在内部类(inner class)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。
B、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。
C、内部类的更多用法(匿名inner class实现一个接口,不过切记最后那个分号;实现继承和接口实现时出现同名方法的问题;实现多重继承的功能)
2.4 反射
这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于
java.lang.reflect包中:
Class类:代表一个类;
Field 类:代表类的成员变量(成员变量也称为类的属性); Method类:代表类的方法;
Constructor 类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法;
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法:
getName():获得类的完整名字;
getFields():获得类的public类型的属性(包括继承的类的public属性); getDeclaredFields():获得类的所有属性;
getMethods():获得类的public类型的方法; (包括继承的类的public方法); getDeclaredMethods():获得类的所有方法;
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型; getConstructors():获得类的public类型的构造方法;
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型;
newInstance():通过类的不带参数的构造方法创建这个类的一个对象; 通过默认构造方法创建一个新对象:
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
以上代码先调用Class类的getConstructor()方法获得一个Constructor 对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。
获得对象的所有属性:
Field fields[]=classType.getDeclaredFields();
Class 类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认和private访问级别的属性。
Java允许我们从多种途径为一个class生成对应的Class object (一)运用getClass()方法
(二)运用Class.getSuperclass()方法
(三)运用静态方法Class.forName(),这个最常用 (四)运用.class语法
(五)运用原始包装类的TYPE方法
2.5 浅复制和深复制
浅负责也叫浅克隆,深复制也叫深克隆。
克隆一般通过实现Cloneable中的clone方法来实现浅克隆和深克隆,但是
共分享92篇相关文档