内部类

内部类

定义:

即在一个类内部进行其它类结构的嵌套操作

程序代码

public class Outer {
    private String str = "outer str~~~";

    //定义一个内部类
    class Inner {
        private String inStr = "inner str~~~";
        //定义一个普通方法
        public void print() {
            //调用外部类的 str 属性
            System.out.println(str);
        }
    }
    //在外部类定义一个方法,负责产生内部类对象并调用 print() 方法
    public void fun() {
        //内部类对象
        Inner inner = new Inner();
        //内部类对象提供的 print
        inner.print();	//调用方法输出:outer str~~~
    }

}

tips:

优点缺点
内部类与外部类可方便的访问彼此的私有域(包括私有方法、私有属性)结构复杂
内部类是另外一种封装,对外部的其它类隐藏
内部类可实现单继承的局限

实例(内部类实现多继承)

class One{...}
class Two{...}

class Outer{
    private class InnerClassOne extends One{...}
    
    private class InnerClassTwo extends Two{...}
}
内部类的创建

外部类外部,创建非静态内部类

# 外部类.内部类 内部类对象 = new 外部类().new 内部类()
Outer.Inner inner = new Outer().new Inner()

外部类外部,创建静态内部类

# 外部类.内部类 内部类对象 = new 外部类().内部类()
Outer.Inner inner = new Outer().Inner()

外部类内部创建内部类

# 根普通对象创建相同
Inner inner = new Inner()
内部类的分类

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

成员内部类

1、内部不允许存在任何 static 变量或方法;如成员方法中不能有任何静态属性

2、成员内部类是依附外部类的,只有创建了外部类才能创建内部类

# 错误程序
public class Outer {
    private String sex = "男";
    public static int age = 23;
    
    class Inner {
        public static int sum = 20;
        public void fun() {
            System.out.println(sex);
            System.out.println(age);
        }
    }
}

在这里插入图片描述

静态内部类

关键字 static 可修饰成员变量、方法、 代码块,还可修饰内部类,使用 static 修饰的内部类称为静态内部类。

静态内部类和非静态内部类区别:

非静态内部类在编译完成之后会隐含的保存着一个引用该引用是指向创建它的外部类,而静态类没有;

则 静态内部类的创建无需依赖外部类可直接创建;而静态内部类不可使用任何外部的非 static 类(包含属性和方法),但可存在自己的成员变量

public class Outer {
    public String sex = "男";
    private static int age = 23;

    static class Inner {
        private String name;
        public void fun() {
            System.out.println(sex);
            System.out.println(age);
        }
    }
}

在这里插入图片描述

运行错误:无法从静态上下文中引用非静态变量

方法内部类

定义在方法里的类

tips:

1、方法内部类不允许使用访问权限修饰符(public、private、protected)都不运行

2、方法内部类对外部完全隐藏,除了创建此类的方法可访问以外,其它均不可访问

3、方法内部如果想要使用方法形成,该形参须使用 final 声明

public class Outer02 {
    public int sum =  20;

   public void show(final int temp) {
       //方法内部类则就是嵌套在方法里面
       class Inner {
           public void fun() {
               System.out.println(sum);
               //temp++;
               System.out.println(temp);
           }
       }
       //方法内部类在方法里创建
       new Inner().fun();
   }
}

在这里插入图片描述

匿名内部类

即一个没有名字的方法内部类,特点与方法内部类完全一致(参考方法内部类)

tips:

1、匿名内部类须继承一个抽象类或实现一个接口

2、匿名内部类没有类名,则没有构造方法

# 声明一个接口
interface Inner{
	void show()
}

class Outer {
    private int sum = 20;
    
    public void display(int temp) {
        //匿名内部类
        new Inner() {
            public void show() {
                System.out.println("匿名内部类~~~");
                System.out.println(temp);
            }
        }.show();
    }
}

内部类与外部类的关系

1、对于非静态内部类内部类的创建依赖外部类,而没有外部类实例之前则是无法创建内部类

2、内部类可直接访问外部类的元素(包含私有属性),因外部类在内部类之前创建,创建内部类时会将外部类的对象传入

3、外部类可通过内部类的引用间接访问内部类元素(需创建内部类对象)

4、内部类是一个相对独立的个体,与外部类没有关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值