十一、Java内部类

概念:

类的类就称为Java内部类。

内部类分类:

成员内部类、方法内部类、静态嵌套类、匿名内部类

1.成员内部类

相当于Java中的成员变量

基本格式:

public class TestClass {

        public class InnerClass{  //成员内部类

        }

}

TestClass : 外部类

InnerClass : 成员内部类

内部类编译后会形成一个新的字节码文件【外部类类名$内部类类型.class】 如果用eclipse 需要在项目-->bin->对应的包中    可以找到字节码文件。

 特点:

1.成员内部类可以使用任意的访问限制修饰符。相当于成员属性

2.成员内部类中可以有 --实例属性、实例方法、构造方法 。 没有构造属性和方法

3.成员内部类中的[构造方法、实例方法]可以访问本类(当前内部类)其他的其他构造方法【new】,可以访问实例变量/方法、this.实例变量/方法,[可以省略this]。【内访内

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

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

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

例子:

public class TestClass {
	//成员内部类1  公共修饰符
	//实例属性
	String name = "李四";
	private  int age = 20;
	public static String city = "西安";
	public TestClass(){
		System.out.println("外部类的构造方法");
		
		//访问内部类
		}
	public TestClass(String name){
		//访问内部类
		System.out.println(new InnerClass4().age);
		System.out.println(new InnerClass4().name);
		System.out.println(new InnerClass4().city);
		new InnerClass4().InnerMethods();
	}
	public void methodsTestf(){
		System.out.println("外部类实例方法");
		System.out.println(new InnerClass4().age);
		System.out.println(new InnerClass4().name);
		System.out.println(new InnerClass4().city);
		new InnerClass4().InnerMethods();
	}
	public static void testMethods(){
		System.out.println("外部类的静态方法");
//		静态变量无发访问内部成员类中的属性和方法
//		System.out.println(new InnerClass4().age);
//		System.out.println(new InnerClass4().name);
//		System.out.println(new InnerClass4().city);
//		new InnerClass4().InnerMethods();
		
	}
	
	public class InnerClass1{
		//实例属性
		public String name = "张三";
		protected int age = 18;
		char sex = '男';
		private String city = "北京";
		
		//构造方法
		public InnerClass1(){}
		public InnerClass1(String name){
			
			//访问内部类
			System.out.println(new InnerClass1().name);
			System.out.println(new InnerClass1().age);
			System.out.println(new InnerClass1().sex);
			System.out.println(new InnerClass1().city);
			System.out.println(name + "\t" + age + "\t" + city + "\t" + sex + "\n");
			System.out.println("name为:"+ name);
			System.out.print(this.name);
			System.out.print(this.age);
			System.out.print(this.city);
			System.out.print(this.sex);
			
			new InnerClass1().methodsTest1();
			this.methodsTest1();
			methodsTest1();
			
			//方位外部类
			System.out.println(new TestClass().name);
			System.out.println(TestClass.this.name);//访问外部类的实例name
			System.out.println(TestClass.this.age);
			System.out.println(this.name);//访问内部类得实例name
			System.out.println(name);//访问的当前作用域中的name
			System.out.println(TestClass.city); //访问外部类的city
			System.out.println(this.city);
			TestClass.this.methodsTestf();
			new TestClass().methodsTestf();
			methodsTestf();
			
			//访问外部静态方法
//			one
			TestClass.testMethods();
//			tow
			new TestClass().testMethods();
//			three
			TestClass.this.testMethods();
			
//			访问其他的外部类
			InnerClass3 fClass1 = new InnerClass3();
			
		}
		
		//实例方法
		public void methodsTest1(){
			System.out.println("内部成员类无参的实例方法");
		}
		public void methodsTest2(){
			System.out.println("内部成员类有参的实例方法");
			methodsTest1();
		}
	};
	//成员内部类2 缺省限制符号
	class InnerClass2{};
	//友好修饰符 成员内部类3
	protected class InnerClass3{};
	//私有成员内部类
	private class InnerClass4{
		public String name = "王伟";
		protected int age = 20;
		char sex = '女';
		private String city = "西安";
		
		//构造方法
		public InnerClass4(){
			System.out.println("私有的内部成员类构造函数");
		}
		public void InnerMethods(){
			System.out.println("私有内部成员类方法");
		}
		
	};
}

2.方法内部类

-定义在方法内部的类        (相当于局部变量)

格式:

public class TestClass {

