文章目录
如果在一个文件中创建了两个类,那么这两个类是并列关系,不存在哪一个类包含哪一个类的情况。如果在类中再定义一个类,那么这个在类中被定义的类叫做内部类。
内部类:内部类是在一个类内部定义的类。
作用:可以访问外部类的成员,并提供更好的封装和组织代码的能力。
语法:
public class OuterClass{ //外部类
private class InnerClass{ //成员内部类
//…
}
}
规则1:内部类可以随意使用外部类的成员方法和成员变量,即使有 private 权限关键字修饰,也可以使用。
class OuterClassa{ //外部类
private int a = 0; //外部类成员变量
private void b(){
//外部类成员方法
}
private class InnerClass{ //内部类
void c() { //内部类的成员方法
a++;
b();
//在内部类方法中,调用了外部类的成员方法和成员变量
}
}
}
规则2:内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用。外部类中可以使用内部类对象引用调用内部类的成员变量。
规则3:如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类的对象上。内部类的初始化方式也是使用new关键字,在外部类和外部类非静态方法中直接实例化。
interClass in = new interClass();
规则4: 如果是在静态方法中实例化内部类对象,需要调用外部类对象。内部类的形式指定该对象的类型
//在main方法中:
OuterClass out = new OuterClass(); //外部类实例化
OuterClass.innterClass in =out.new interClass(); //外部类对象实例化内部类对象
另一种方法:在方法中返回值实例化内部类对象:通过方法返回值实现成员内部类的实例化
public OutInterface doit() {
//定义一个方法,返回值类型为 OutInterface接口
return new InnerClass("访问内部类构造方法");
//return new 关键字,实现实例化内部类对象
}
实例:
interface OutInterface{
// 创建接口,方法通过接口实现 new实例化 内部类对象
}
class OuterClass2{
//定义一个内部类实现OutInterface接口
private class InnerClass implements OutInterface{
InnerClass(String s){ //内部类构造方法
System.out.println(s);
}
}
public OutInterface doit() { //定义一个方法,返回值类型为 OutInterface接口
return new InnerClass("访问内部类构造方法");
}
}
public class InterfaceInner {
public static void main(String[] args) {
OuterClass2 out = new OuterClass2();
//调用 doit()方法,返回一个OuterInterface接口
OutInterface outinter = out.doit();
//通过外部对象 out 调用 doit()方法,new关键字 实例化内部类对象
}
}
输出结果:
解析:
1.创建了一个接口。用于外部类doit()方法,返回值类型为接口,实现内部类的实例化。
2.创建了一个外部类。外部类中写了一个 doit()方法,用于在静态方法中创建内部类对象。
3.创建了一个内部类。内部类实现了接口,并且写了一个构造方法。
4.创建了一个静态方法。静态方法中创建了外部类对象。通过外部类对象,调用外部类方法doit()方法,实现内部类的实例化(尽管赋值的对象是一个接口)。
局部内部类:在类的方法或任意的作用域中定义的内部类。
语法:
public OutInterface action(String x) {
//这是一个方法
class innerClass implements OutInterface{
//这是写在方法里的一个局部内部类
}
}
实例:
package package5;
public class Demo2 {
interface OutInterface{
}
public OutInterface action(String x) {
class innerClass implements OutInterface{
//这是写在方法里的一个局部内部类
public innerClass(String s) {
//局部内部类的构造方法
s = x;
System.out.println(s);
}
}
//方法返回值为实例化局部内部类,括号中赋值了局部内部类的构造方法,通过实现一个接口,
return new innerClass("");
}
public static void main(String[] args) {
Demo2 de = new Demo2();
de.action("这里是局部内部类");
}
}
附加规则:
局部内部类:在方法中定义的局部内部类只能访问方法中 final类型的局部变量,并且不能改变该局部变量。
以上就是对java的内部类的部分介绍,成员内部类,局部内部类的使用。如果有其他的问题,欢迎在评论区评论,我会及时地进行反馈。下一篇补充完内部类的剩下内容。