Java提高-内部类
内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
一、成员内部类
成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner();
1 public class Outer { 2 public static void main(String[] args) { 3 Outer outer = new Outer(); 4 //第一种调用方法,new 实例化 5 Outer.Inner inner = outer.new Inner(); 6 inner.print("Outer.new"); 7 //第二种方法:getter()方法 8 inner = outer.getInner(); 9 inner.print("Outer.get"); 10 } 11 12 // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 13 public Inner getInner() { 14 return new Inner(); 15 } 16 17 public class Inner { 18 public void print(String str) { 19 System.out.println(str); 20 } 21 } 22 }
二、方法内部类(局部内部类)
方法内部类,是指内部类定义在方法和作用域内。
*方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
*方法内部类使用时,在方法中创建内部类对象,用对象调用其内部类中的方法。
注:由于方法内部类不能在外部类的方法以外的地方使用呢,因此方法内部类不能使用访问控制符合 static 修饰符
Test类:
1 package methodinner; 2 3 public class Test { 4 //定义在方法里面 5 public void driver(){ 6 System.out.println("我在开车"); 7 8 class B extends DuanZanShiChangZheng {}//定义方法内部类,继承DuanZanShiChangZheng(),ps不一定要继承父类类 9 new B().noProblem();//调用方法内部类的noProblem方法 10 // System.out.println("撞到人了");//变成没事 11 System.out.println("一切恢复正常"); 12 } 13 14 public void show(){ 15 16 } 17 18 public static void main(String[] args) { 19 new Test().driver(); 20 } 21 }
DuanZanShiChangZheng类:
1 package methodinner; 2 3 public class DuanZanShiChangZheng { 4 public void noProblem(){ 5 System.out.println("我有短暂精神病,杀人也没事");//变成没事 6 } 7 }
运行结果:
方法内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。
三、匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的
我们可以通过下面这个栗子,能够明白。
QinShou接口:
1 package memberinner2; 2 3 public interface QinShou { 4 5 public abstract void workInght(); 6 }
Doctor类:
1 package memberinner2; 2 3 public abstract class Doctor implements QinShou{ 4 5 public void workInDay() { 6 System.out.println("白天教授理论知识"); 7 } 8 9 }
Test类:
1 package memberinner2; 2 3 public class Test { 4 public static void main(String[] args) { 5 Doctor d1 = new Doctor1() ; 6 d1.workInDay(); 7 d1.workInght(); 8 Doctor d2 = new Doctor2() ; 9 d2.workInDay(); 10 d2.workInght(); 11 //匿名内部类 12 //new 一个抽象类或者接口 13 //后加{},实现里面的方法 14 Doctor d3 = new Doctor() { 15 16 public void workInght() { 17 System.out.println("嗨起来"); 18 19 } 20 }; 21 d3.workInDay(); 22 d3.workInght(); 23 24 } 25 }
运行结果:
在使用匿名内部类的过程中,我们需要注意如下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
以上就是我对内部类的理解和例子。。。