内部类
定义:在一个类中进行其他类结构的嵌套操作。
1.内部类的优点:
a.内部类与外部类可以互相访问彼此的私有域,
b.内部类可以实现java的单继承局限
c.内部类可以对同一包中的其他类隐藏起来,只共外部类使用(保护性)
缺点:结构复杂
内部类的简单定义:
class Outer{ //外部类
private String msg="hello world";
class Inner{ //定义一个内部类
public void print(){
System.out.println(msg);
}
}
public void fun(){//在外部类中定义一个方法,该方法负责产生内部类对象并调用print方法
Inner in=new Inner();
in.print();
}
}
public class hehe{
public static void main(String[]args){
Outer out=new Outer();//外部类对象
out.fun();//外部类方法
}
}
修改上述代码,将内部类拆开到外部,是想相同功能:
class Outer{
private String msg="hello world";
public String getMsg(){
return this.msg;
}
public void fun(){ //调用了fun方法 3
Inner in=new Inner(this); //this表示当前对象 4
in.print(); //调用方法 6
}
}
class Inner{
private Outer out;
public Inner(Outer out){
this.out=out; //引用传递 5
}
public void print(){
System.out.println(out.getMsg()); //执行此方法 7
}
}
public class hehe{
public static void main(String[] args) {
Outer out=new Outer();//实例化外部类对象 1
out.fun(); //调用构造方法 2
}
}
2.内部类与外部类关系
a.对于非静态内部类而言,内部类的创建需要依赖外部类的实例化对象,在没有外部类对象之前是无法创建内部类的。
b.内部类是一个相对独立的个体,与外部类不是is-a关系
c.内部类可以直接访问外部类的元素(包含私有域),但是外部类不可以直接访问内部类元素,需要通过内部类的引用间接访问。
(1).内部类直接访问外部类元素
class Outter {
private String outName;
private int outAge;
class Inner {
private int InnerAge;
public Inner() {
Outter.this.outName = "I am Outter class";
Outter.this.outAge = 20;
}
public void display() {
System.out.println(outName);
System.out.println(outAge);
}
}
}
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter().new Inner();
inner.display();
}
}
(2).外部类需要通过内部类的引用间接访问
class Outer{
public void display(){
//外部类访问内部类元素,需要通过内部类引用来访问
Inner in=new Inner();
in.display();
}
class Inner{
public void display(){
System.out.println("haha");
}
}
}
public class hehe{
public static void main(String[]args){
Outer out=new Outer();//外部类对象
out.display();//外部类方法
}
}
3.创建内部类的语法(在外部类之外)
a.创建非静态内部类
外部类.内部类 内部类 内部类引用=new 外部类().new 内部类();
outter.Inner in=new .outter().new Inner();
b.创建静态内部类
外部类.内部类 内部类引用=new 外部类.内部类();直接产生内部类,没有产生外部类对象
outter.inner in=new outter.inner();