Java内部类

一、什么是内部类

        类中可以有变量和方法,那么我们在类中再添加一个元素类。将一个类声明/定义在另一个类的里面,里面的这个类就是--内部类是类里面的类。

        注:内部类编译后会形成一个新的字节码文件【外部类类名$内部类类名.class】

二、内部类的分类

        可以分为四类:

                1.成员内部类

                2.方法内部类

                3.静态嵌套类

                4.匿名内部类

三、成员内部类

        1.成员内部类中可以用什么修饰

                成员内部类可以用任意修饰符修饰

//基本结构:
public class TestClass {
	
	public  class InnerClass{
		
	}
}

        2.成员内部类中可以有什么元素

                成员内部类中可以有实例元素(变量、方法)、构造方法

        3.成员内部类元素间的调用

                i.成员内部类的构造方法和实例方法

                        可以访问当前内部类的构造方法  ----   用 new 构造方法( )

                        可以访问当前内部类的实例元素  ----   用 对象/this.      都可以省略

                ii.成员内部类的构造方法和实例方法

                        可以访问外部类的构造方法  ----  用 new 外部类的构造方法( )

                        可以访问外部类的实例元素  ----  用 对象/外部类名.this.     都可以省略

                        可以访问外部类的静态元素  ----  用 类名/对象/外部类名.this.     都可以省略

                iii.外部类的构造方法和实例方法

                        可以访问成员内部类的构造方法  ----  用  new 内部类的构造方法( )

                        可以访问成员内部类的实例元素  ----  只能用对象访问

                    外部类的静态方法

                        不能访问成员内部类的构造方法

                        不能访问成员内部类的实例元素

                iv.其他类的构造方法、实例方法、静态方法访问成员内部类的元素

                        可以访问成员内部类的构造方法  ----  外部类对象.new.内部类的构造方法( )

                        可以访问内部类的实例元素  ----  只能通过对象访问

二、方法内部类

        1.方法内部类是定义在方法中的类,相当于一个局部变量,所以方法内部类不能有修饰符

//基本格式:
public class TestClass {
	public TestClass(){
		 class  InnerClass1{
				
			}
	}
	public  void  testMethod(String canshu){
		 class  InnerClass2{
			
		}
	}
	public static  void  testStaticMethod(String canshu){
		 class  InnerClass3{
			
		}
	}
}

        2.方法内部类中可以有什么元素

                方法内部类中可以有实例元素(变量、方法)、构造方法

        3.方法内部类中元素的调用

                i.方法内部类的构造方法和实例方法

                        可以访问当前内部类的构造方法  ----  用 new 内部类的构造方法( )

                        可以访问当前内部类的实例元素  ----  用 对象/this.       都可以省略

                ii.方法内部类中访问当前方法中的局部变量【变量名称】

                        注意该局部变量是final修饰符修饰

                iii.方法内部类的构造方法和实例方法

                        可以访问外部类的构造方法  ----  用  new 外部类的构造方法( )

                        可以访问外部类的实例元素  ----  用 对象/外部类名.this.    都可以省略

                        可以访问外部类的静态元素  ----  用 类名/对象/外部类名.this.     都可以省略

                iv.其他类不能访问方法内部类的元素

三、静态嵌套类

        1.相当于是java类中的静态变量,可以使用任意修饰符修饰

//基本格式:
public class TestClass {
	public static class  InnerClass{
		
	}
}

        2. 静态嵌套类中可以有什么元素

                可以有有构造方法,实例元素,静态元素

        3.静态嵌套类的元素调用

                i.静态嵌套类的构造方法和实例方法

                        可以访问当前内部类的构造方法  ----  用 new 内部类的构造方法( )

                        可以访问当前内部类的实例元素  ----  用 对象/this.    都可以省略

                        可以访问当前内部类的静态元素  ----  用 类名/对象/this.    都可以省略

                  静态嵌套类的静态方法

                        可以访问当前内部类的构造方法  ----  用  new 内部类的构造方法( )

                        可以访问当前内部类的实例元素  ----  用  对象 访问

                        可以访问当前内部类的静态元素  ----  用  类名/对象        都可以省略

                ii.静态嵌套类的构造方法、实例方法、静态方法

                        可以访问外部类的构造方法  ----  用  new 外部类的构造方法( )

                        可以访问外部类的实例元素  ----  只能用对象访问

                        可以访问外部类的静态元素  ----  用  类名/对象           都可以省略

                iii.外部类的构造方法、实例方法、静态方法

                        可以访问静态嵌套类的构造方法  ----  用  new  外部类名.静态嵌套类的构造方法( )

                        可以访问静态嵌套类的实例元素  ----  只能用对象访问

                        可以访问静态嵌套类的静态元素  ----  用  类名(从外部类类名开始.)/对象      可省略

四、匿名内部类

        没有名字的java类,在不用创建出新类的情况下,构建出当前类/接口的子类,构建的子类没有名字



public class Person {
	public  void  personInfo(){
		System.out.println("Person类的实例方法");
	}
}

public class Main {
	public static void main(String[] args) {
		Person  per=new Person(){
			public  void  personInfo(){
				System.out.println("重写Person类的personInfo方法");
			}
		};
		per.personInfo();
	}
}

/*
new Person(){
	public  void  personInfo(){
			System.out.println("重写Person类的personInfo方法");
	}
}
上面的代码就是一个匿名内部类的格式,就相当于Person类的子类,只是没有名字,所以叫匿名内部类
*/

        抽象类和接口中使用匿名内部类

//定义一个People抽象类
public abstract class People {
    //定义一个抽象方法
    abstract void run();
}



//定义一个学生接口
public interface Student {
    //定义一个抽象方法
    void learn();
}


//主方法
public class TestMain {
    public static void main(String[] args) {
        //构建子类对象
        People people = new People() {
            @Override
            void run() {
                System.out.println("我是人,我可以跑");
            }
        };
        people.run();
        
        //构建接口子类对象
        Student student = new Student() {
            @Override
            public void learn() {
                System.out.println("我是学生,我会学习");
            }
        };
        student.learn();
    }
}


/*
结果是
我是人,我可以跑
我是学生,我会学习
*/

 

            

                

                

           

         

         

        

                        

                        

你可能感兴趣的:(java,开发语言)