内部类相关知识-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 {

REDBLUEYELLOWPINK

}

用法二:Switch

switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

枚举:

public enum Singal {

GREENYELLOWRED

}

类:

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 nameint 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.EnumSetjava.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 keyenum类型,而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{

SpringSummerFallWinter;

}

枚举的特点:

1.用enum定义枚举类默认继承了java.lang.Enum类而不是继承了Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口

2.枚举类的构造函数只能使用private访问修饰符,如果省略了其构造器的访问控制符,则默认使用private修饰;

3.枚举类的所有实例必须在枚举类中显式列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。

 

 

 

 

 

 

 

 

 

0 0