Java--面向对象->内部类

一、概念

内部类是一个类的内部进行其他类结构的嵌套的操作

简单定义:

package com.wl;

//内部类的简单定义
class Outer{
    private String msg = "Hello World!";
    //定义一个内部类
    class Inner{
        //内部类中的普通方法
        public void print(){
            System.out.println(msg);//调用msg属性
        }
    }

    public void fun(){
        Inner in = new Inner();//内部类对象
        in.print();//内部类提供的方法
    }
}

//
public class Test {
    public static void main(String[] args) {
       //内部类的简单定义
          Outer out  = new Outer();//外部类对象
          out.fun();//外部类方法

    }
}

代码运行结果:

特点:1.破坏了程序的结构

           2.内部类可以方便的操作外部类的私有访问

二、内部类存在的意义

1.内部类方法可以访问该类作用于中定义的数据,包含private修饰的私有数据;

2.内部类可以对同一包中的其他类隐藏;

3.内部类可实现Java的单继承的缺陷;

4.使用匿名内部类可以定义一个回调函数,并且所需写的代码较少。

三、内部类与外部类的区别

1. 对于非静态内部类,内部类的创建依赖外部类的实例对象,在没有外部类实例之前无法创建内部类;
2. 内部类是一个相对独立的实体;
3. 内部类可直接访问外部类的元素(包含私有域);
4. 外部类不可以直接访问内部类中的元素,可以通过内部类引用间接访问内部类元素。

举例:内部类直接访问外部类元素

package com.wl;

//内部类直接访问外部类元素
class Outter{
    private String name;
    private int age;
    //内部类
    class Inner{
        private int InnerAge;
        public Inner(){
            Outter.this.name = "张三";
            Outter.this.age = 20;
        }
        public void display(){
            System.out.println(name);
            System.out.println(age);
        }
    }
}


public class Test{
    public static void main(String[] args) {
        Outter.Inner in = new Outter().new Inner();
        in.display();

    }
}

代码运行结果:

举例:外部类通过内部类引用间接访问内部类元素

package com.wl;

//外部类通过内部类引用间接访问内部类元素
class Outter1{
    class Inner{
        public void display(){
            System.out.println("I am InnerClass");
        }
    }

    public void display(){
        //外部类访问内部类元素,需通过内部类引用间接访问
        Inner in = new Inner();
        in.display();
    }


}

public class Test {
    public static void main(String[] args) {
        //外部类通过内部类引用间接访问内部类元素
        Outter1 out = new Outter1();
        out.display();
    }
}

代码运行结果:

四、内部类分类

内部类分为成员内部类、静态内部类、方法内部类、匿名内部类

1. 成员内部类

           1.1 成员内部类不能存在任何static的变量和方法
           1.2 成员内部类是依附于外部类的,所以只有先创建了外部类才能创建内部类

2. 静态内部类

           2.1 定义:使用static修饰的内部类
           2.2 静态内部类的创建不需要依赖于外部类,可直接创建
           2.3 静态内部类不可以使用任何外部类的非static成员变量和方法,而内部类都可以

package com.wl;

//使用static创建静态内部类
class Outer1{
    private static String msg = "Hello";
    //定义的内部类
    static class Inner{
        public void print(){//此时只能使用外部类中的static 进行操作
            System.out.println(msg);//调用外部类的msg属性
        }
    }

    //外部类中定义的方法,产生内部类对象并且调用print()方法
    public void fun(){
        Inner in = new Inner();//内部类对象
        in.print();
    }

}

public class Test {
    public static void main(String[] args) {
       
        //使用static创建的静态内部类
        Outer1.Inner in = new Outer1.Inner();
        in.print();
        
    }
}

代码运行结果:

3. 方法内部类

           3.1 定义:定义在外部类的方法中,只能在该方法中被使用
           3.2 局部内部类:与成员内部类基本一致,作用域不同
                    3.2.1 局部内部类不允许使用访问权限修饰符:public  private   protected  
                    3.2.2 局部内部类对外完全隐蔽,只有创建这个类的方法可以访问
                    3.2.3 局部内部类要想使用方法形参,该形参必须使用final声明

4. 匿名内部类

            4.1 定义:一个没有名字的方法内部类
            4.2 约束
                      4.2.1 符合方法内部类的所有约束
                      4.2.2 匿名内部类没有访问修饰符
                      4.2.3 匿名内部类必须继承一个抽象类或者实现一个接口
                      4.2.4 匿名内部类中不能存在任何静态成员或方法
                      4.2.5 匿名内部类没有构造方法(因为没有类名)
                      4.2.6 匿名内部类可以引用方法形参,形参声明为final

package com.wl;

//匿名内部类
interface MyInterface{//定义接口
    void test();
}
class Outter3{
    private int num;
    public void display(int para){
        //匿名内部类实现MyInterface接口
        new MyInterface(){
            @Override
            public void test(){
                System.out.println("匿名内部类 "+para);
            }
        }.test();
    }
}

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

        //匿名内部类:一个没有名字的方法内部类,符合方法内部类的所有约束条件
        Outter3 out = new Outter3();
        out.display(35);


    }
}

代码运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值