内部类的概述讲解以及访问方法

来源:互联网 发布:从事期货行业知乎 编辑:程序博客网 时间:2024/05/18 04:55

概述

    把类定义在其他类的内部,这个类就被称为内部类。    举例:在类A中定义了一个类B,类B就是内部类。

特点

    A:内部类可以直接访问外部类的成员,包括私有。    B:外部类要访问内部类的成员,必须创建对象。
class Outer {    private int num = 10;    class Inner {        public void show() {            System.out.println(num);        }    }    public void method() {        //找不到符号        //show();        Inner i = new Inner();        i.show();    }}

内部类位置

成员位置和局部位置

class Outer {    private int num = 10;    //成员位置    /*    class Inner {    }    */    public void method() {        //局部位置        class Inner {        }    }}

访问内部类方法

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

class Outer {    private int num = 10;    class Inner {        public void show() {            System.out.println(num);        }    }}class InnerClassDemo3 {    public static void main(String[] args) {        //需求:我要访问Inner类的show()方法        //Inner i = new Inner();        //i.show();        //格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;        Outer.Inner oi = new Outer().new Inner();        oi.show();    }}

成员内部类的修饰符以及访问方式

private修饰符修饰成员内部类

class Body {            private class Heart {                public void operator() {                    System.out.println("心脏搭桥");                }            }            public void method() {                if(如果你是外科医生) {                    Heart h = new Heart();                    h.operator();                }            }        }        按照我们刚才的讲解,来使用一下        Body.Heart bh = new Body().new Heart();        bh.operator();        //加了private后,就不能被访问了,那么,怎么玩呢?        Body b =  new Body();        b.method();//在这里method相当于一个中介
package com.cjdx.javaTest;class OuterTest {    private int num = 10;    private static int num2 = 100;    //内部类用静态修饰是因为内部类可以看出是外部类的成员    public static class Inner {        public void show() {            //这里访问num是访问不到的,因为内部类用静态修饰符修饰以后相当于外部类,但是卫为什么能访问            //num2呢,因为static修饰的变量是常驻内存中的,所有的外部类可以直接访问            //System.out.println(num);这里访问不到num            System.out.println(num2);        }        public static void show2() {            //System.out.println(num);            System.out.println(num2);        }           }}

static修饰符修饰静态成员内部类

package com.cjdx.javaTest;import com.cjdx.javaTest.OuterTest.Inner;class OuterTtest2 {    public static void main(String[] args) {        //使用内部类        // 限定的新静态类        //Outer.Inner oi = new Outer().new Inner();        //oi.show();        //oi.show2();        //成员内部类被静态修饰后的访问方式是:        //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();        OuterTest.Inner oi = new OuterTest.Inner();        oi.show();        //The static method show2() from the type OuterTest.Inner should be accessed in a static way        //这里有警告,说的意思就是说show2方法是静态的,应该用静态的方式访问        oi.show2();//可以输出内容        //show2方法因为是被static修饰过的,所以可以直接用类名.方法名访问        Inner.show2();        //show2()的另一种调用方式        OuterTest.Inner.show2();    }}

局部内部类的修饰符以及访问方式

局部内部类

    A:可以直接访问外部类的成员    B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能**
package com.cjdx.javaTest;class OuterTest3 {    private int num  = 10;    public void method() {        //int num2 = 20;        final int num2 = 20;        class Inner {            public void show() {                System.out.println(num);                //从内部类中访问本地变量num2; 需要被声明为最终类型                System.out.println(num2);//20            }        }        System.out.println(num2);        Inner i = new Inner();        i.show();    }}

匿名内部类的修饰符以及访问方式

匿名内部类就是内部类的简写方式

class Outer {    public void method() {        //一个方法的时候        /*        new Inter() {            public void show() {                System.out.println("show");            }        }.show();        */        //二个方法的时候        /*        new Inter() {            public void show() {                System.out.println("show");            }            public void show2() {                System.out.println("show2");            }        }.show();        new Inter() {            public void show() {                System.out.println("show");            }            public void show2() {                System.out.println("show2");            }        }.show2();        */        //如果我是很多个方法,就很麻烦了        //那么,我们有没有改进的方案呢?        Inter i = new Inter() { //多态            public void show() {                System.out.println("show");            }            public void show2() {                System.out.println("show2");            }        };        i.show();        i.show2();    }}
0 0
原创粉丝点击