day01 对内部类的理解

tech2024-08-06  49

day01 对内部类的理解

为什么要使用内部类

为什么需要内部类? 解决了多继承的问题,继承具体或抽象类。 一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为 内部类提供了某种进入其外围类的窗口。 内部类最吸引人的原因是:每个内部类都能独立地 继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影 响。 如果没有内部类提供的、可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个 角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效的实现了“多重继 承”。也就是说,内部类允许继承多个非接口类型。 考虑这样一种情形:如果必须在一个类中以某种方式实现两个接口。由于接口的灵活性,你有两种选择:使 用单一类或者使用内部类。但如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实 现多重继承。 使用内部类,还可以获得其他一些特性: 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口或继承同一个类。 创建内部类对象的时刻并不依赖于外围类对象的创建。 内部类并没有令人迷惑的is-a关系,它就是一个独立的实体

内部类分为成员内部类、静态内部类、方法内部类

1、成员内部类

package com; //成员内部类 public class InnerClass { private int a = 99; public void outerTest(){ System.out.println("这是一个外部类方法"); } Inner in = new Inner(); public class Inner{ int b = 2; public void test(){ System.out.println("这是一个成员内部类"); outerTest();//直接调用外面的成员方法 System.out.println("访问外部类中的a"+a); System.out.println("访问内部类中的b"+b); } } public static void main(String[] args) { InnerClass innerClass = new InnerClass(); System.out.println("调用外部类的成员变量"+innerClass.a); //调用内部类中的方法 Inner inner = innerClass.new Inner(); inner.test(); innerClass.in.test(); } } public class Outer { String name = "张三"; public class Inner{ String name = "李四"; public void test(){ System.out.println("访问内部类的name"+name); System.out.println("访问外部类的name"+Outer.this.name); } } public static void main(String[] args) { Outer out = new Outer(); Inner in = out.new Inner(); in.test(); } } //1.如果外部类的name变量和内部类重名,优先使用内部类的name //2.如果需要访问外部类中的name属性,需要类名.this.name来访问。

2、静态内部类

public class StaticOuter { String name = "张三"; static String love = "篮球"; public static class Inner{ String name2 = "李四"; public void test(){ System.out.println("访问内部类的name"+name2); //静态内部类如果需要访问外部类的静态成员变量,需要创建对象访问 StaticOuter outer = new StaticOuter(); System.out.println("访问外部类的name"+outer.name); System.out.println("访问外部类的静态成员"+StaticOuter.love); } } public static void main(String[] args) { Inner inn1 = new Inner(); inn1.test();; } }

1.注意:静态内部类不需要创建外部类对象,可以直接创建静态内部类对象调用 2.静态内部类如果需要访问外部类的非静态成员,需要创建对象访问 3.静态内部类访问外部类静态成员,需要用类名.属性来访问

3、方法内部类

1.方法内部类就是定义在外部类的方法中,方法内部类只在该方法内可以使用 2、由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制权限static修饰

public class MethodInner { //外部类的方法 public void show(){ final int a = 25; int b = 12; class Inner{ int c = 13; public void print(){ System.out.println("访问外部类的方法的常量:"+a); System.out.println("访问内部类中的变量c"+c); } } Inner in = new Inner(); in.print(); } public static void main(String[] args) { MethodInner out = new MethodInner(); out.show(); } }

4、匿名内部类

匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

public interface Person{ public void eat(); } public class Test{ public static void main(String[] args){ Person per = new Person{ public void eat(){ System.out.println("吃饭饭"); } }; per.eat(); } }

只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现 最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

最新回复(0)