内部类:成员内部类,局部内部类,静态内部类,匿名内部类
2017-12-09 17:46
288 查看
public class OuterClass { private String name = "123"; private int age = 20; private static char sex ='女'; /** * 成员内部类 * 1.可以无限制访问外部成员,包括私有的和静态的 * 2.内部类不能含有static的变量或方法;因为含有static修饰的变量或成员在类加载的时候初始化,此时还没有外部类 * 有static修饰的变量或方法只能放在静态内部类中 * 3.外部类访问内部类的成员和方法 * 外部类名.成员内部类名 对象名 = new 外部类名().new 内部类名(); * 对象名.成员 * 4.外部类无法访问内部类的私有属性或方法 * 5.当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。 * 如果要在内部类中访问外部类的同名成员,需要以下面的形式进行访问 * 外部类.this.成员变量 * 外部类.this.成员方法 * 练习: * 1. 创建一个外部类,含有一个成员变量age=30; * 2. 创建一个内部类,含有一个内部成员变量age=20; * 3. 在内部类里创建一个方法,里面有一个局部变量age=10,在这个方法里分别打印值不同的三个age * 4. 在main方法中,调用内部类的方法 * */ class InnerClass{ private char sex ='男'; private int age = 30; public void print(){ int age = 10; System.out.println(name); System.out.println(OuterClass.this.sex); System.out.println(age); System.out.println(this.age); System.out.println(OuterClass.this.age); } } /** * 2.局部内部类 * 局部内部类,是定义在一个方法或者一个作用域里面的类 * 局部内部类不能被public、protected、private以及static修饰符的。他的作用域被限定在声明这个局部类的块中 * 除了method方法,没有任何方法知道此类的存在 */ public void method(){ int a = 10; class InnerClass2{ public void print(){ System.out.println("哈哈哈"); } } InnerClass2 inner = new InnerClass2(); inner.print(); } { class InnerClass2{ } } /** * 3.静态(嵌套)内部类 * a.成员内部类前加上了static修饰,它不能使用外部类的非static成员变量或者方法 * b.外部类调用该内部类的成员 * 调用静态成员:外部类名.内部类名.静态成员 * 调用非静态成员:new 外部类名.内部类名().非静态成员 * int age = OutClass1.StaticInnerClass.b;//不需要创建外部类,也不需要创建内部类 int age1 = new OutClass1.StaticInnerClass().a;//调用静态内部类的非静态方法 * */ static class InnerClass3{ static int i = 100; String j = "你好"; public void print(){ System.out.println(sex); } } public void method2(){ System.out.println(OuterClass.InnerClass3.i); System.out.println(new OuterClass.InnerClass3().j); } public static void main(String[] args) { OuterClass.InnerClass oi = new OuterClass().new InnerClass(); System.out.println(oi.sex); oi.print(); //System.out.println(OuterClass.this.sex); OuterClass out = new OuterClass(); out.method(); out.method2(); } }
/** * 4. 匿名内部类 * 匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次, * 它通常用来简化代码编写,但使用匿名内部类还有个前提条件: * 必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。 * 匿名内部类不能有构造方法。 * 匿名内部类不能定义任何静态成员、方法和类。 * 匿名内部类的本质:是继承了一个类或者实现接口的匿名子类对象 关于匿名内部类还有如下两条规则: 1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。 因此不允许将匿名内部类定义成抽象类。 2)匿名内部类不能定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器, 但匿名内部类可以定义实例初始化块, 匿名内部类的格式: new 类名或者接口(){ 重写或者实现的方法 }; */ public class NoNameClassDemo { public static void main(String[] args) { A a = new Aa(); a.testA(); new A(){ public void testA(){ System.out.println("匿名内部类的aaa"); } }.testA(); A a1 = new A(){ public void testA(){ System.out.println("匿名内部类的aaa1111"); } }; a1.testA(); B b= new B(){ public void testB(){ System.out.println("BBBB"); } }; b.testB(); new B(){ public void testB(){ System.out.println("BBBB"); } }.testB(); new C(){ public void testC(){ System.out.println("匿名内部类的CCC"); } }.testC(); } } interface A{ public void testA(); } abstract class B{ abstract void testB(); } class C{ public void testC(){ System.out.println("父类的c"); } } class Aa implements A{ @Override public void testA() { System.out.println("AAA"); } }
相关文章推荐
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- 内部类 静态内部类 成员内部类 局部内部类 匿名内部类
- Java基础_内部类、静态内部类、成员内部类、局部内部类、匿名内部类 (转)
- 成员内部类局部内部类静态内部类匿名内部类总结
- Java 内部类详解(成员内部类、静态内部类、局部内部类、匿名内部类)
- JAVA内部类 (成员内部类、局部内部类、匿名内部类、静态内部类、内部类的继承))
- 成员内部类,局部内部类,静态内部类,匿名内部类
- Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- 成员内部类、静态内部类、局部内部类、匿名内部类
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- 内部类(静态内部类 成员内部类 局部内部类 匿名内部类)
- Lesson_for_java_day18--java中的内部类(成员内部类、局部内部类,静态内部类,匿名内部类)
- 成员内部类,静态内部类,匿名内部类,局部内部类
- Java多继承方法(名)冲突和成员内部类、局部内部类、静态内部类、匿名内部类
- 六个实例教你正确使用Java内部类(成员内部类、匿名内部类、静态内部类、局部内部类)
- Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)
- 牛客网Java刷题知识点之什么是内部类、为什么要使用内部类、内部类如何使用外部类的属性和方法、成员内部类、局部内部类、静态内部类、匿名内部类
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结