内部类

作者: 冯宏志 | 来源:发表于2020-12-12 12:00 被阅读0次
    • Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B就是外部类
    • 内部类的分类:成员内部类(静态、非静态)vs局部内部类(方法内、代码块内、构造器内)

    成员内部类

    1、一方面,作为外部类的成员。①、调用外部类的结构。②、可以被static修饰。③可以被四种不同的权限修饰。
    2、另一方面,作为一个类。①、可以定义属性、方法、构造器等。②可以被final修饰,表示此类不能被继承。③可以被abstract修饰

    package com.atguigu.java8;
    
    public class InnerClassTest {
    
    }
    
    class Person{
        String name;
        int age;
        
        public void eat() {
            System.out.println("人吃饭");
        }
        
        //静态成员内部类
        static class Dog{
            String name;
            int age;
            
            public void show() {
                System.out.println("我是狗");
            }
        }
        //非静态成员内部类
        class Bird{
            String name;
            
            public Bird() {
                
            }
            
            public void sing() {
                System.out.println("我是一只小小鸟");
                Person.this.eat();//调用外部类的非静态属性
            }
        }
    }
    

    局部内部类

    1. 内部类的实例化问题
    2. 如何在内部类中区分调用外部类的结构
    3. 开发中局部内部类的使用
    package com.atguigu.java8;
    
    public class InnerClassTest {
        public static void main(String[] args) {
            //1、内部类的实例化问题
            //实例化静态成员内部类
            Person.Dog dog = new Person.Dog();
            dog.show();
            //实例化非静态成员内部类
            Person p = new Person();
            Person.Bird bird = p.new Bird();
            bird.sing();
        }
    }
    
    class Person{
        String name;
        int age;
        
        public void eat() {
            System.out.println("人吃饭");
        }
        
        //静态成员内部类
        static class Dog{
            String name;
            int age;
            
            public void show() {
                System.out.println("我是狗");
            }
        }
        //非静态成员内部类
        class Bird{
            String name;
            
            public Bird() {
                
            }
            
            public void sing() {
                System.out.println("我是一只小小鸟");
                Person.this.eat();//调用外部类的非静态属性
            }
            
            //2、如何在内部类中区分调用外部类的结构
            public void display(String name) {
                System.out.println(name);               //传入的形参
                System.out.println(this.name);          //内部类的name
                System.out.println(Person.this.name);   //外部类的name
            }
        }
    }
    
    package com.atguigu.java8;
    
    //3、开发中局部内部类的使用 
    public class InnerClassTest1 {
        //返回一个实现了Comparable接口的类的对象
        public Comparable getComparable() {
            //创建一个实现了Comparable接口的类:局部内部类
            //方式一:
            class MyComparable implements Comparable{
    
                @Override
                public int compareTo(Object o) {
                    // TODO Auto-generated method stub
                    return 0;
                }
                
            }
            return new MyComparable();
            //方式二:
            return new Comparable() {
    
                @Override
                public int compareTo(Object o) {
                    // TODO Auto-generated method stub
                    return 0;
                }
                
            }
        }
        
        
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:内部类

          本文链接:https://www.haomeiwen.com/subject/fikepktx.html