Java基础 14

版权声明: https://blog.csdn.net/qq_40794602/article/details/86775163

内部类:

  • 默认内部类
  • 私有内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

默认内部类:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象
  • 外部类名.内部类名 对象名 = 外部类对象.内部类对象
  • EG:
    public class J1 {
    
    	public static void main(String[] args) {
    		Outer.Inner out_in = new Outer().new Inner();
    		out_in.show();
    	}
    
    }
    
    class Outer{
    	int a = 10;
    	class Inner{
    		public void show(){
    			System.out.println(a);
    		}
    	}
    }

私有内部类EG:

class OuterA{
	int a = 10;
	
	private class InnerA{
		public void test2(){
			System.out.println("InterA test2......");
		}
	}
	
	public void test1(){ //私有内部类通过类内方法进行使用
		InnerA a = new InnerA();
		a.test2();
	}
}

静态内部类EG:

public class J1 {
	public static void main(String[] args) {
		OuterC.Inner inner = new OuterC.Inner();//调用方法和默认内部类不一样
		inner.test();
		OuterC.Inner1.test();
    }
}
class OuterC{
static class Inner{
	public void test(){
	        System.out.println("Inner test...");
	}
             }
            static class Inner1{
	public static void test(){
	      System.out.println("Inner1 test...");
	}
           }
}

局部内部类:

  • 局部内部类访问局部变量必须用final修饰
  • 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么:因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
  • 但是jdk1.8取消了这个事情,所以我认为这是个bug
  • EG:
    public class J1{
    	public static void main(String[] args){
    		Outer out = new Outer();
    		out.test();
    	}
    }
    
    class Outer{
    	public void test(){
    		final int a = 10;
    		class Inner{
    			public void show(){
    				System.out.println(a);
    			}
    		}
    		Inner in = new Inner();
    		in.show();
    	}
    }

匿名内部类:

  • 匿名内部类就是内部类的简化写法
  • 写匿名内部类前提是存在一个抽象类或者接口
  • 匿名内部类格式:new 抽象类或者接口名(){ 重写方法; }
  • 匿名内部类本质是什么呢:是一个继承了该类或者实现了该接口的子类匿名对象。
  • 匿名内部类的特点:匿名内部类必须实现接口的所有方法;匿名内部类必须实现抽象类的所有方法
  • 匿名内部类的方法调用:像普通对象一样,调用方法即可
  • 抽象类EG:
    public class J1{
    	public static void main(String[] args){
    		A a = new A(){
    			public void show(){
    				System.out.println("show方法");
    			}
    		};
    		a.show();
    	}
    }
    
    abstract class A{
    	public abstract void show();
    }

面试题:

//控制台输出30,20,10。
class Outer {
	public int num = 10;
	class Inner {
		public int num = 20;
		public void show() {
			int num = 30;
			System.out.println(num);
			System.out.println(this.num);
			System.out.println(Outer.this.num);
		}
	}
}
class InnerClassTest {
	public static void main(String[] args) {
		Outer.Inner oi = new Outer().new Inner();
		oi.show();
	}	
}

补充:

  • eclipse常用快捷键
  • eclipse中jar包的使用

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/86775163