1. 内部类
(1) 什么叫内部类:在一个类的内部还存在一个类。如果在类Outer的内部在定义一个类Inner,此时类Inner就称为内部类,而类 Outer则称为外部类
(2) 内部类可以声明成public 或private。而当内部类声明成public 或private时,对其访问限制与成员变量和成员方法完全相同。
(3) 内部类的定义格式
标识符 class 外部类的名称{
//外部类成员
标识符 class 内部类的名称{
//内部类的成员
}
}
2.以下的程序中,InnerDemo类作为Outer类的内部类存在,并且在外部类的fun()方法中直接实例化内部类的对象,并调用了print()方法。
代码如下:
public class Inner {
public static void main(String[] args) {
new Outer().fun();//调用外部类的fun()方法
}
}
class Outer{//定义外部类
private String info = "hello,nishui";//定义外部类的私有属性
class InnerDemo{//定义内部类
public void print(){//定义内部类的的方法
System.out.println(info);//直接访问外部类的私有属性
}
}
public void fun(){//外部类的方法
new InnerDemo().print();//调用内部类的方法
}
}
运行结果:
hello,nishui
3.内部类存在的优点,缺点
(1) 缺点:正常的一个类操作时,在类中最好只定义属性或者方法,如果定义一个类的话,则肯定破坏了程序的一个结构。
(2) 优点:是可以方便的访问 外部类中的私有属性!
4.内部类是无法在外部直接调用的,是无法按照外部类的形式使用的。
笔者在前面说过static静态声明属性或者方法,这里同样使用static来声明内部类。
如果一个内部类使用static关键字声明的话,则此内部类就可以被称之为外部类!可以直接通过“外部类.内部类”进行访问。
举例:
public class Inner3 {
public static void main(String[] args) {
new Outer2.InnerDemo2().print();//调用外部类的fun()方法
}
}
class Outer2{//定义外部类 private static String info = "hello,nishui";//定义外部类的私有属性
static class InnerDemo2{//使用static定义内部类为外部类
public void print(){//定义内部类的的方法
System.out.println(info);//直接访问外部类的私有属性
}
}
public void fun(){//外部类的方法
new InnerDemo2().print();//调用内部类的方法
}
}
总结:使用static可以声明一个内部类,声明的内部类就成为外部类,可以直接在类的外部调用,但是如果要想访问外部类中的属性,则此属性必须是static访问权限的。
5. 在外部访问内部类,不使用static
一个内部类除了可以通过外部类访问,也可以直接在其他类中调用,但是调用的格式为:
外部类.内部类 内部类对象 = 外部类实例.new 内部类();
举例:
public class Inner5 {
public static void main(String[] args) {
Outer11 out = new Outer11();//外部类的实例化
Outer11.Inner11 in = out.new Inner11();
in.print();
}
}
class Outer11{//定义外部类
private String info = "hello,nishui";//定义外部类的私有属性
class Inner11{//定义内部类
public void print(){//定义内部类的的方法
System.out.println(info);//直接访问外部类的私有属性
}
}
public void fun(){//外部类的方法
new Inner11().print();//调用内部类的方法
}
}
运行结果:hello,nishui
6.在方法中定义内部类
一个内部类可以在任意的位置上定义,下面来了解一下在方法中定义内部类
举例:
public class Inner1 {
public static void main(String[] args) {
new OuterTest().fun();
}
}
class OuterTest{//外部类
private String info = "hello";
public void fun(){//在方法中定义内部类
class InnerTest{
public void print(){//定义内部类的的方法
System.out.println(info);//直接访问外部类的私有属性
}
}
new InnerTest().print();
}
}
7.在一个方法中定义内部类,而这个内部类想要访问这个方法中的参数的方法是加上final关键字!
举例:
public class Inner6{
public static void main(String[] args) {
new OuterTest1().fun(30);
}
}
class OuterTest1{//外部类
private String info = "hello";
public void fun(final int temp){//在方法中定义内部类
class InnerTest1{
public void print(){//定义内部类的的方法
System.out.println(info);//直接访问外部类的私有属性
System.out.println(temp);
}
}
new InnerTest1().print();
}
}
运行结果:
hello
30
8. 内部类在实际开发中作用很大,常用到,所以建议读者熟记。
在java系统中也会常看见使用static声明内部类的情况,一定要记住,使用static声明的内部类是外部类,操作的时候要使用“外部类.内部类”的形式访问!