内部类
内部类的概念
-
内部类其实就是在一个类的内部再定义一个类。例如A类中定义一个B类,那么B类对A类来说就是一个内部类,而A类对B类来说就是一个外部类。
主要分为以下几个类:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
-
注意:内部类有区别于父子类继承关系
-
内部类对象的创建依赖于外部类对象
-
内部类对象持有指向外部类对象的引用
成员内部类
- 在书写好内部类和外部类之后,需要通过外部类来实例化内部类,这样内部类才能发挥自己本身有的一些方法,具体如代码例子
package Demo02;
//外部类
public class Outside {
private int LuckyNumber=6;
public void say(){
System.out.println("I'm an Outer!");
}
//内部类
public class Inside{
public void hey(){
System.out.println("I'm an Inner!");
}
//内部类可以直接访问外部类的一些方法或者变量
//静态内部类不能访问外部类的属性方法
public void getLuckyNumber(){
System.out.println("Hey! my lucky number is "+LuckyNumber);
say();
}
}
}
package Demo02;
//测试用类
public class Test {
public static void main(String[] args) {
Outside outside = new Outside(); //创建一个指向Outside对象的引用变量outside,类型为Outside
Outside.Inside inside = outside.new Inside(); //利用外部类来引用其中的内部类,并创建一个指向被外部类指向的内部对象的一个引用变量inside,类型为内部类Inside
outside.say(); //用引用变量outside指向外部类Outside中的方法进行调用。
inside.hey(); //用内部类的引用变量inside指向内部类Inside中的方法进行调用
inside.getLuckyNumber(); //利用内部类的方法获取外部类的变量和方法,连私有变量也可以获取
}
}
/*输出结果:
I'm an Outer!
I'm an Inner!
Hey! my lucky number is 6
I'm an Outer!
*/
静态内部类
- 如果将内部类用static修饰,那么最先执行的会是内部类里面的内容,原因是static的静态方法区是和类同时加载的,而外部类的属性若不为static类型,则先加载的会是static类型的静态内部类的内容。
- 注意:普通的内部类可以直接访问外部类中的static方法和属性,静态内部类也可以,但是有一点要注意,如果内部类是静态内部类,则如需访问外部类的属性和方法,就需要将外部类的属性和方法转换为static类型。
局部内部类
- 一个java文件中可以有多个class类,但是只能有一个public类型的类。
- 其次,方法里面也可以写类,例如在外部类里面的方法中书写其他的class类,而且局部内部类里面也可以写一些方法。
匿名内部类
- 匿名内部类即是没有进行初始化的类,即没有引用变量的类
- 这种匿名内部类不用将实例保存在变量中,可以直接实例化后直接调用其内部的方法。
代码例子:
package Demo02;
public class Outside {
........
}
class Unname{
public void WithOut(){
System.out.println("我是匿名内部类");
}
}
package Demo02;
public class Test {
public static void main(String[] args) {
new Unname().WithOut();
}
}
//接口也同样适用
//输出结果:我是匿名内部类