概念:
类的类就称为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条)