内部类

来源:互联网 发布:和讯黄金软件 编辑:程序博客网 时间:2024/06/05 02:44

内部类需要遵守以下守则:
1.内部类的类名只用于定义它的类或者语句块之内,在外部引用时必须给出带有外部类名的完整名称。
2.内部类的名字不允许与外部类的名字相同。
3.内部类可以是抽象类或接口,若是接口,则可以有其他内部类实现。

按照内部类是否含有显示的类名把内部类分为1.实名内部类 2.匿名内部类

实名内部类

实名内部类格式:
[类修饰词表] class 类名 [extedns 父类名][implements 接口名列表]{
类体
}

访问实名内部类的静态属性成员及非静态属性成员:
静态成员:外部类名.实名内部类名.静态成员
非静态成员:实名内部类实例对象.成员

根据类修饰词是否含有static可将实名内部类分为两类
静态实名内部类:
实例格式:
new 外部类名.实名内部类名(构造器参数)

非静态实名内部类:成员变量倘若是静态的,则必须同时含有final属性,但是成员方法不能含有静态属性
实例格式:
外部类实例对象.new 实名内部类名(构造参数)

示例代码:

package com.v512.java;import com.v512.java.Jout.class1;import com.v512.java.Jout.class2;class Jout {    static class class1 {        final static String name = "class1";        double cal(double d) {            return d * d;        }    }    class class2{        //非静态内部类成员变量可使用static修饰        final static String name = "class2";        //方法cal()不能使用static修饰 :The method cal cannot be declared static; static methods can only be declared in a static or top level type        double cal(double d){            return d*d;        }    }}public class InnerClass {    public static void main(String[] args) {        //new 外部类名。实名内部类名(参数列表)        class1 a = new Jout.class1();        Jout jout = new Jout();        //new 外部类实例对象。new 实名内部类名(参数列表)        class2 b = jout.new class2();        class2 c = new Jout().new class2();        //访问内部类class1的name属性        System.out.println(Jout.class1.name);        System.out.println(a.name);        //访问内部类class2的name属性        System.out.println(Jout.class2.name);        System.out.println(b.name);    }}

内部类与外部类具有同名成员变量时成员变量的访问方式:
访问内部类成员变量:this.成员变量
访问外部类成员变量:外部类名.this.成员变量

package com.v512.java;interface JInnerInterface{    void sayHello();}public class InnerClass3 {    private int num = 10;    public class JInner3{        private int num = 100;        public void show(int num){            num++;            this.num++;     //内部类成员变量            InnerClass3.this.num++;     //访问外部类成员变量            System.out.println(num);            System.out.println(this.num++);            System.out.println(InnerClass3.this.num);        }    }    JInner3 inner3 = new JInner3();    public void test (int n){        inner3.show(n);    }    public static void main(String[] args) {        InnerClass3 class3 = new InnerClass3();        class3.test(1000);    }}

匿名内部类

匿名内部类格式:
new 父类名(父类构造器的参数列表){
类体
}

示例代码:

package com.v512.java;abstract class cl{    int num;    public cl(int num) {        super();        this.num = num;    }    public abstract int getNu();}public class InnerClass2 {    public static void main(String[] args) {        cl c = new cl(7) {            /**             * 1.定义一个匿名类对象             * 2.此类继承与抽象类cl             * 3.匿名类对象向上转型为cl类对象             */            @Override            public int getNu() {                // TODO Auto-generated method stub                System.out.println("aa");                return 1;            }        };        System.out.println(c.getNu());    }}

内部类的作用

1.进一步实现多重继承
示例代码:

package com.v512.java;class superA{    public String hello(){        return "hello";    }}class superB{    public String world(){        return "world";    }}public class InnerClass4 {    private class JInnerA extends superA{}    private class JInnerB extends superB{}    public String hello(){        return new JInnerA().hello();    }    public String world(){        return new JInnerB().world();    }    public static void main(String[] args) {        System.out.println(new InnerClass4().hello()+" "+new InnerClass4().world());//可以同时使用superA类和superB类的方法    }}

2.更好的解决接口与父类方法的同名冲突

示例代码:

package com.v512.java;interface JA{    void name();}class JB{    void name(){        System.out.println("bb");    }}public class InnerClass5 extends JB{    private class JInner implements JA{        @Override        public void name() {            // TODO Auto-generated method stub            System.out.println("aa");        }    }    public static void main(String[] args) {        InnerClass5 class5 = new InnerClass5();        class5.name();      //JB类的name方法        class5.new JInner().name();     //JA类的name方法    }}

3.隐藏程序实现的细节
4.无条件的访问外部类的成员

0 0
原创粉丝点击