栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的内部类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的内部类

内部类

        之前类中可有变量和方法,今天开始在类中在添加一个元素类。

        内部类---包含在类中的类就是内部类

        外部类---包含内部类的类就是外部类

1.成员内部类---相当于是java类中的成员变量

基本结构

public class TestClass{
    public class InnerClass{

    }
}

TestClass---外部类

InnerClass---成员内部类

内部类编译后会形成一个新的字节码文件【外部类类名$内部类类型.class】

 1.成员内部类可以使用任意的访问限制修饰符

2.成员内部类可以有实例变量、实例方法、构造方法,不能有静态元素。

3.成员内部类中的构造方法可以访问其他的构造方法【new】,可以访问实例变量/方法【对象.十实例变量/方法,this.实例变量/方法,可以省略对象/this】

4.成员内部类中的实例方法可以访问构造方法【new】,可以访问实例变量/方法【对象.实例变量/方法,this.实例变量/方法,可以省略对象/this】

5.成员内部类中的构造方法可以访问外部类的构造方法,实例方法/变量,类方法/变量。

6. 成员内部类中的实例方法可以访问外部类的构造方法,实例方法/变量,类方法/变量。

7.外部类中的构造方法/实例方法可以访问成员内部类的构造方法,实例方法/变量,外部类中的类方法不能访问成员内部类。

8.其他类中是可以访问成员内部类的,需要依赖外部类对象,注意访问限制修饰符。

例如:

package Test1;

public class TestClass {
	//外部类构造方法
	public TestClass(){
		new InnerClass();
		new InnerClass().shiLi();
		//InnerClass.this.shiLi();//错误
		//this.shiLi();//错误
		//shiLi();//错误
		new InnerClass().id=1000001;
		//InnerClass.this.id=10001;//错误
		//this.id=10001;//错误
		//id=10001;//错误
	}
	//外部类实例方法
	public void waibuShiLi(){
		new InnerClass();
		new InnerClass().shiLi();
		//InnerClass.this.shiLi();//错误
		//this.shiLi();//错误
		//shiLi();//错误
		new InnerClass().id=10000001;
		//InnerClass.this.id=10001;//错误
		//this.id=10001;//错误
		//id=10001;//错误
	}
	//外部类静态方法
	public static void waibuJingTai(){
		//new InnerClass();//错误
		//new InnerClass().shiLi();//错误
		//InnerClass.this.shiLi();//错误
		//this.shiLi();//错误
		//shiLi();//错误
		//new InnerClass().id=10000001;//错误
		//InnerClass.this.id=10001;//错误
		//this.id=10001;//错误
		//id=10001;//错误
	}
	//外部类实例变量
	public int num=100;
	//外部类静态变量
	public static String name="张三";
	
	
	
	
	//成员内部类
	public class InnerClass{
		//实例变量
		public int id=1001;
		//static int id1=1002;//错误
		//实例方法
		public void shiLi(){}
		//构造方法
		
		public InnerClass(){}
		//带参数构造方法
		public InnerClass(String name){
			//访问其他构造的方法
			new InnerClass();
			//访问实例变量/方法---对象.实例变量/方法,this.实例变量/方法【可以省略对象/this】
			new InnerClass().id=1002;
			this.id=1003;
			id=1004;
			new InnerClass().shiLi();
			this.shiLi();
			shiLi();
			//成员内部类中的构造方法可以访问外部类的构造方法,实例方法/变量,类方法/变量
			new TestClass();
			new TestClass().waibuShiLi();
			//TestClass.this表示外部类对象
			TestClass.this.waibuJingTai();
			//静态方法可以用类名调用
			TestClass.waibuJingTai();
			TestClass.this.num=1002;
			TestClass.this.name="李四";
			TestClass.name="王五";
					
		}
		//实例方法
		public void shiLi2(){
			//访问构造的方法
			new InnerClass();
			//访问其他实例变量/方法---对象.实例变量/方法,this.实例变量/方法【可以省略对象/this】
			new InnerClass().id=1002;
			this.id=1005;
			id=1006;
			new InnerClass().shiLi();
			this.shiLi();
			shiLi();
			//成员内部类中的实例方法可以访问外部类的构方法,实例方法/变量,类方法/变量。
			new TestClass();
			new TestClass().waibuShiLi();
			TestClass.this.waibuJingTai();
			TestClass.waibuJingTai();
			TestClass.this.num=1003;
			TestClass.this.name="赵六";
		}
	}
}
package Test1;

