所谓内部类,就是在一个类中声明的类称为内部类。
1.为什么要有内部类呢?
- 内部类可以访问外部类中的私有实例变量。
- 当内部类的访问修饰符声明为private时,内部类只能在外部类内部使用,使用外部类时不知道内部类的存在。
2.什么是内部类呢?
public class Outer {
public void run(){
System.out.println("Hello,I'm in the Outer!!!");
}
public class Inner{
public void run(){
System.out.println("Hello,I'm in the Inner...");
}
}
}
3.如何调用内部类的实例对象呢?
内部类的实例化有两种方法:
Outer.Inner inner = new Outer().new Inner(); inner.run();
Outer outer = new Outer(); Inner inner = outer.new Inner(); inner.run(); //调用内部类的方法 outer.run(); //调用外部类的方法
4.内部类可以调用外部类的实例变量
public class Outer {
private String name = "tom";
public class Inner{
public void run(){
System.out.println("Inner..."+name);
}
}
}
name只有一个属性值,输出的结果就是:Inner...tom
如果在内部类的内部也声明了一个name属性的话,那么它就会根据就近原则,选择离它最近的name值,如果是这样的话,怎么调用外部类的属性值呢?
public class Outer {
private String name = "tom"
public class Inner{
private String name = "jerry";
public void run(){
System.out.println("Hello, Inner..."+ Outer.this.name);
System.out.println("Hello, Inner..."+this.name);
}
}
}
输出结果:Hello,Inner...tom
Hello,Inner...jerry
5.在外部类内部创建内部类对象
在外部类创建内部类对象,直接创建就可以了
public class Outer {
public void hi(){
Inner in = new Inner();
in.run();
}
public class Inner{
public void run(){
……
}
}
}
6.静态内部类
静态内部类就是用static修饰的内部类
public static class Inner{
……
}
在创建时,用外部类直接调用来创建:Outer.Inner inner = new Outer.Inner();
静态内部类的方法可以调用外部类的静态属性:
public class Outer {
private static String name = "jack";
public static class Inner{
private static String name = "merry";
public void sayHi(){
System.out.println("Hello "+Outer.name);
System.out.println("Hello "+ name);
}
}
}
输出结果:Hello jack
Hello merry
7.局部内部类
局部内部类创建在一个方法中,作用范围在这个方法中
public class Outer{
public void hi(){
class Inner{
public void sayHello(){
System.out.println("Hello");
}
}
Inner inner = new Inner();
inner.sayHello();
}
}
为什么采用局部内部类?
- 解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的
- 在方法内部实现一个接口,并返回对其的引用
8.匿名局部内部类
匿名局部内部类就是没有名字的内部类
public interface Usb {
public void run();
}
public Usb getUsb(){
return new Usb() {
@Override
public void run() {
System.out.println("USB RUN...");
}
};
}