zoukankan      html  css  js  c++  java
  • java-内部类

    概念:在一个类的内部再定义一个完整的类。

    1.特点:

      编译之后可分别生成独立的字节码文件

      内部类可以直接访问外部类的私有成员,而不破坏封装。

    2.内部类在java中的类型:

      成员内部类,静态内部类,局部内部类,匿名内部类。

    3.成员内部类:(在类的内部定义和成员变量、成员方法同级别的类,

    package day13;
    
    public class TestStaticClass {
    
    	public static void main(String[] args) {
    //		Outer2.StaticInner in3 =new Outer2.StaticInner();
    //		in3.method();
    
    	}
    
    }
    
    class Outer2 {
    	private int a = 10;// 成员属性
    	private static int b = 20;
    
    	public Outer2(int a) {
    		this.a = a;
    	}
    
    	public void m() {
    		final int x = 20;
    		class LocalInner {
    			private int o = 30;
    //			private static int p = 40;error!
    
    			public void method() {
    				System.out.println(o);// 30
    //				System.out.println(p);
    				System.out.println(a);// 0
    				System.out.println(b);// 20
    				System.out.println(x);// 50
    			}
    		}// 内部类的定义不算是该Outer2类的代码,因为他在编译时,单独形成一个.class文件
    		LocalInner in = new LocalInner();
    		in.method();
    	}
    
    	static class StaticInner {
    		private int x = 10;
    
    		public void method() {
    			System.out.println(x);
    //			System.out.println(a);
    			System.out.println(b);
    		}
    	}
    }
    

      

    即是成员内部类)

      创建对象:先创建外部类对象,再通过外部类对象.new内部类类名() 创建内部类对象

      成员内部类依托于外部类而存在的。如Outer1.MemberInner in1=o1.new MemberInner();

      内部类可以直接访问外部类的私有属性,从而不破坏类的封装性。

    内部类访问私有属性例子:

    package day13;
    
    public class demo {
    
    	public static void main(String[] args) {
    		Outer1 o1 = new Outer1(10);
    		Outer1.MemberInner in1 = o1.new MemberInner();
    		in1.method();//30
    		Outer1 o2 = new Outer1(20);
    		Outer1.MemberInner in2 = o2.new MemberInner();
    		in2.method();//30
    	}
    
    }
    
    class Outer1 {
    	private int a;
    
    	public Outer1(int a) {
    		this.a = a;
    	}
    
    	public void m() {
    	}
    
    	class MemberInner {
    		private int a=30;
    		public void method() {
    		int a=40;
    			System.out.println(a);//40
    			System.out.println(this.a);//30
    			System.out.println(Outer1.this.a);//10  20
    		}
    	}
    }
    

    4.静态内部类

      静态内部类只能访问外部类的静态成员。它不依赖与外部类(更独立),用的时候比较方便。

     代码例子:

    package day13;
    
    public class TestStaticClass {
    
    	public static void main(String[] args) {
    		Outer2.StaticInner in3 =new Outer2.StaticInner();
    		in3.method();
    	}
    
    }
    class Outer2 {
    	private int a = 10;// 成员属性
    	private static int b=20;
    	public Outer2(int a) {
    		this.a = a;
    	}
    
    	public void m() {
    		int x = 20;
    		
    	}
    	static class StaticInner{
    		private int x=10;
    		public void method() {
    			System.out.println(x);
    //			System.out.println(a);
    			System.out.println(b);
    		}
    	}
    }
    

    5.局部内部类:定义在方法的内部(出了生命期就无法使用)

    局部变量:在方法范围之内定义的变量。

    局部类:在方法里定义的类。在方法里定义后才能使用,出了该方法就无法使用。

      作用范围:从定义开始。到代码块结束。

      局部内部类不能定义静态成员

      局部内部类可以访问外部类的私有成员,还能访问外部类的局部变量,但是要加上final

    代码例子

    package day13;
    
    public class TestTeacher {
    
    	public static void main(String[] args) {
    		Student1 t = new Student1();
    		t.study();
    	}
    
    }
    
    class School {
    	public static Teacher getTeacher(int n) {
    		class TeacherA implements Teacher {
    			public void teach() {
    				System.out.println("TeacherA 讲课");
    			}
    		}
    
    		class TeacherB implements Teacher {
    			public void teach() {
    				System.out.println("TeacherB 讲课");
    			}
    		}
    		if (n % 2 == 0)
    			return new TeacherA();
    		else
    			return new TeacherB();
    	}
    }
    
    class Student1 {
    	public void study() {
    //		TeacherA t = new TeacherA();
    //		Teacher t =School.getTeacher();
    //		t.teach();
    //		Teacher t =new TeacherA();
    		Teacher t = School.getTeacher(1);
    //		Teacher t =new TeacherA();
    		t.teach();
    	}
    }
    
    interface Teacher {
    	void teach();
    }

     6.局部内部类访问外部类局部变量

    package day13;
    
    public class TestLocalInnerClass {
    
    	public static void main(String[] args) {
    
    	}
    
    }
    class A{
    	public void method() {
    		final int x=10;
    		class B{
    			public void print()
    			{
    				System.out.println(x);
    			}
    		}
    	}
    }
    

      虚拟机内存:

        堆空间(存的是对象)

        栈空间(存放的是局部变量)

        方法区:常量池,全局性的属性(如静态属性,全类公有)...

  • 相关阅读:
    配置gulpfile,添加task任务
    requestAnimationFrame初探
    实现图片的预加载和懒加载
    jquery实现复制到粘贴板
    微信H5页面遇到的一些问题
    js实现日历的简单算法
    handlebars.js的运用与整理
    倒计时插件
    div 模拟<select>事件
    Emacs添加主题插件(Win系统)
  • 原文地址:https://www.cnblogs.com/SpringChuXin/p/13849440.html
Copyright © 2011-2022 走看看