内部类介绍

内部类:面向对象程序设计中,一个类的内部定义另一个类,里面的类称为内部类。

特点:
1、内部类可以直接访问外部类中的成员,包括私有成员。
2、外部类访问内部类中成员必须建立内部类对象。
3、内部类不为同一包的其他类所见,具有很好的封装性

表现形式:
⒈成员内部类
⒉静态内部类
⒊局部内部类
⒋匿名内部类

成员内部类:

/**
 * 成员内部类
 * @author Administrator
 *
 */
public class Outer1 {
    //外部类成员变量
    private int num = 4;

    //内部类
    public class Inner1{
        //如果内部类不是静态内部类,就不能有静态声明
//      private static String str;      
        public void getNum(){
            //内部类直接访问外部类的成员变量,原因就是内部类持有外部类的引用  外部类.this
            System.out.println(num);
            //等价于
            System.out.println(Outer1.this.num);

        }


    }

    /**
     * 外部类成员方法访问内部类
     */
    public void showInner(){
        //需要new内部类对象
        Inner1 inner = new Inner1();
        inner.getNum();
    }

}

class Test1{
    public static void main(String[] args) {
        //成员内部类对象,第一种访问形式
        Outer1.Inner1 oi1= new Outer1().new Inner1();
        oi1.getNum();

        //第二种访问形式,调用外部类方法,而该方法中new了内部类对象
        Outer1 outer = new Outer1();
        outer.showInner();
    }
}

静态内部类:

package com.java.inner;
/**
 * 静态内部类
 * @author Administrator
 *
 */
public class Outer2 {
    //静态成员变量
    private static int num = 5;

    //内部类
    static class Inner2{

        public void getNum(){
            //内部类直接访问外部类的成员变量
            System.out.println(num);
        }

        static void show(){
            System.out.println(num);
        }
    }

    /**
     * 外部类成员方法范围内部类
     */
    public void showInner(){
        //需要new内部类对象
        Inner2 inner = new Inner2();
        inner.getNum();
    }

}

class Test2{
    public static void main(String[] args) {
        //静态内部类对象,相当于外部类
        //访问静态内部类的非静态成员,依然需要内部类对象
        Outer2.Inner2 oi2= new Outer2.Inner2();
        oi2.getNum();

        //第二种访问形式,调用外部类方法,而该方法中new了内部类对象
        Outer2 outer = new Outer2();
        outer.showInner();

        //访问静态内部类的静态成员
        Outer2.Inner2.show();
    }
}

局部内部类:

package com.java.inner;

/**
 * 局部内部类
 */
public class Outer3 {

    int num = 7;

    // 在方法内定义内部类
    public void outerMethod() {

        // 定义局部变量
        final int x = 3;

        class Inner3 {

            public void innerShow() {

                System.out.println(num);

                // 访问局部变量x时,编译期间报错 必需将x声明为final
                System.out.println(x);

            }

        }
        // 在outerMethod的方法内new内部类对象,并调用方法
        new Inner3().innerShow();
    }
}

class Test3 {
    public static void main(String[] args) {

        Outer3 outer = new Outer3();
        outer.outerMethod();

    }
}

匿名内部类(内部类的简写格式):
前提:内部类必须继承或实现一个对外部类或接口
应用:某些方法可以用匿名内部类作为参数传递(多态应用的一种)

package com.java.inner;

/**
 * 定义一个接口
 */
interface Demo{
    public void show();
}

/**
 * 匿名内部类
 * @author Administrator
 */
public class Outer4 {

    int num = 4;
    public void outerMethod(){
        //匿名内部类(实质就是Demo的子类对象)
        new Demo(){

            @Override
            public void show() {
                System.out.println(num);

            }
        }.show();//匿名内部类调用对象
    }
}

class Test4{
    public static void main(String[] args) {
        Outer4 outer = new Outer4();
        outer.outerMethod();
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值