Java内部类

162 阅读4分钟

内部类

什么是内部类?

​ 简单来说就是:类中定义类

什么时候需要定义内部类?

​ 当一个类中的成员也是另外一个事物的时候,这个事物就可以使用内部类定义

内部类有很多,分为以下几种:

成员内部类 静态内部类 局部内部类 私有内部类 匿名内部类 (重点学习)

1. 成员内部类

/*
成员内部类:
		内部类处于外部类的成员位置
		
		是外部类的成员,就可以使用成员修饰符
		是个类,有类的特性,继承,实现接口...
		
注意:
	内部类中可以使用外部类中所有的内容,包括私有的
	除了静态内部类以外的内部类中不可以定义静态的内容,除了静态的常量
	在外部类中使用内部类中的成员,通过内部类的对象去使用
*/
	public class Outer01{
        private int a=5;//成员变量
        
        String haha="123";
        
        //内部类
        public class Inner{
            int b=3;//内部类中的成员变量
            static final int c=10;
            
            String haha="456";
            
            public void inner(){
                
                String haha="789";
                
                System.out.println("我是内部类中的成员方法");
                System.out.println(b);
				System.out.println(a);
                
                //局部haha
				System.out.println(haha);
				//内部类成员haha
				System.out.println(this.haha);
				//外部类成员haha
				System.out.println(Outer01.this.haha);
            }
        }
       			 //外部类中的成员方法
				void outer(){
				//内部类对象
				Inner in=new Inner();
				System.out.println(in.b);
	}
}



2. 静态内部类

/*
	静态内部类:
			成员内部类一旦被static关键字修饰,就是静态内部类
			
	注意:
		如果在外部类中使用静态内部类中的成员,需要跟随内部类对象使用,如果使用静态内部类中的静态内容,直接类名.调用
		如果在静态内部类中使用外部类中的成员,都要跟随外部类对象使用,如果使用静态内容,在内部类中可以直接使用
*/
public class Outer02{
    private int a=5;
    private static int b=10;
    //静态内部类
    static class Inner{
        String name ="张三";
        static int age =15;
        
        void test1(){
            System.out.println("我内部类中的成员方法");
            //直接使用
            System.out.println(name);
            //直接使用
			System.out.println(age);
            //在静态内部类中使用外部类中的成员,都要跟随外部类对象使用
			Outer02 out=new Outer02();
			System.out.println(out.a);
            //静态内部类中可以直接使用外部类中的静态成员
			System.out.println(b);
        }
    }
    void outer(){
        //使用静态内部类中的静态内容,直接类名.调用
		System.out.println(Inner.age);
		//在外部类中使用静态内部类中的成员,需要跟随内部类对象使用
        Inner in=new Inner();
		System.out.println(in.name);
        //调用静态内部类中成员方法
		in.test1();
	}
}


3. 私有内部类

/*
	私有内部类:
		成员内部类如果一旦被private关键字修饰,就是私有内部类
		
        私有内部类只能在当前所定义的外部类中使用,其他类中无法使用
        在外部类中可以通过内部类的对象使用内部类中的内容,保护私有的内容
*/
public class Outer03{
    private int a=5;
    //私有内部类
    private class Inner{
        private int b=10;
        
        void inner(){
            System.out.println(a);
			System.out.println(b);
        }
    }
    void outer(){
        //创建内部类中的对象
        Inner in=new Inner();
        //使用内部类中的内容
        System.out.println(in.b);
    }
}


4. 局部内部类

/*
	局部内部类:
		局部内部类只能在当前所定义的方法中使用,其他方法,其他类中无法使用
		局部内部类中使用到当前所在的方法参数时,这个参数的默认值被final修饰
		如果修改就不能在内部类中使用
		如果在局部内部类中使用就不能修改其参数值
*/
public class Outer04{
    String name ="李四";
    
    void test(int i){
	//局部变量
        int a = 10;
        
        //局部内部类
        class Inner{
            void inner(){
                System.out.println(a);
				System.out.println(name);
				
				System.out.println(i);
            }
        }
        //方法中通过内部类的对象使用成员
        new.Inner().inner();
    }
}


5. 匿名内部类

/*
	匿名内部类:
		如果某个实现类本身没有自己的作用,为了重写某些抽象方法的,可以使用匿名内部类进行代替
*/
public class Anonymous05{
    public static void main(String[]args){
        //匿名内部类
        //一个Swim接口|抽象类的一个不知名的实现类的对象
        //只能当前行使用一次
        new Swim(){//--->类体
         @Override 
         public void swimming(){
             System.out.println("一边游泳一边敲代码");
         }
           @Override
           public void eat(){
               System.out.println("少吃,营养进食");
           }
        }.swimming();
        
        //有引用接收的匿名内部类对象
        Swim s = new Swim(){//--->类体
            @Override 
            public void swimming(){
                System.out.println("一边游泳一边敲代码");
            }
            
            @Override 
            public void eat(){
                System.out.println("少吃,营养进食");
            }
        };
        
        s.swimming();
        s.eat();
        
        //作为方法的参数使用
        test(new Swim()){
            @Override 
            public void swimming(){
                System.out.println("游泳喝水两不误");
            }
            @Override
            public void eat(){
                System.out.println("一边吃一边喝");
            }
        });
    }
    static void test(Swim s){
        s.swimming();
    }
}
//游泳接口
interface Swim{
    void swimming();
    void eat();
}
/*
//Demo类实现Swim接口
class Demo implements Swim{
    @Override
    public void swimming(){
       	System.out.println("一边跳舞一边游泳");
    }
}
*/


参考:blog.csdn.net/weixin_4576…