java知识点十二:内部类

本文详细解析了Java内部类的概念,包括成员内部类、局部内部类、匿名内部类和静态内部类的特点及应用场景,帮助读者掌握内部类的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部类

一.什么是内部类

将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类

内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class

内部类主要分为四种:

成员内部类,局部内部类,匿名内部类,静态内部类

二.成员内部类

package com.jiangbei.test.innerclass;

/**
 * 外部类
 * 作者: Administrator
 * 日期: 2017/9/24
 **/
public class OutterClass {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    // 内部类
    public class InnerClass{
        public InnerClass(){
            name = "张三";
            age = 18;
        }
        public void show(){
            System.out.println("i am InnerClass");
        }
        public void display(){
            System.out.println("name:"+getName()+" age:"+getAge());
        }
    }
    // 推荐使用getInnerClass()获取内部类
    public InnerClass getInnerClass(){
        // 当然也可以在外部类创建内部类引用,当内部类为空时新建,不为空时返回,实现单例的效果
        return new InnerClass();
    }

    public static void main(String[] args) {
        OutterClass outter = new OutterClass();
        // InnerClass inner = new InnerClass(); 无法直接创建内部类
        // OutterClass.InnerClass inner = outter.new InnerClass(); 不推荐
        OutterClass.InnerClass inner = outter.getInnerClass();
        inner.show();
        inner.display();
    }
}

由此我们可以知道:

1.成员内部类依靠外部类,只有创建了外部类实例才能创建成员内部类

2..成员内部类可以无限制访问外部类成员,即使它是private的

 3.外部类想访问成员内部类的方法和变量,必须通过内部类的实例

 

三.局部内部类

嵌套在方法和作用域的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。

class People{
    public People() {
         
    }
}
 
class Man{
    public Man(){
         
    }
     
    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}

注意点:局部内部类类似一个局本变量,无法拥有访问修饰符!

四.匿名内部类

一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

new 父类构造器(形参列表) | 实现接口(){

  // 重写方法或实现方法
}

比较典型的就是swing中的事件绑定了:

button1.addActionListener(  
                new ActionListener(){  
                    public void actionPerformed(ActionEvent e) {  
                        System.out.println("你按了按钮二");  
                    }  
                });

1.匿名内部类必须是实现一个接口或者继承一个父类的方式

2.匿名内部类没有构造函数

3.匿名内部类不能存在静态变量静态方法

4.匿名内部类不能是抽象的(继承抽象类、实现接口必须重写、实现所有方法)

 5.Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。

五.静态内部类

和成员变量类似,不过它是静态的,不再需要依靠外部类

/**
     *静态内部类
     */
    static class InnerClass1{
        /* 在静态内部类中可以存在静态成员 */
        public static String _name1 = "chenssy_static";
        
        public void display(){
            /* 
             * 静态内部类只能访问外围类的静态成员变量和方法
             * 不能访问外围类的非静态成员变量和方法
             */
            System.out.println("OutClass name :" + name);
        }
    }

有关内部类的讲解与深入,请参见http://www.cnblogs.com/dolphin0520/p/3811445.html

转载于:https://www.cnblogs.com/python-road/p/10474951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值