        public TestClass(){
                   //构造方法中的内部类

                 class  InnerClass1{

           }

}

public  void  testMethod(String canshu){
           //实例方法中的内部类
         class  InnerClass2{

        }

}

public static  void  testStaticMethod(String canshu){
        //静态方法中的内部类
         class  InnerClass3{

                }

        }

}

特点:

1.方法内部类不能使用访问修饰限制符。(类似于方法中的局部变量

2.方法内部类可以有实例变量/方法,构造方法。(没有静态方法

3.方法内部类可以的 [构造方法和实例方法] 可以访问本类中的构造方法,实例变量/方法(对象,this也可以省略)。

4.方法内部类可以访问当前方法中的局部变量,局部变量默认被final修饰,只能访问不能改写。

5.方法内部类可以访问外部了的实例变量/方法、静态变量/方法、构造方法。(都可以访问)。

6.外部类无法访问内部方法类。

//内部方法类
public class TestClass1 {
	private int age = 18;
	public String name  = "吗尔雅";
	public TestClass1(){
		//当内部类访问的时候默认添加了final
		String name = "张三";
		name = 18 + "";
		//方法内部类不能使用修饰符
		class InnerMthodsClass{
			public String name = "李四";
			private  char sex= '女';
				public InnerMthodsClass(){}
			public InnerMthodsClass(String name){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
				InnerMethods();
				
				
				//访问外部类
				System.out.println(new TestClass1().name);
				System.out.println(new TestClass1().age);
				new TestClass1().testMethods1();
				
			}
			
			public void InnerMethods(){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
			}
		}
	}
	
	public void testMethods(){
		class InnerMthodsClass{
			public String name = "李四";
			private  char sex= '女';
				public InnerMthodsClass(){}
			public InnerMthodsClass(String name){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
				InnerMethods();
				
				
				//访问外部类
				System.out.println(new TestClass1().name);
				System.out.println(new TestClass1().age);
				new TestClass1().testMethods1();
				
			}
			
			public void InnerMethods(){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
			}
		}
	}
	
	
	public static void staticMtehods(){
		class InnerMthodsClass{
			public String name = "李四";
			private  char sex= '女';
				public InnerMthodsClass(){}
			public InnerMthodsClass(String name){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
				InnerMethods();
				
				
				//访问外部类
				System.out.println(new TestClass1().name);
				System.out.println(new TestClass1().age);
				new TestClass1().testMethods1();
				
			}
			
			public void InnerMethods(){
				//访问内部类 当前类
				System.out.println(this.name);
				System.out.println(this.sex);
				System.out.println();
				System.out.println(new InnerMthodsClass().name);
				System.out.println(name);
			}
		}
	}
//	测试构造函数
	public TestClass1(String name){
		//		外部类的构造方法
	}
//	测试事例方法
	public void testMethods1(){
		System.out.println("外部类的事例方法");
	}
//测试的静态方法
	public static void staticMtehods1(){
		System.out.println("外部类的静态方法");
		class fn{
			String name = "123";
			public void mtehdos(){
				new TestClass1();
			}
		}
	}
}

3.静态嵌套类

静态嵌套类中可以有构造方法,实例变量/方法,类变量/方法。(类似静态属性)

格式:

//外部类
public class TestClass2 {
	//静态嵌套类
	public static class InnerStaticClass{
		public String name = "张三";
		private char age = '女';
		public static String city = "城市";
		public InnerStaticClass(){
			System.out.println("静态嵌套类的构造方法");
		}
		
		public void innerMethods(){
			System.out.println("静态嵌套的事例方法");
		}
		
		public static void innerStaticMethods(){
			System.out.println("静态嵌套类的静态方法");
		}
	}
}

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

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

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

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

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

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

4.匿名内部类

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

基本格式:

public class MainTest2 {

public static void main(String[] args) {

// TODO Auto-generated method stub



//第二种匿名类

TestClass3 test1 = new TestClass3() {

@Override

public void sayhi() {

// TODO Auto-generated method stub

        System.out.println("匿名重写抽象类");

    }

};

    InnterFace test2 = new InnterFace() {

@Override

        public void JKout() {

// TODO Auto-generated method stub

        System.out.println("匿名重写接口");

            }

        };

    }

}

//子类的第一种写法
class AbstractClass extends TestClass3 {

@Override

public void sayhi() {

    }

}
class InterFaceClass implements InnterFace{
@Override

public void JKout() {

// TODO Auto-generated method stub

System.out.println( name );

    }

}

无奈源于不够强大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值