Java内部类的简单使用

内部类


Java中的内部类分为两种

1、成员内部类(静态,非静态)

2、局部内部类( 方法内,代码块内,构造器内)

非静态内部类


package com.simple.javaChangYongType.demo01;

/**
 * @author huYuHao
 * @version 1.0
 * @create 2021/4/8
 * @since 1.8
 */
//外部类
    @SuppressWarnings("all")
public class Outer {
    //私有变量
    private int id = 1;
    private String name = "撤硕美食家";
    
    //公共变量
    int JayChou = 42;
    String Yname = "周杰伦";
    
    //私有的静态变量
    private static int age = 34;
    
    /////////////////////////////////////////////////////
    
    //内部类
    class Inner{
        //内部类的变量
        private String name = "冬泳怪鸽";
        int age = 54;

        //非静态内部类不能定义静态方法
        //public static void method01(){}

        //非静态类里也不能定义静态变量,但是可以定义静态常量
       //public static char sex = '男';
        public static final String address = "湖南周杰伦";
        
        //内部类的方法
        public void method(){
            /**
             * 在内部类输出外部类的变量虽然不需要指定是外部类的还是内部类的
             * 但是如果外部类和内部类拥有同样的变量时,优先访问内部类相同的变量
             */
            System.out.println(Outer.this.id);
            System.out.println(Outer.this.name);
            System.out.println(name);
            System.out.println(Outer.this.JayChou);
            System.out.println(Outer.this.Yname);
            System.out.println(Outer.this.age);
        }
    }
}
//测试类,可以不用再麻烦的去创建一个类,效果和创建一个类是一样的
class Test{
    public static void main(String[] args) {
        //非静态内部类需要先实例化外部类
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();

        inner.method();
    }
}

疑问点:

@SuppressWarnings("all"):这个是注解,有时候我们使用IDEA或者eclipse编写代码时,有些你定义的变量名什么什么的,反正代码下面会显示黄色的线,但又不是编码错误,使用这个注解可以去掉黄线,此乃强迫症福音;

class Test :这个和创建一个新的类是同样的效果,不同的是不用麻烦的创建一个测试类

image-20210408184204440

在编译之后会是两个class文件

image-20210408195124403

不能有静态的方法和变量,但是可以存在静态的常量


静态内部类

静态内部类的命名规范和非静态内部类其实差不多,只是在class前面加了一个static静态修饰符

//外部类
public class Outer{
    //非静态内部类
    class Inner{
        
    }
    
    //静态内部类
    static class Inner{
        
    }
    
}
  • 静态内部类不能访问外部类的非静态方法
  • 静态内部类不需要创建外部类的对象就可以访问(外部类名.内部类 比如new MyMain.Person().display();就创建了静态内部类对象)
  • 静态内部类可以有public、protected、默认的、private等多种类型 (这个功能我倒是从来没听说,通过实验的确ok)

局部内部类

方法或某个作用域内的内部类,称为局部内部类。匿名内部类就是一种局部内部类。

public class OutterType {   
    public void function() {
        /** 局部内部类Inner*/
        class Inner {
            public void print() {
                System.out.println("局部内部类...");
            }
        }
    }
}

匿名内部类

匿名内部类,顾名思义,就是不知道这个类到底是什么名字,也就是不知道类名。

匿名内部类的定义

new 类名(参数) | 实现接口()
{
// 匿名内部类的类体部分
}
从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或者实现一个接口。
两个规则:
	匿名内部类不能是抽象类。
	匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。


posted @ 2021-04-12 15:52  SHE_HYH  阅读(179)  评论(0)    收藏  举报