Java基础复习_day10_内部类

内部类

1. 基本使用

①: 概念

  • 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类;

② 格式

/*
    class 外部类名{
    	修饰符 class 内部类名{
    	
    	}
    }
*/

class Outer {
    public class Inner {
        
    }
}

③ 访问特点

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

2. 成员内部类

① 定义位置

  • 在类中方法外,跟成员变量是一个位置
class Outer {
    private int num = 10;
    private class Inner {
        public void show() {
            System.out.println(num);
        }
    }
}

② 使用方式

  • 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
class Outer {
    private int num = 10;
    private class Inner {
        public void show() {
            System.out.println(num);
        }
    }
    public void method() {
        Inner i = new Inner();
        i.show();
    }
}
public class InnerDemo {
    public static void main(String[] args) {
		//Outer.Inner oi = new Outer().new Inner();
		//oi.show();
        Outer o = new Outer();
        o.method();
    }
}

3. 局部内部类

① 定义位置

  • 局部内部类是在方法中定义的类;
class Outer {
    private int num = 10;
    public void method() {
        int num2 = 20;
        class Inner {
            public void show() {
                System.out.println(num);
                System.out.println(num2);
            }
        }
    }
}

② 使用方式

  • 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用;
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量;
class Outer {
    private int num = 10;
    public void method() {
        int num2 = 20;
        class Inner {
            public void show() {
                System.out.println(num);
                System.out.println(num2);
            }
        }
        Inner i = new Inner();
        i.show();
    }
}
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

4. 匿名内部类

① 定义匿名内部类的前提

  • 存在一个类或者接口,这里的类可以是具体类也可以是抽象类;

② 格式

  • new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
new Inter(){
    @Override
    public void method(){}
} 

③ 本质

  • 匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象

④ 使用方式

  • 通过多态的形式接受
Inter i = new Inter(){
  @Override
    public void method(){
        
    }
}
  • 直接调用方法
interface Inter{
    void method();
}

class Test{
    public static void main(String[] args){
        new Inter(){
            @Override
            public void method(){
                System.out.println("我是匿名内部类");
            }
        }.method();	// 直接调用方法
    }
}

⑤ 练习

public class Test {
    public static void main(String[] args) {
        // 创建字符串集合
        ArrayList<String> names = new ArrayList<>();

        // 添加元素
        names.add("Tom");
        names.add("Jack");
        names.add("Sara");
        names.add("Rose");

        // 集合中的元素按照首字母排序
        // sort 方法需要一个Comparator的对象, 但是Comparator是接口, 不能实例化, 
        // 因此这里使用匿名内部类来创建Comparator对象
        names.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int res = o1.compareTo(o2);
                return res;
            }
        });

        // 输出集合
        System.out.println(names);
    }
}

运行结果:
在这里插入图片描述

发布了22 篇原创文章 · 获赞 4 · 访问量 1281

猜你喜欢

转载自blog.csdn.net/weixin_42931689/article/details/104192488