public class OtherClass {

	public OtherClass(){
		TestClass tc=new TestClass();
		TestClass.InnerClass inner1=tc.new InnerClass();
		TestClass.InnerClass inner2=new TestClass().new InnerClass();
		inner1.id=1001;
		inner2.shiLi2();
	}
	public void testOther(){
		TestClass tc=new TestClass();
		TestClass.InnerClass inner1=tc.new InnerClass();
		TestClass.InnerClass inner2=new TestClass().new InnerClass();
		inner1.id=1001;
		inner2.shiLi2();
	}
	public static void testOtherStatic(){
		TestClass tc=new TestClass();
		TestClass.InnerClass inner1=tc.new InnerClass();
		TestClass.InnerClass inner2=new TestClass().new InnerClass();
		inner1.id=1001;
		inner2.shiLi2();
	}
}

 2.方法内部类---定义在方法中的类,相当于局部变量

基本格式:

package Test2;

public class TestClass {
	public TestClass(){
		class InnerClass1{
			
		}
	}
	public void testMethod(String canshu){
		class InnerClass2{
			
		}
	}
	public static void testMethod2(String canshu){
		class InnerClass3{
			
		}
	}
}

        1.方法内部内不能使用认识访问限制修饰符

        2.方法内部类可以有实例变量/方法,构造方法,不能有静态元素。

        3.方法内部类的构造方法中可以访问本方法内部类中的构造方法,实例变量/方法【对象/this,也可以省略】

        4.方法内部类的实例方法中可以访问本方法内部类中的构造方法,实例变量/方法【对象/this,也可以省略】

        5.方法内部类中的构造方法/实例方法中可以访问本方法的局部变量,默认会使用final修饰局部变量和【直接变量名称】

        6.方法内部类可以访问外部类的构造方法,实例方法/变量,类方法/变量。

        7.外部类是不能访问方法内部类。

package Test2;

public class TestClass {
	public TestClass(){}
	public void testMethod1(){}
	public static void testStatic(){}
	String testname1="zhangsan";
	static int idd=10001;
	public void testMethod(String canshu){
		String testname="张三";
		//方法内部类---定义在方法中的类,相当于局部变量
		//方法内部类不能使用认识访问限制修饰符
		//方法内部类可以有实例变量/方法,构造方法,不能有静态元素。
		class InnerClass{
			private int id=1001;
			//private static String name="zhangsan";//错误
			public InnerClass(){}
			public InnerClass(String name){
				new InnerClass();
				new InnerClass().id=1002;
				this.id=1002;
				new InnerClass().innerShili();
				this.innerShili();
				id=1003;
				
				//方法内部类访问本方法的局部变量时,方法内部类会默认使用final修饰符修饰
				//final修饰符修饰的变量不能被重新赋值
				//testname="lisisi";//错误
				System.out.println(testname);
				
				//访问外部类实例变量
				new TestClass();//访问外部类构造方法
				new TestClass().testname1="lisi";
				TestClass.this.testname1="wangwu";
				testname1="zhaoliu";
				
				//访问外部类静态变量
				new TestClass();
				new TestClass().idd=10002;
				TestClass.this.idd=10003;
				idd=10003;
				
				//访问外部类实例方法
				new TestClass().testMethod1();
				TestClass.this.testMethod1();
				testMethod1();
				
				//访问外部类静态方法
				new TestClass().testStatic();
				TestClass.this.testStatic();
				TestClass.testStatic();
				testStatic();
				
			}
			public void innerShili(){}
			//public static void innerJingtai(){}//错误
			public void innerShili2(){
				new InnerClass();
				new InnerClass().id=1004;
				this.id=1005;
				id=1006;
				new InnerClass().innerShili();
				this.innerShili();
				innerShili();
			}
		}
	}
	
}

3.静态嵌套类---相当于java类中的静态变量

基本格式

package Test3;

