12.内部类

Posted ryxiong-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12.内部类相关的知识,希望对你有一定的参考价值。

内部类

内部类

内部类: 在一个类中定义一个类, 在类A的内部定义一个类B,类B就称为内部类

内部类格式

格式:

public class 类名 {
	修饰符 class 类名{
	}
}

范例

public class Outer {
	public class Inner {
	}
}

内部类访问特点:

  • 内部类可以直接访问外部类的成员, 包括私有
  • 外部类要访问内部类的成员, 必须要创建对象

Outer

package innerClass;

public class Outer {
    private int num = 20;
    public class Inner {
        public void show() {
            System.out.println(num);
        }
    }

    public void method() {
        Inner i = new Inner();
        i.show();
    }
}

成员内部类

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

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

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

  • 格式: 外部类名.内部类名 对象名= 外部类对象.内部类对象
  • 范例: Outer.Inner oi = new Outer().new Inner();

Outer

package innerClass.innerMember;

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

InnerDemo

package innerClass.innerMember;

public class InnerDemo {
    public static void main(String[] args) {
        /*
        // 公有的内部类
        Outer.Inner oi = new Outer().new Inner();
        oi.show();

         */

        Outer o = new Outer();
        o.method();
    }
}

局部内部类

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

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

Outer

package innerClass.localInnerClass;

public class Outer {
    private int num = 30;
    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();
    }
}

Demo

package innerClass.localInnerClass;

public class Demo {
    // 测试类
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

匿名内部类

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

格式:

new 类名或者接口名() {
	重写方法;
}

范例

new Inter() {
	public void show() {
		/// ...
	}
}

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

Outer

package innerClass.anonymousInnerClass;

public class Outer {
    public void method () {
        /*
        new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };
         */
        // show();

        /*
        new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show();  // 调用方法

        new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show();  // 调用第2方法

         */

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

Inter

package innerClass.anonymousInnerClass;

public interface Inter {
    public void show();
}

Demo

package innerClass.anonymousInnerClass;

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

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

Jumpping

package innerClass.anonymousInnerClass.practice;

public interface Jumpping {
    void jump();
}

JumppingOperator

package innerClass.anonymousInnerClass.practice;

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

Cat

package innerClass.anonymousInnerClass.practice;

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

Dog

package innerClass.anonymousInnerClass.practice;

public class Dog implements Jumpping{
    @Override
    public void jump() {
        System.out.println("狗可以跳跃");
    }
}

Demo

package innerClass.anonymousInnerClass.practice;

public class Demo {
    public static void main(String[] args) {
        // 创建接口操作类对象, 调用method方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.method(j);

        Jumpping d = new Dog();
        jo.method(d);

        System.out.println("--------");
        // 匿名内部类实现, 可以少写两个类
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("猫可以跳高");
            }
        });

        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("狗可以跳高");
            }
        });
    }
}

以上是关于12.内部类的主要内容,如果未能解决你的问题,请参考以下文章

错误:这个片段内部类应该是静态的 [ValidFragment]

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

ForegroundService没有从片段开始?

在内部片段类中使用ListView

底部导航 如何从片段内部更改片段

Android 我应该在异步任务中将片段作为弱引用传递吗?