内部类
在一个类的内部定义的类,内部类可以访问外部类的成员变量和成员方法,包括私有成员,内部类可以分为成员内部类,局部内部类,静态内部类和匿名内部类
public class InnerClass {class InnerC{}
}
1,成员内部类
定义在类中方法外的类,可以访问外部类的所有成员变量和方法,包括私有的
当一个类只为外部类服务,且在不需要在外部类之外被访问时,可以定义为成员内部类
eg:订单类中的商品,可以单独设置为一个类作为订单中的商品
创建内部类对象:
外部类名.内部类名 对象名 = 外部类对象.new 内部类构造方法
eg:
public class Test {public static void main(String[] args) {InnerClass test = new InnerClass();InnerClass.InnerC testInner = test.new InnerC(1);}
}
内部类中隐含了一个外部类的对象:外部类名.this
2,静态内部类
在类中方法外且以static关键字修饰的内部类,可以直接通过外部类的类名访问,并不依赖于外部类的对象
只能访问外部类的静态属性
当一个类只需要访问外部类的静态成员时,可以将其定义为静态的内部类
public class InnerClass {public static int s;public int b;class InnerC {public int a;public InnerC(int a) {this.a = a;System.out.println(this.a);}}static class InnerS {public static void main(String[] args) {System.out.println(s);}}
}
创建静态内部类对象
格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造方法
public static void main(String[] args) {InnerClass test = new InnerClass();InnerClass.InnerS tests = new InnerClass.InnerS(11);
}
3,局部内部类
定义在方法中的内部类,只能在方法内部被使用,不能被方法之外的代码访问
public static void main(String[] args) {class Innerf{int a;public void showa(){System.out.println(a);}}Innerf innerf = new Innerf();innerf.showa();
}
创建局部内部类对象
直接在类之后正常创建对象即可
4,匿名内部类
一种特殊的内部类,没有名字且只能在声明的地方实例化一次
通常用于创建实现某个接口或者继承某个类的对象
创建接口实现类时直接new 接口名(){}即可
一般一个类只需要使用一次时使用
回调方法:一个函数的参数部分传入一个回调接口,当这个函数执行中满足某种条件时候,去调用接口中所实例的方法
eg:
public class Innerclass_test {public static void main(String[] args) {test1(new Test() {@Overridepublic void test() {}});}public static void test1(Test t){t.test();}
}
interface Test{abstract void test();
}
eg:实现一个按钮的点击事件监听器
Object obj = new InnerClass(){};
枚举
枚举是一种特殊的类,默认被final修饰,继承于java.lang.Enum
用于定义一组常量(枚举项),默认被static final修饰
枚举项声明时都是唯一的,且可以通过枚举名访问,
枚举项被定义为枚举类的实例.
枚举类有且仅有一个构造方法,所以如果创建了带参构造方法,必须要给枚举项添加参数
枚举的作用
1,限制变量的取值范围
2,提高代码的可读性和可维护性
3,代替常量集合
4,实现单例模式
eg:
public enum Day {// 枚举项 : 被定义为枚举类的实例,原理就是⾃定义常量MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY}
枚举默认继承Enum类,本质为被final修饰的类
默认被public static final修饰
第一行只能为枚举项,均为常量,且每个常量记住的都是枚举类的一个对象
构造函数只能私有
泛型
一种编程语言特性,允许在定义类和接口或者方法时使用参数化类型
通过使用泛型可以在编译时就检测类型,避免运行时类型错误
通常用在Java的集合类里指定集合中元素类型,提高代码的类型安全性
注意:泛型不支持多态,必须传入完全相同类型
泛型类和泛型接口
在类名后添加<类型参数>,可以在类的成员变量或者方法等地使用
eg: class Test< T >{
public test(T input){
}
}
接口同理
泛型方法
在修饰符和返回值类型中间添加<类型参数>
可以在方法的各处使用
通配符
一种特殊的类型参数: ? 表示一种未知的类型
用以处理不确定的类型或者未知类型的情况,让我们的代码更加灵活,处理不同类型的对象和集合
同时提供一定安全性
1,无界通配符:?
匹配任意类型的参数
List<?> list
2,有界通配符:
? extends T
上界通配符:限制在T及T的子类类型
将T作为类型的上界
? super T
下界通配符:限制在T及T的父类类型
将T作为类型的下界