public class TestClass {
	public static class InnerClass{
		
	}
}

         1.静态嵌套类中可以有构造方法,实例变量/方法,类变量/方法。

        2.静态嵌套类中构造方法/实例方法可以访问本静态嵌套类中的构造方法,实例变量/方法,类方法/变量。

        3.静态内部类中类方法可以访问本静态嵌套类中的构造方法,实例方法/变量【只能对象】,类变量/方法

        4.静态内部类中的构造方法/实例方法/类方法可以访问外部类的构造方法,实例变量/方法【只能对象】,类变量/方法。

        5.静态嵌套类中不能有this

        6.外部类的构造方法/实例方法/类方法可以访问,静态内部类中构造方法,实例变量/方法【只能对象】,类变量/方法。

        7.其他类中可以访问静态嵌套类【new 外部类类名.嵌套类类名()】。注意访问限制修饰符

例如:

package Test3;

public class TestClass {
	//外部类实例变量
	int idd=001;
	//外部静态变量
	static String name2="张三";
	//外部类构造方法
	public TestClass(){
		new InnerClass();
		new InnerClass().id=1002;
		//InnerClass.this.id=1003;//错误
		new InnerClass().name="李四";
		InnerClass.name="李四";
		//name="李四";//错误
		new InnerClass().testShili();
		new InnerClass().testJingtai();
		InnerClass.testJingtai();
		//testJingtai();错误
	}
	//外部类实例方法
	public void testShili3(){
		new InnerClass();
		new InnerClass().id=1002;
		//InnerClass.this.id=1003;//错误
		new InnerClass().name="李四";
		InnerClass.name="李四";
		//name="李四";//错误
		new InnerClass().testShili();
		new InnerClass().testJingtai();
		InnerClass.testJingtai();
		//testJingtai();错误
	}
	//外部类静态方法
	public static void testJingtai3(){
		new InnerClass();
		new InnerClass().id=1002;
		//InnerClass.this.id=1003;//错误
		new InnerClass().name="李四";
		InnerClass.name="李四";
		//name="李四";//错误
		new InnerClass().testShili();
		new InnerClass().testJingtai();
		InnerClass.testJingtai();
		//testJingtai();错误
	}
	//静态嵌套类中可以有构造方法,实例变量/方法,类变量/方法
	public static class InnerClass{
		//实例变量
		 int id=1001;
		//静态变量
		static String name="张三";
		//构造方法
		public InnerClass(){}
		//实例方法
		public void testShili(){}
		//静态方法
		public static void testJingtai(){}
		
