内部类相关知识-java基础
来源:互联网 发布:淘宝违规申诉成功率 编辑:程序博客网 时间:2024/06/09 19:58
一、内部类:
1、定义:
1)内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
2)内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
3)注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
2、分类:
1)成员内部类:
Eg:
public class Outer {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();//创建内部类对象
inner.print("outer.new");
inner = outer.getInner();
inner.print("outer.get");
}
//个人推荐用getxxx的方法来获取成员内部类,尤其是该内部类的构造方法是无参的
public Inner getInner(){
return new Inner();
}
public class Inner{
public void print(String str){
System.out.println(str);
}
}
}
2)局部内部类:
局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
3)嵌套内部类:
嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。
嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。
4)匿名内部类:
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
匿名内部类隐式地继承了一个父类或者实现了一个接口。
匿名内部类使用得比较多,通常是作为一个方法参数。
Eg:
1. public static void main(String[] args) {
2. Outer outer = new Outer();
3. Inner inner = outer.getInner("Inner", "gz");
4. System.out.println(inner.getName());
5. }
6.
7. public Inner getInner(final String name, String city) {
8. return new Inner(name, city) {
9. private String nameStr = name;
10.
11. public String getName() {
12. return nameStr;
13. }
14. };
15. }
16. }
17.
18. abstract class Inner {
19. Inner(String name, String city) {
20. System.out.println(city);
21. }
22.
23. abstract String getName();
二、枚举:
用途:
用法一:
在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
Eg:
public enum Color {
RED, BLUE, YELLOW, PINK
}
用法二:Switch
switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
枚举:
public enum Singal {
GREEN, YELLOW, RED
}
类:
public class TranfficLight {
Singal color = Singal.RED;
public void change(){
switch(color){
case RED:
color = Singal.GREEN;
break;
case YELLOW:
color = Singal.RED;
break;
case GREEN:
color = Singal.RED;
break;
}
}
}
用法三:向枚举中添加新的方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
Eg:
package oop;
public enum Color {
RED("红色", 1), BLUE("蓝色", 2), YELLOW("黄色", 3), PINK("粉色", 4);
//成员变量
private String name;
private int index;
//构造方法
private Color(String name, int index){
this.name = name;
this.index = index;
}
//普通方法
public static String getName(int index){
for(Color c : Color.values()){
if(c.getIndex() == index){
return c.name;
}
}
return null;
}
//getter()..setter()
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
用法四:覆盖枚举的方法
//覆盖方法
public String toString(){
return this.index + "_" + this.name;
}
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
Eg:
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 接口方法
@Override
public String getInfo() {
return this.name;
}
// 接口方法 @Override
public void print() {
System.out.println(this.index + ":" + this.name);
}
用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
}
enum Dessert implements Food {
FRUIT, CAKE, GELATO
}
}
用法七:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。
枚举类的构造方法和对象:
枚举类的构造方法是private,所以不能使用new创建对象
可以使用Enum.valueOf(Class c,String s);创建对象
Eg:
public class Test {
public static void main(String[] args) {
Season s = Enum.valueOf(Season.class, "Summer");
System.out.println(s);
}
}
enum Season{
Spring, Summer, Fall, Winter;
}
枚举的特点:
1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
2.枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰;
3.枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
- 内部类相关知识-java基础
- java——内部类相关知识
- 内部类相关知识
- Java内部类知识
- java内部类相关
- Java 内部类相关
- java 7 中 内部类 相关知识总结
- Java基础——关于抽象类,接口和内部类(inner class)的相关知识
- java基础 内部类
- java基础--内部类
- java基础<内部类>
- java基础--内部类
- Java基础 内部类
- java基础:内部类
- Java基础----内部类
- java基础--内部类
- Java基础--内部类
- java基础--内部类
- linux设备驱动归纳总结(四):3.抢占和上下文切换
- 分布式消息队列(Message Queue)系统:kafka
- github配置密钥
- 什么是REST?以及RESTful的实现
- HDU 5634 Rikka with Phi(线段树)
- 内部类相关知识-java基础
- java,异常处理,throwable和try...catch[zz]
- Eclipse错误:Problems opening an editor Reason: [Project Name] does not exist解决办法
- C语言之模块化例子(编译环境CODEBLOCK,多文件编译)
- APP测试功能点总结
- 内部类题
- Flash、RAM、ROM的区别
- 摘录之 JAVA 性能 优化 总结
- 使用 Java 配置进行 Spring bean 管理