内部类(成员内部类、静态内部类、匿名内部类)

成员内部类

//语法结构
修饰符 class 外部类名称{
    修饰符 class 内部类名称{
		//....
    }
   //...
}

使用方法

直接在外部类的方法里面创建内部类,调用内部类的方法即可

public class outside {
    public void outsedeMethod(){
        System.out.println ("这个外部类的方法!");
        new inner ().eat ();
    }
    class inner{
        public  void eat(){
            System.out.println ("老莫,我想吃鱼!");
        }
    }
}
public class DemoinnerClass {
    public static void main(String[] args) {
        outside outside = new outside ();
        outside.outsedeMethod ();
    }
}
=========打印结果==========
这个外部类的方法!
老莫,我想吃鱼!

总结:

  • 主要是用来弥补单继承的缺陷,补充类的功能
  • 除了外部类都无法直接访问内部类,可以提供更好的隐蔽性
  • 内部类定义的 private 属性外部类也不可以访问,因此对外界来说,比 private 的访问权限更小
  • 成员内部类不允许有任何的静态成员,必须先创建外部类再创建内部类

静态内部类

//语法结构
修饰符 class 外部类名称{
    static class 内部类名称{
		//....
    }
   //...
}

使用方法

public class outside {
    public void outsedeMethod(){
        System.out.println ("这个外部类的方法!");

    }
    public static void eat(){
        System.out.println ("我今天想吃鲫鱼!");
    }
    
    static class inner{
        public  void eat(){
            System.out.println ("老莫,我想吃鱼!");
        }
        public void eatmore(){

            new outside ().outsedeMethod ();
            eat ();
        }
    }
}
public class DemoinnerClass {
    public static void main(String[] args) {
        outside.inner inner = new outside.inner ();
        inner.eat ();
        inner.eatmore ();
    }
}
========打印结果=========
老莫,我想吃鱼!
这个外部类的方法!
老莫,我想吃鱼!

总结:

  • 静态内部类可以直接访问外部类的静态成员,包括私有的,但是不能访问非静态成员–>需要创建创建实例对象调用

  • 创建静态内部类不需要创建外部类,可以直接使用 new 外部类.内部类.方法 来调用静态内部类的方法

  • 静态内部类可以有静态或非静态的成员,且获取静态内部类对象时,不需要先创建外部类对象

    匿名内部类

匿名内部类是局部内部类的一种简化形式.本质上是一个对象,是实现了该接口或继承了该抽象类的子类对象

//语法结构
    new 类名或者接口名(){
        重写方法;
    } ;

使用方法

public interface Eating {
    public  void eat();
}
public class anonymousinnerClass {
    public static void main(String[] args) {
        new Eating (){
            @Override
            public void eat(){
                System.out.println ("吃鱼!");
            }
        }.eat ();
    }
}

=============打印==================
    吃鱼!
    
 public abstract class Eating {
    public abstract void eating();
}   
public class outside {
    public void outsedeMethod(){
        System.out.println ("这个外部类的方法!");
    }
    public static void eat(){
        System.out.println ("我今天想吃鲫鱼!");
    }
    static class inner{
        public  void eat(){
            System.out.println ("老莫,我想吃鱼!");
        }
        public void eatmore(){

            new outside ().outsedeMethod ();
            eat ();
        }
    }
}    
  =============打印==================
我今天想吃鲫鱼
我今天想吃鳜鱼!
    
    
    
    

总结:

  • 匿名内部类,经常作为参数,或返回值,使用比较方便
  • 不需要重新写一个类再实现接口,减少资源浪费*
  • 一个类中可以嵌套一个接口,并调用重写后的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值