		//静态嵌套类中的构造方法/实例方法可以访问本静态嵌套类中的构方法,实例变量/方法,类变量/方法
		//构造方法
		public InnerClass(String name2){
			 new InnerClass();
			 new InnerClass().id=1002;
			 this.id=1003;
			 id=1004;
			 
			 new InnerClass().name="李四";
			 this.name="王五";
			 name="赵六";
			 InnerClass.name="张三三";
			 
			 new InnerClass().testShili();
			 this.testShili();
			 testShili();
			 
			 new InnerClass().testJingtai();
			 this.testJingtai();
			 testJingtai();
			 
			 //静态内部类中的构造方法/实例方法/类方法可以访问外部类的构造方法,实例方法/变量【只能对象】,类方法/变量
			 new TestClass();
			 new TestClass().idd=002;
			 //TestClass.this.idd=002;//错误
			 //idd=002;//错误
			 new TestClass().name2="李四";
			 //TestClass.this.name2="李四";//错误
			 name2="李四";
			 TestClass.name2="李四";
			 
			 new TestClass().testShili3();
			 //TestClass.this.testShili2();//错误
			 //testShili3();//错误
			 
			 new TestClass().testJingtai3();
			 //TestClass.this.testJingtai3();//错误
			 testJingtai3();
			 TestClass.testJingtai3();
		}
		//实例方法
		public void testShili2(){
			new InnerClass();
			 new InnerClass().id=1002;
			 this.id=1003;
			 id=1004;
			 
			 new InnerClass().name="李四";
			 this.name="王五";
			 name="赵六";
			 InnerClass.name="张三三";
			 
			 new InnerClass().testShili();
			 this.testShili();
			 testShili();
			 
			 new InnerClass().testJingtai();
			 this.testJingtai();
			 testJingtai();
			 
			 //静态内部类中的构造方法/实例方法/类方法可以访问外部类的构造方法,实例方法/变量【只能对象】,类方法/变量
			 new TestClass();
			 new TestClass().idd=002;
			 //TestClass.this.idd=002;//错误
			 //idd=002;//错误
			 new TestClass().name2="李四";
			 //TestClass.this.name2="李四";//错误
			 name2="李四";
			 TestClass.name2="李四";
			 
			 new TestClass().testShili3();
			 //TestClass.this.testShili2();//错误
			 //testShili3();//错误
			 
			 new TestClass().testJingtai3();
			 //TestClass.this.testJingtai3();//错误
			 testJingtai3();
			 TestClass.testJingtai3();
		}
		//静态方法
		public static void testJingtai2(){
			new InnerClass();
			new InnerClass().id=10001;
			//this.id=10002;//错误
			//id=10002;//错误
			new  InnerClass().name="张三三";
			//this.name="李四四";//错误
			name="李四四";
			InnerClass.name="王五五";
			
			new InnerClass().testShili();
			 
			new InnerClass().testJingtai();
			testJingtai();
			InnerClass.testJingtai();
			
			 //静态内部类中的构造方法/实例方法/类方法可以访问外部类的构造方法,实例方法/变量【只能对象】,类方法/变量
			 new TestClass();
			 new TestClass().idd=002;
			 //TestClass.this.idd=002;//错误
			 //idd=002;//错误
			 new TestClass().name2="李四";
			 //TestClass.this.name2="李四";//错误
			 name2="李四";
			 TestClass.name2="李四";
			 
			 new TestClass().testShili3();
			 //TestClass.this.testShili2();//错误
			 //testShili3();//错误
			 
			 new TestClass().testJingtai3();
			 //TestClass.this.testJingtai3();//错误
			 testJingtai3();
			 TestClass.testJingtai3();
		}
	}
}
package Test3;

public class OtherClass {
//其他类可以访问静态嵌套类【new 外部类类名.静态嵌套类类名()】。注意访问修饰符
	public void testMethod(){
	TestClass.InnerClass ti=new TestClass. InnerClass();
		ti.id=1001;
		ti.testShili();
		ti.name="张三";
		ti.testJingtai();
		TestClass.InnerClass.testJingtai();
		TestClass.InnerClass.name="李四";
	}
	}

4.匿名内部类---没有名字的java类,在不用创建新类的情况下,构建出当前类的子类,构建子类没有名字,所以叫匿名内部类

基本格式

package Test4;

public class Person {
	public void personInfo(){
		System.out.println("Person类的实例方法");
	}
}
package Test4;

public class TestMain {

	public static void main(String[] args) {
		Person per=new Person(){
			public void personInfo(){
				System.out.println("重写Person类的personInfo方法");
			}
		};
		per.personInfo();
	}

}
new Person(){
    public void personInfo(){
            System.out.printn("重写Person类的personInfo方法");

    }
};

上面的代码就是一个匿名内部类的格式,就相当于Person类的子类,只是没有名字,所以叫匿名内部类。 

继承式的匿名内部类

例如:

package Test5;

public abstract class Person {
	public abstract void perinfo();
}
package Test5;

public class TestClass {
	public void testClassSshili(Person per){
		per.perinfo();
	}
}
package Test5;

public class TestMain {

	public static void main(String[] args) {
		TestClass tc=new TestClass();
		tc.testClassSshili(new Person(){

			@Override
			public void perinfo() {
				System.out.println("重写抽象类的抽象方法");
				
			}
			
		});

	}

}

 接口式的匿名内部类

例如:

package Test6;

public interface Person {
	void test1();
}
package Test6;

public class TestClass {
	public void shiliMethod(Person name){
		name.test1();
	}
}
package Test6;

public class TestMain {

	public static void main(String[] args) {
		TestClass tc=new TestClass();
		tc.shiliMethod(new Person(){

			@Override
			public void test1() {
				System.out.println("重写接口的抽象方法");
				
			}
			
		});

	}

}

优点:避免创建额外的独立子类

缺点:不易理解,不易阅读 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434422.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号