1.1 内部类
1.1.1 内部类的基本定义
在类内部可定义成员变量与方法,而且在类内部也可以定义另一个类。如果在Outer的内部再定义一个类Inner,此时类Inner就称为内部类,而类Outer则称为外部类。
内部类可声明成public或private。当内部类声明成public或private时,对其访问的限制与成员变量和成员方法完全相同。内部类的声明格式:
标识符 class 外部类的名称{
//外部类的成员
标识符 class内部类的名称{
//内部类的成员
}
}
定义内部类:
class Outer{
private String info = "Hello";
class Inner{
public void print(){
System.out.println(info);
}
}
public void fun(){
new Inner().print();
}
}
class InnerClassDemo01{
public static void main(String[] args) {
new Outer().fun();
}
}
运行结果:
Hello
Inner类作为Outer类的内部类存在,并且在外部类的fun()方法之中直接实例化内部类的对象并调用方法print(),但是从以上代码中可以明显地发现,内部类的存在实际上已经破坏了一个类的基本结构,因为类是由书香及方法组成的,所以这是内部类的一个缺点。把内部类拿到外面就能发现内部类的优点:
class Outer1{
private String info = "你成功了!";
public String getInfo(){
return info;
}
public void fun(){
new Inner(this).print();
}
}
class Inner{
private Outer1 out = null;
public Inner(Outer1 out){
this.out = out;
}
public void print(){
System.out.println(out.getInfo());
}
}
class InnerClassDemo02{
public static void main(String[] args) {
new Outer1().fun();
}
}
运行结果:
你成功了!
完成了与内部类同样的功能,但是代码明显比之前的更加复杂,所以内部类的唯一好处就是可以方便的访问外部类中的私有属性。
1.1.2 使用static定义内部类
使用static可以声明属性或方法,而使用static也可以声明内部类,用是他提出声明的内部类变成了外部类,但是用static声明的内部类不能访问非static的外部属性。
class Outer2{
private static String info = "Hello";
static class Inner{
public void print(){
System.out.println(info);
}
}
}
class InnerClassDemo03{
public static void main(String[] args) {
new Outer2.Inner().print();
}
}
运行结果:
Hello
1.1.3 在外部访问内部类
一个内部类除了可以通过外部类访问,也可以直接在其他类中进行调用,调用的基本格式:
外部类.内部类 内部类对象 = 外部类实例.new 内部类();
首先要找到外部类的实例化对象后,才可以通过外部类的实例化对象去实例化内部类的对象。
在外部访问内部类:
class Outer3{
private String info = "Hello";
class Inner{
public void print(){
System.out.println(info);
}
}
}
class InnerClassDemo04{
public static void main(String[] args) {
Outer3 out = new Outer3();
Outer3.Inner in = out.new Inner();
in.print();
}
}
运行结果:
Hello
1.1.4 在方法中定义内部类
也可以在方法中定义一个内部类,但是在方法中定义的内部类不能直接访问方法中的参数,如果方法中的参数要想被内部类所方位,则参数前必须加上final关键字。
在方法中定义内部类:
class Outer4{
private String info = "Hello";
public void fun(final int temp){
class Inner{
public void print(){
System.out.println("类中的属性" + info);
System.out.println("方法中的参数" + temp);
}
}
new Inner().print();
}
}
class InnerClassDemo05{
public static void main(String[] args) {
new Outer4().fun(30);
}
}
运行结果:
类中的属性Hello
方法中的参数30
转载于:https://blog.51cto.com/5838311/1009337