内部类
内部类:就是在一个类的内部再创建一个类
public class OuterClass{ public class innerClass{ } }
访问特点:
-
内部类可以直接访问外部类的成员,包括私有的内容
-
外部类要访问内部类的成员,必须要创建对象
public class demo1 { private int num = 10; public class Inner{ //内部类 public void showNum(){ //内部类的方法 System.out.println(num); } } public void method(){ // show(); Inner i = new Inner(); i.showNum(); } }
分类
-
在类的成员位置:成员内部类
-
在类的局部位置(方法里面):局部内部类
成员内部类的使用
外界的使用方法
内部类为public修饰时:
(实际上很少用)
public class demo { public static void main(String[] args) { //使用格式 Outer.Inner i = new Outer().new Inner(); i.showNum(); } }
内部类为private修饰时:
public class demo { public static void main(String[] args) { Outer o = new Outer(); o.method(); //表面上调用外部方式,实际上访问的是内部内容 } }
public class Outer { private int num = 10; private class Inner{ //内部类 public void showNum(){ //内部类的方法 System.out.println(num); } } public void method(){ Inner i = new Inner(); i.showNum(); //外部方法可以访问内部 } }
表面上调用外部方式,实际上访问的是内部内容
有点类似于get/set
局部内部类的使用
public class Outer { private int num = 10; public void method(){ int num2 = 20; class Inner{ public void show(){ System.out.println(num); System.out.println(num2); } } Inner i = new Inner(); //创建inner类的实例,调用方法 i.show(); } }
public class demo { public static void main(String[] args) { Outer o = new Outer(); o.method(); } }
-
方法中定义的类,外界无法直接使用,在方法内部创建对象并使用
-
该类既可以访问外部类的成员,也可以访问方法内部的局部变量
一种特殊的局部内部类——匿名内部类
-
前提:存在一个类或者接口,这里的类可以是抽象,也可以是具体类
-
本质:是一个继承了该类或者实现了该接口的子类匿名对象
public interface Inter { void show(); }
public class demo { public static void main(String[] args) { Outer o = new Outer(); o.method(); } }
public class Outer { public void method(){ new Inter(){ @Override public void show() { //重写(继承/实现的)方法 System.out.println("匿名内部类"); } }.show(); //本质是一个对象 } }
由于是一个对象
public class Outer { public void method(){ Inter i = new Inter(){ @Override public void show() { //重写(继承/实现的)方法 System.out.println("匿名内部类"); } }; I.show();//本质是一个对象 } }
匿名内部类在开发中的作用:
public class jumpDome { public static void main(String[] args) { jumpOp jo = new jumpOp(); //实例化操作类,因为操作类对象可以调用show方法 jo.method(new Inter() { @Override public void jump() { System.out.println("猫可以跳高了"); } }); jo.method(new Inter() { @Override public void jump() { System.out.println("狗可以跳高了"); } }); } }
public interface Inter { void jump(); }
//接口操作类里面有一个方法,方法的参数是接口名,该类存在的目的是对接口进行操作 public class jumpOp { public void method(Inter inter){ inter.jump(); } }