Java的四种内部类以及lambda表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29451823/article/details/79169359
  1. 成员内部类

    	 package online.qinshixun.outerclass;
    /**
     * 
     * @author CJJ
     * 成员内部类
     */
     class Outer {
    	private int a = 5;
    	private Inner in;
    	public Outer() {
    		super();
    	}
    	public Outer(int a) {
    		in = new Inner(a);
    	}
    	public int getInnerA() {
    		return in.a;//引用内部类的变量,需通过实例
    	}
    	public class Inner {
    		public Inner(int a ) {
    			this.a = a;
    		}
    		public Inner() {
    			super();
    		}
    		public int a = 3;
    		public void doSomething() {
    			//调用外部类的属性
    			System.out.println("外部a:"+Outer.this.a);
    			System.out.println("类部a: "+a);
    		}
    	}
    }
     class Extender extends Outer.Inner {
    	 public Extender(Outer outer) {
    		 //外部类实例名.super(内部类参数列表)
    		 outer.super(6);
    	 }
     }
    public class Test3 {
    	public static void main(String []args) {
    		Outer.Inner inner = new Outer().new Inner();
    		inner.doSomething();
    		Extender extender = new Extender(new Outer());
    		extender.doSomething();
    	}
    }
    
  2. 列表内容

    	package online.qinshixun.outerclass;
    /**
     * 
     * @author CJJ
     * 静态内部类
     * 静态内部类只能访问外部类的静态成员
     * 内部类可以访问外部类的非静态成员和静态成员
     */
    public class StaticInnerClass {
    
    	public static void main(String[] args) {
    		//创建静态内部类的实例
    		OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
    		printer.printMessage();
    	}
    
    }
    class OuterClass {
    	private static String msg = "静态成员变量";
    	//静态内部类
    	public static class NestedStaticClass {
    		//静态内部类只能访问外部类的静态成员
    		public void printMessage() {
    			
    			System.out.println("msg = " + msg);
    		}
    	}
    }
    
  3. 局部内部类

    		 package online.qinshixun.outerclass;
    
    /**
     * 
     * @author CJJ
     *	局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
     *	局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。(JAVA8以下)
     *	可以使用abstract修饰,声明为抽象类。
     */
    public class LocalInnerClass {
    
    	public static void main(String[] args) {
    		LocalInnerClass inner = new LocalInnerClass();
    		inner.method();
    	}
    	//局部内部类
    	public void method() {
    		int num2 = 44;
    		class JuIn {
    			public void zhanshi() {
    				/*
                     * 按理说局部内部类访问局部变量,局部变量应该用final修饰,但是不用final修饰也是可以访问的,
                     * 这是因为在JDK8以下必须用final修饰,不然会报错,
                     * Cannot refer to a non-final variable a inside an inner class defined in a different method,
                     * 但是在JDK8之后就不会出现这种状况
                     * */
    				System.out.println(num2);
    			}
    		}
    		System.out.println("访问局部变量" + num2);
    		//局部创建内部类对象
    		JuIn ji = new JuIn();
    		ji.zhanshi();
    	}
    }
    
  4. 匿名内部类

    	 package online.qinshixun.outerclass;
    
    /**
     * 
     * @author CJJ 
     * a·匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
     * b·匿名内部类不能定义任何静态成员、方法和类。
     * c·匿名内部类不能是public,protected,private,static。 d·只能创建匿名内部类的一个实例。
     * e·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
     * f·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
     */
    public class AnonymousInnerClass {
    
    	public static void main(String[] args) {
    	    //new 抽象类或者 接口 
    		Doctor d = new Doctor() {	
    			//匿名内部类
    			public void workInNight() {
    				System.out.println("晚上睡觉");
    			}
    		};
    		d.workInDay();
    		d.workInNight();
    	}
    	
    }
    interface QinShou {
    	public void workInNight();
    }
     abstract class Doctor implements QinShou{
    	 //多态,情况不定
    	 public void workInDay() {
    		 System.out.println("白天学习知识");
    	 }
     }
    
  5. 匿名内部类labmda表达式

       // java 8之前
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Before Java8,too much too little to do");
        }
    }).start();
    // java 8 Lambda方式
    new Thread(() -> System.out
            .println("In Java8, Lambda expression rocks!!!")).start();
    

猜你喜欢

转载自blog.csdn.net/qq_29451823/article/details/79169359