java中的内部类

1.什么是内部类

:内部类就是在一个类的内部进行其他类结构的嵌套的操作,简单结构如下

//外部类
class Outter{
    //内部类
    class Inner{
    }
}
public class InnerTest {
    public static void main(String[] args) {
    }
}

2.为什么需要内部类

内部类和外部类可以互相访问彼此的私有域(比如private 修饰的属性和方法)

//外部类
class Outter{
    private  int a =5;            //外部类的私有属性a
    //内部类----------------------
    class Inner{
        public void print(){
            System.out.println(a); //内部类输出外部类Outter的私有属性a
        }
    }
    //-------------------内部类完成
    public void fun(){            //外部类的普通方法fun
        new Inner().print();       //调用内部类的print方法
    }
}
public class InnerTest {
    public static void main(String[] args) {
        new Outter().fun();        //调用外部类的fun方法
    }
}
  • 内部类可以解决java的单继承局限
class A{
    private int a =1;     //A类的私有属性a
    public int getA(){
        return a;
    }
}
class B{
    private int b =2;     //B类的私有属性b
    public int getB(){
        return b;
    }
}
class OutterC{              //外部类OutterC
    class InnerA extends A{  //内部类InnerA继承A类
        public int printA(){
            return super.getA(); //调用父类方法getA()
        }
    }
    class InnerB extends B{   //内部类InnerB继承B类
        public int printB(){
            return super.getB(); //调用父类方法getB()
        }
    }
    public int a(){
       return  new InnerA().printA();//1.内部类对象 2.内部类提供的方法
    }
    public int b(){
        return new InnerB().printB();//1.内部类对象 2.内部类提供的方法
    }
}

public class InnerTest {
    public static void main(String[] args) {
        System.out.println(new OutterC().a());//外部类对象调用外部类的方法
        System.out.println(new OutterC().b());
    }
}
  • 内部类可以对同一包中的其他类进行隐藏,仅供自己的外部类使用,类似于封装。

3.内部类带来的缺点:破坏了程序的结构,使得程序变得复杂

4.内部类和外部类之间的关系

  • 对于非静态内部类而言,内部类的创建需要依赖外部类的实例化对象,没有外部类对象之前,无法创建内部类
  • 内部类是一个相对独立的个体,与外部类不是继承关系
  • 内部类可以直接访问外部类的元素(包含私有域)
  • 外部类不可以直接访问内部类元素,需要通过内部类的引用调用
class Outter{
    private String msg = "I am Java";
    //------------------------
    class Inner{
        public void print(){
            System.out.println(msg); //内部类直接访问外部类的私有属性msg 
        }
    }
    //------------------------
    public void fun(){
        new Inner().print();         //外部类通过引用访问内部类的方法
    }
}
public class InnerTest {
    public static void main(String[] args) {
        new Outter().fun();          //创建外部类的实例化对象
    }
}

5.内部类的分类

  • 成员内部类
  1. 成员内部类不能存在任何static变量或者方法,可以访问但是不可以拥有
  2. 成员内部类需要依附外部类的创建【语法:new 外部类().new 内部类()】
  3. 成员内部类可以使用private封装,表示私有内部类,该内部类仅供外部类使用【eg:ArrayList中的Node内部类】
  • 静态内部类:使用ststic修饰的内部类。
  1. 静态内部类的创建不需要依附外部类,可以直接创建【语法:new 外部类.内部类()】
  2. 静态内部类不可以访问任何外部类的非static域,可以拥有,但不能访问
  • 方法内部类:被定义在外部类方法中的类,只能作用在该方法中。
  1. 方法内部类不能使用任何访问权限修饰符
  2. 方法内部类对外(方法外)完全隐藏,除了该方法可以访问,其余地方都不可以
  3. 方法内部类要想使用方法形参,该形参必须使用final声明(JDK8是隐式final声明)
  • 匿名内部类:没有名字的方法内部类
  1. 匿名内部类没有访问修饰符
  2. 匿名内部类必继承一个抽象类或者实现一个接口
  3. 匿名内部类中不能存在任何static成员或方法
  4. 匿名内部类是没有构造方法的,因为他没有类名
  5. 匿名内部类要是想使用方法形参,该形参必须使用final声明

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值