JavaEE学习笔记-(3)内部类

内部类

  1. 什么是内部类: 定义在一个类的类体当中的类

  2. 作用: 共享数据的方式之一

  3. 分类

  • 成员内部类

    ​ 可以共享外部类所有的 属性和方法(病毒和人的关系)

    ​ 创建方式: Outer.Inner in = new Outer.new Inner();

    ​ 内部类中不允许有static修饰的内容,除非内部类有static修饰

  public class OuterInner{
     	public static void main(String[] args){
  		Outer.Inner inner =new Outer().new Inner();
     		inner.show();
     
     	}
     }
     
     class Outer{
     	int i=1;
     	static int j=2;
     
     	class Inner{
     		public void show(){
     			System.out.println(i);
     			System.out.println(j);
     		}
     	}
     }
     /*
     这样的写法是不可以的 Inner中的show()方法是无法访问到i的
     class Outer{
     	int i=1;
     }
     calss Inner{
     	public void show(){
     	System.out.println(i);
     	}
     }
     */
  • 静态内部类

    ​ 为了描述类和类的关系

    ​ 只能共享外部类的 静态的属性和方法(房东和租客的关系)

    ​ 创建方式:Outer.Inner in = new Outer.Inner();

    public class OuterInner{
    	public static void main(String[] args){
     		Outer.Inner inner =new Outer.Inner();
     		inner.show();
    
    	}
    }
    
    class Outer{
    	int x=1;
    	static int y=2;
    
    	static class Inner{
    		int z=5;
    		static int i=6;
    
    		public void show(){
    			//System.out.println(x); 无法访问的x
    			System.out.println(y);
    			System.out.println(z);
    			System.out.println(i);
    		}
    	}
    }
    

  • 局部内部类

    ​ 在外部类的方法体中,永远都不可以有static的声明

    ​ 1)如果能够共享外部类的所有成员: 存在于非静态方法中

    ​ 2) 如果能够共享外部类的静态成员: 存在于静态方法中

    ​ final修饰的局部变量 jdk8.0以后可以不加final(老师和学生的关系)

    ​ 创建方式:Inner in = new Inner(); 内部类结束之后 所在的方法结束之前

    public class OuterInner{
    	public static void main(String[] args){
    	Outer outer =new Outer();
    
    	outer.show(999);
    
    	}
    }
    
    class Outer{
    	int a=1; //成员变量
    	static int b=2;  //静态变量
    
    	public void show(int c){
    		int d=8;  //局部变量
    
    		class Inner{  //局部内部类
    			int x=9;
    
    			public void test(){
    				System.out.println(a);
    				System.out.println(b);
    				// c d 是final最终变量  无法修改
    				System.out.println(c);
    				System.out.println(d);
    
    				System.out.println(x);
    			}
    		}// 类结束之后
    
    		Inner inner = new Inner();
    		inner.test();
    		//方法结束之前
    	}
    
    }
    
  • 匿名内部类

    ​ 某些情况下,一个类的名字并不重要,使用一之后就不再使用

    这个名字就显得很无用

    ​ 创建方式:

    ​ new 父类/接口(){

    ​ };

    ​ 匿名类可以共享的数据 取决于匿名内部类的位置 可能等价于上面三种形式

    import java.util.*;
    public class OuterInner{
    	public static void main(String[] args){// 实现了Comparator接口的 无名的 类对象
    		Set<Integer> set =new TreeSet<>(new Comparator<Integer>(){
    			@Override
    			public int compare(Integer x ,Integer y){
    				return y-x;  //降序
    			}
    		});
    		
    		//Set<Integer> set =new TreeSet<>((x,y) -> y-x); jdk8.0lambda表达		  //式 在部分场景下可以代替匿名内部类
    
    
    		Collections.addAll(set,5,3,4,1,2);
    		System.out.println(set);
    
    	}
    }
    
    public class TestAnonyInner2{
    	public static void main(String[] args){
    		Student s1 = new Student();
    		s1.play();
    
    
    		Person james = new Person("james"){
    			@Override
    			public void play(){
    				System.out.println("dunkdunkdunk!!!");
    			}
    		};
    		james.play();
    	}
    }
    abstract class Person{
    	String name;
    	public Person(String name){
    		this.name = name;
    	}
    	public abstract void play();
    }
    
    class Student extends Person{
    	public Student(){
    		super("库里");
    	}
    	@Override
    	public void play(){
    		System.out.println("我是三分大神");
    	}
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值