赞
踩
泛型(包装类),反射,枚举,lambda表达式
在了解泛型之前,我们得先了解一个东西,包装类。
基本数据类型
| 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
class 泛型类名称 < 类型形参列表 > {}class ClassName < T1 , T2 , ..., Tn > {}class 泛型类名称 < 类型形参列表 > extends 继承类 {}class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {}
class 泛型类名称 < 类型形参 extends 类型边界 > {//只接受 Number 的子类型作为 E 的类型实参}public class List < E extends Number > {}
<? extends 上界 ><? extends Number > 可以传入的实参类型是 Number 或者 Number 的子类
<? super 下界 ><? super Integer > // 代表 可以传入的实参的类型是 Integer 或者 Integer 的父类类型
定义:
类名 | 用途 |
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量/类的属性 |
Method类 | 代表类的方法 |
Constructor类 |
代表类的构造方法
|
方法 | 用途 |
getClassLoader() | 获得类的加载器 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的) |
forName(String className) | 根据类名返回类的对象 |
newInstance() | 创建类的实例 |
getName() | 获得类的完整路径名字 |
方法 | 用途 |
getField(String name) |
获得某个公有的属性对象
|
getFields() |
获得所有公有的属性对象
|
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
方法 | 用途 |
getAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的公有注解对象 |
getAnnotations() | 返回该类所有的公有注解对象 |
getDeclaredAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的所有注解对象 |
getDeclaredAnnotations() | 返回该类所有的注解对象 |
方法 | 用途 |
getMethod(String name, Class...<?> parameterTypes) | 获得该类某个公有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
方法 | 用途 |
getConstructor(Class...<?> parameterTypes)
| 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class...<?> parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
- class Student{
- //私有属性name
- private String name = "小三";
- //公有属性age
- public int age = 18;
- //不带参数的构造方法
- public Student(){
- System.out.println("Student()");
- }
- private Student(String name,int age) {
- this.name = name;
- this.age = age;
- System.out.println("Student(String,name)");
- }
- private void eat(){
- System.out.println("i am eat");
- }
- public void sleep(){
- System.out.println("i am pig");
- }
- private void function(String str) {
- System.out.println(str);
- }
- @Override
- public String toString() {
- return "Student{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
- public class TestDemo {
- public static void main(String[] args) {
- /*
- 1.通过getClass获取Class对象
- */
- Student s1 = new Student();
- Class c1 = s1.getClass();
- /*
- 2.直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
- 这说明任何一个类都有一个隐含的静态成员变量 class
- */
- Class c2 = Student.class;
- /*
- 3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
- 但可能抛出 ClassNotFoundException 异常
- */
- Class c3 = null;
- try {
- //注意这里是类的全路径,如果有包需要加包的路径
- c3 = Class.forName("Student");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- //一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的
- //c1,c2,c3进行 equals 比较,发现都是true
- System.out.println(c1.equals(c2));
- System.out.println(c1.equals(c3));
- System.out.println(c2.equals(c3));
- }
- }

public static fifinal int RED = 1 ;public static fifinal int GREEN = 2 ;public static fifinal int BLACK = 3 ;
public enum TestEnum {RED , BLACK , GREEN ;}
- public enum TestEnum {
- RED,BLACK,GREEN,WHITE;
- public static void main(String[] args) {
- TestEnum testEnum2 = TestEnum.BLACK;
- switch (testEnum2) {
- case RED:
- System.out.println("red");
- break;
- case BLACK:
- System.out.println("black");
- break;
- case WHITE:
- System.out.println("WHITE");
- break;
- case GREEN:
- System.out.println("black");
- break;
- default:
- break;
- }
- }
- }

方法名称 | 描述 |
values() | 以数组形式返回枚举类型的所有成员 |
ordinal() | 获取枚举成员的索引位置 |
valueOf() | 将普通字符串转换为枚举实例 |
compareTo() | 比较两个枚举成员在定义时的顺序 |
-
- public enum TestEnum {
- RED("red",1),BLACK("black",2),WHITE("white",3),GREEN("green",4);
- private String name;
- private int key;
- /**
- * 1、当枚举对象有参数后,需要提供相应的构造函数
- * 2、枚举的构造函数默认是私有的 这个一定要记住
- * @param name
- * @param key
- */
- private TestEnum (String name,int key) {
- this.name = name;
- this.key = key;
- }
- public static TestEnum getEnumKey (int key) {
- for (TestEnum t: TestEnum.values()) {
- if(t.key == key) {
- return t;
- }
- }
- return null;
- }
- public static void main(String[] args) {
- System.out.println(getEnumKey(2));
- }
- }

// 1. 不需要参数 , 返回值为 2() -> 2// 2. 接收一个参数 ( 数字类型 ), 返回其 2 倍的值x -> 2 * x// 3. 接受 2 个参数 ( 数字 ), 并返回他们的和( x , y ) -> x + y// 4. 接收 2 个 int 型整数 , 返回他们的乘积( int x , int y ) -> x * y// 5. 接受一个 string 对象 , 并在控制台打印 , 不返回任何值 ( 看起来像是返回 void)( String s ) -> System . out . print ( s )
public static void main ( String [] args ) {Test t1 = () -> {System . out . println ( " 无参数无返回值 " );};t1 . test ();Test t2 = ( int a ) -> {System . out . println ( " 一个参数无返回值: " + a );};t2 . test ( 10 );Test t3 = ( int a , int b ) -> {System . out . println ( " 多个参数无返回值: " + a + " " + b );};t3 . test ( 20 , 30 );Test t4 = () -> {System . out . println ( " 有返回值无参数! " );return 40 ;};
- class Test {
- public void func(){
- System.out.println("func()");
- }
- }
- public class TestDemo {
- public static void main(String[] args) {
- new Test(){
- @Override
- public void func() {
- System.out.println("我是内部类,且重写了func这个方法!");
- }
- };
- }
- }
变量捕获(的变量a就是,捕获的变量。这个变量要么是被fifinal修饰,如果不是被fifinal修饰的 你要保证在使用之前,没有修改)
- class Test {
- public void func(){
- System.out.println("func()");
- }
- }
- public class TestDemo {
- public static void main(String[] args) {
- int a = 100;
- new Test(){
- @Override
- public void func() {
- System.out.println("我是内部类,且重写了func这个方法!");
- System.out.println("我是捕获到变量 a == "+a
- +" 我是一个常量,或者是一个没有改变过值的变量!");
- }
- };
- }
- }

诺 a 的值发生改变就会报错。比如我们在内部类设置一个a=6,那么程序就会报错。
那么如果我们一定要修改这个变量怎么办?简单,在定义一个量。就好了
比如:
- class Test {
- public void func(){
- System.out.println("func()");
- }
- }
- public class TestDemo {
- public static void main(String[] args) {
- int a = 100;
- int n= a;
- new Test(){
- @Override
- public void func() {
- System.out.println("我是内部类,且重写了func这个方法!");
- System.out.println("我是捕获到变量 a == "+n
- +" 我是一个常量,或者是一个没有改变过值的变量!");
- }
- };
- }
- }

对应的接
口
| 新增的方法 |
Collection | removeIf() spliterator() stream() parallelStream() forEach() |
List | replaceAll() sort() |
Map | getOrDefault() forEach() replaceAll() putIfAbsent() remove() replace() computeIfAbsent() computeIfPresent() compute() merge() |
这个是源码:forEach的
使用的内部类
public static void main ( String [] args ) {ArrayList < String > list = new ArrayList <> ();list . add ( "Hello" );list . add ( "lambda" );list . forEach ( new Consumer < String > (){@Overridepublic void accept ( String str ){//简单遍历集合中的元素。System . out . print ( str + " " );}});}
public static void main ( String [] args ) {ArrayList < String > list = new ArrayList <> ();list . add ( "Hello" );list . add ( "lambda" );//表示调用一个,不带有参数的方法,其执行花括号内的语句,为原来的函数体内容。list . forEach ( s -> {System . out . println ( s );});}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。