zoukankan      html  css  js  c++  java
  • java中的内部类

    知识点

           内部类的分类(成员内部类、局部内部类、匿名内部类)

           需要知道:如何创建成员内部类对象

                           当外部类和内部类变量重名时,如何区分

                            局部内部一般是怎样使用的

           关于匿名内部详细例子可参考博客 https://www.cnblogs.com/dolphin0520/p/3811445.html

    一:内部类的分类

        在java中,一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类,内部类一般分类,可以分为成员内部类(非静态成员内部类和静态成员内部类)、局部内部类、匿名内部类

    (1)成员内部类

    public class Person {//Person是外部类
    //成员内部类(非静态的static的)
    public class Mother{
    public Mother(){
    }
    }

    //成员内部类(静态的)
    public static class Father{
    }
    }

    内部类Mother和Father可以看做外部类Person的一个成员,Mother是非静态的成员内部类,Father是静态的成员内部类,对于这两种内部类对象创建,非静态的内部对象,先创建外部类的对象,然后通过外部类的对象调用内部类的构造器,而创建静态的内部类对象,则是直接调用内部类的构造器,具体创建代码如下:
    public class Test {
    public static void main(String[] args) {
    //创建非静态内部类的对象(先创建外部类的对象,然后通过外部类的对象调用内部类的构造器)
    Person p=new Person();
    Person.Mother m=p.new Mother();

    //创建静态内部类的对象(外部类直接调用内部类的构造器)
    Person.Father f=new Person.Father();
    }
    }

    我们在成员内部类中,是可以直接访问外部类的成员属性和方法(包括static和private修饰的成员),当内部类和外部类的属性和方法重名时,内部类中默认调用内部类自己的属性和成员方法,若要访问外部重名的属性和方法使用
    外部类.this.成员变量
    外部类.this.成员方法
    如果外部类想访问内部类成员,需要先创建一个成员内部类对象,然后通过指向这个对象的引用去访问
    public class Person {
    private String name="张三";
    static int age=21;
        public  void showInfo(){
    System.out.println("外部类的成员方法!");
    }

    //成员内部类(非静态的static的)
    public class Mother{
    String name="李四";
    int age;
    public void setName(String name){
    System.out.println(name);
    System.out.println(this.name);
    System.out.println(Person.this.name);//调用外部类中的private修饰的name属性
    System.out.println(Person.this.age);//调用外部类中的static修饰的age属性
    }
    //内部类中调用外部类的成员方法
    public void innershowInfo(){
    showInfo();
    }
    }
    }
    补充:静态成员内部类,和静态成员方法一样,不能调用外部的非静态的成员变量和方法


    (2)局部内部类

    局部内部类是定义在一个方法或者一个作用域里面的类,我们一般使用一个方法返回内部类的对象
    //局部内部类
    public class OuterClass {
    public void method1(){
    //仅仅创建一个局部内部,一般很少使用,一般用于返回内部类对象
    class InnerClass{
    }
    }
    //用法一
    //常常使用一个方法,使其返回某个类或者接口,这个类或者接口在方法内部创建
    public Comparable getComparable(){
    //1.创建一个实现Comparable接口的类(局部内部类)
    class MyComparable implements Comparable{
    @Override
    public int compareTo(Object o) {
    return 0;
    }
    }
    //2.返回一个实现类的对象
    return new MyComparable();
    }
    }
    局部内部类像方法里面的一个局部变量一样,不能用public、protected、private以及static修饰符修饰的

    (3)匿名内部类
    public class OuterClass {

    //用法二
    public Comparable getComparable1(){
    //返回一个实现Comparable接口的匿名内部类的对象
    return new Comparable() {//匿名内部类
    @Override
    public int compareTo(Object o) {
    return 0;
    }
    };
    }
    }
    在编写事件监听代码时,使用内部内部类代码方便易于维护,匿名内部类和局部内部类一样,不能有访问修饰符和static修饰的


  • 相关阅读:
    COJ 1691:前缀和
    COJ 1692:模拟
    POJ 3415:后缀数组+单调栈优化
    python拓展知识
    git总结
    好的文章及博客收集
    python爬虫总结
    ajax与java后台交互
    Java多线程与并发库
    Django框架创建
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10749346.html
Copyright © 2011-2022 走看看