泛型和反射

本文介绍了Java中的泛型,包括泛型类、泛型方法及其上下限,以及反射的概念,如何获取Class对象,获取类的属性、方法、构造器等信息,并探讨了创建对象的多种方式。此外,还讨论了软件设计的六大原则,如单一职责原则、开闭原则等。
摘要由CSDN通过智能技术生成

第一章 泛型

1.1什么是泛型

所谓泛型就是指,数据类型的参数化。

例如:

ArrayList<String> list

泛型有两种形式,泛型类/接口、泛型方法

1.2泛型类

1.2.1定义

在定义类时,定义泛型。

在早期的JDK版本中没有泛型,不确定的数据类型使用Object。

从JDK1.5增加了泛型

语法:

public class 类名<泛型名,泛型名>{

}

泛型名通常都使用一个大写字母。

E

1.2.2使用

当一个类声明了泛型后,在类中,可以使用泛型代替数据类型

注意:

  1. 当使用泛型类声明变量时,需要指定泛型。
  2. 此时,在对象上所有的泛型都将变成指定的类型。
  3. 泛型不能使用基本数据类型。
  4. 不能使用泛型来创建对象

1.2.3泛型的传递

1.直接指定父类的泛型

public class 子类 extends 父类 <数据类型>{

}

2.传递子类的泛型

public class 子类<T> extends 父类 <T>{

}

1.3 泛型方法

1.3.1定义

public<T>返回值类型 方法名(参数列表){

}

1.3.2使用

在方法上声明的泛型只能在当前方法上使用

  1. 声明变量
  2. 参数的数据类型,必须指定泛型,如果参数中没有指定泛型,默认就是Object类型
  3. 方法的返回值类型

1.4泛型的上下限

使用泛型时,可以设置泛型的上限和下限

List<?>   ?表示什么类型都可以

1.4.1参数类型的指定

参数中可以使用具体的类型来指定泛型

第二章 反射

2.1什么是反射

JVM加载类的机制

常规操作:要先知道一个类,才能创建这个类的对象,才能调用这个类属性和方法。

反射操作:事先不知道这是一个什么类,JVM运行过程,会将类的信息加载到方法区中,从方法区可以获取这个类的一切信息(类名、父类、属性、方法、接口。。。),

通过类信息调用这个类完成相关工作。

2.2如何获取一个类的Class对象

1.类名.class

2.Class.forName(“类全名”)

3.对象.getClass();

2.3获取类的信息

2.3.1基本信息

类名

包名

父类

父接口

2.3.2获取类的属性

公共的属性

cls.getField(String name);                  根据字段名,获取类或接口的指定公共字段

cls.getFields();                                    获取类或接口的所有公共字段,包括继承来的

声明的属性

cls.getDeclaredField(String name);     根据字段名,获取类或接口中声明的所有字段

cls.getDeclaredFields();                      获取类或接口中声明的所有字段,不会获取继承来的

属性的调用

field.get();

field.set(对象,值);

调用私有属性

field.setAccessible(true);

2.3.3获取类的方法

公共的方法

cls.getMethod(name,参数类型)          根据方法名和参数类型,获取指定公共方法

cls.getMethods()                                获取类或接口的所有公共字段,包括继承来的

声明的方法

cls.getDeclaredMethod(name,参数类型);       根据参数类型,获取类中声明的所有构造方法

cls.getDeclaredMethods();                                获取中声明的所有构造方法

方法的调用

method.invoke(对象,参数);                  对指定对象调用当前方法,并传入参数列表

私有属性

method.setAccessiable(true);                     是否关闭安全检查开关

2.3.4 构造方法

调用无参构造创建对象

cls.newInstance();                                     调用类的构造方法,并传入参数列表,创建该类的对象

获取构造方法

cls.getConstructor(参数类型);                

调用构造方法创建对象

constructor.newInstance(参数);             

2.3.5 Java中创建对象的方式有哪些?

1.new 类名()的方式

2.clone()方法

重写Object类的clone方法,实现接口Cloneable。

3.反序列化

serializable接口

transient关键字用来忽略字段序列化和反序列化操作。

4.反射

class.newInstance();

constructor.newInstance(参数);

3.1六大设计原则

高内聚,低耦合。

高内聚:功能高度集中

低耦合:功能之间联系越少越好

设计原则以及设计模式,都是为编写高内聚低耦合的代码。

3.1.1六大基本原则 SOLID

1.单一职责原则(SRP)Single Responsibility Principle

一个类,一个接口,应该只负责一件事。

学生类:只负责与学生相关的操作

老师类:只负责与老师相关的操作

2.开闭原则(OCP)Open Closed Principle

对扩展开放,对修改关闭。

已经写好的代码,不应该对他们进行修改,修改可能带来新的问题。

功能的增强应该使用扩展的方式。

3.里氏替换原则(LSP)Liskov Substitution Principle

父类应该可以直接使用子类来替换,原有功能不应出现任何问题。

子类不能随意重写父类的方法。

4.迪米特法则(LOD)Law of Demeter

最少知道原则

代码应该尽量少的向外暴露它的内部细节

5.接口隔离原则(ISP)Interface Segregation Principle

客户端不应该依赖他不需要的接口

类间的依赖关系应该建立在最小的接口上。

接口应该尽量的小

6.依赖倒置原则(DIP)Dependence Inversion Principle

上层依赖底层,不应该依赖具体,应该依赖抽象

尽量使用接口和抽象类,而不使用具体的实现。

3.1.2类与类之间的关系

1.继承

最密切的一种关系

风险:对父类的修改,会直接影响子类的行为。

继承这种代码复用的方式,要慎用。

2.合成

在一个类中,用到另一个类

有一个类A,还有一个类B,在A中有一个属性是B类型

合成按照AB之间的依赖关系又可分为:

  1. 组合

类人

躯干

四肢

  1. 聚合

类班级

类学生

类班长

合成复用原则:尽量使用合成的方式实现代码利用,而不是继承。

3.依赖

一个类的局部用到了另一个类

比如,在一个类的方法中,定义了一个变量是另一种类型

4.没关系

两个类之间的耦合度

继承>合成(组合、聚合)>依赖>没关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值