内部类

内部类

1.1内部类的概述

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

 

内部类的定义格式

  • 格式:

内部类

 

 

  • 范例:

内部类

 

 

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有

  • 外部类要访问内部类的成员,必须创建对象

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();
    }
​
}

 

1.2 成员内部类

按照内部类在类中定义的位置不同,可以分为如下两种方式

  • 在类的成员位置:成员内部类

  • 在类的局部位置:局部内部类

成员内部类,外界如何创建对象使用?

  • 格式:外部对象名.内部对象名 对象名 = 外部对象.内部类对象;

  • 范例:Outer.Inner or = new Outer().new Inner();

内部类

public class Outer {
​
    private int num = 10;
​
    /*public class Inner{
        public void show(){
            System.out.println(num);
        }
    }*/
    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 or = new Outer().new Inner();
        or.show();*/
        Outer or = new Outer();
        or.method();
​
    }
}

 

1.3局部内部类

局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用

该类可以直接访问外部类的成员。也可以访问方法内的局部变量

 

局部内部类

public 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 or = new Outer();
        or.method();
    }
}

 

1.4 匿名内部类

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

  • 格式:

内部类

 

 

  • 范例:

内部类

 

 

本质:是一个继承了该类或者实现了该接口的子类匿名对象

接口类

public interface Inter {
​
    void show();
​
}

 

内部类

public class Outer {
    public void method(){
​
        /*new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
​
        };*/
        /*
        单次调用
         */
        /*new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
​
        }.show();*/
        Inter i = new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
​
        };
        i.show();
        i.show();
        i.show();
    }
}

 

测试类

public class OuterDemo {
    public static void main(String[] args) {
        Outer or = new Outer();
        or.method();
    }
}

 

1.5 匿名内部类在开发中的使用

内部类

 

 内部类

 

 内部类

 

 

接口

public interface Jumpping {
​
    void jump();
​
}

 

接口实现类

public class Cat implements Jumpping {
​
    @Override
    public void jump() {
        System.out.println("猫可以跳高了 ");
    }
}

 

接口操作类

public class JumppingOperator {
    public void method(Jumpping j){
        j.jump();
    }
}

 

测试类

public class JumppingDemo {
    public static void main(String[] args) {
        //需求,创建接口操作类的对象,调用method方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.method(j);
        //如果多了,而且只用一次,每次都创建过于麻烦
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("小狗也可以跳高了");
            }
        });
    }
}

 


 

上一篇:写代码被打死系列


下一篇:Pandas数据处理——一文详解数据拼接方法merge