Java—内部类(普通,静态,局部,匿名)

昨天晚上本来是拉着学长给我讲RecycleView如何实现加载更多效果的,结果——————————————————————————————————

就扯到了内部类

学长昨天给我讲了好多好多 自己回去也写了一些例子总结了一些
然后,记录一下我理解的java内部类:大概就是从以下几个方面

重点在分析四种内部类的特点上
  • 什么是java内部类?
  • 为什么要使用内部类?
  • 内部类的分类?
  • 分析四种内部类的特点?

一.什么是java内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。
————————————————来自百度百科的解释

二. 为什么要使用内部类?

典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其他外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
我的理解就是虽然打破java单继承我们都会选择去实现一个或者多个接口,但是如果我们必须要继承两个类呢?因为内部类和外部类是独立的类,所以他们就可以同时去继承不同的类,再通过访问特点去访问就更好的弥补了单继承这个缺点

三.内部类的分类??

在Java中内部类主要分为:
普通内部类
静态内部类
局部内部类
匿名内部类

四.分析四种内部类的特点

接下来这个部分应该是记录的重点部分
我会从代码,举例去分析各种内部类的特点

1.普通内部类

普通内部类不含有任何的static方法和变量。
可以无限制的使用外部类的成员和方法。(普通内部类隐式的含有外部类的对象
必须通过外部类的对象来访问内部类或者创建内部类,看一下代码的例子

public class OuterClass {
    private int x = 1;
    private String a = "ordinaryInternalClass";
    private int fun(){
        return 1;
    }
    public class InnerClass{
        public void  getString(){
            System.out.println("x="+x+"    a="+a+"     fun()="+fun());
        }
    }
    public static void main(String args[]){
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass innear = outer.new InnerClass();
        innear.getString();

    }
}

我们可以看到在访问内部类访问外部类的时候是没有限制的
在创建内部类对象的时候必须通过外部类对象来创建

2.静态内部类

静态内部类是不含有外部类的引用的,所以说静态内部类不能没有限制的访问外部类的部分,他只能访问外部类中static的变量和方法,
而且静态内部类不依赖于外部类所以静态内部类的创建不用通过外部类来创建。
看一下例子:

public class OuterClass {
    //private int x = 1;
    static  String a = "staticInternalClass";
    static int fun(){
        return 1;
    }
    static  class InnerClass{
        public void  getString(){
            System.out.println("a="+a+"     fun()="+fun());
        }
    }
    public static void main(String args[]){
        //OuterClass outer = new OuterClass();
        InnerClass innear =  new InnerClass();
        innear.getString();

    }
}
3.局部内部类

嵌套在方法和或者语句块中的一种类
他只能在这个方法或者语句块中起作用
出了这个方法和语句块就没有什么作用了。

看个例子:

public class OuterClass {
    private int x = 1;
    private String a = "LocalInternalClass";
    private String  fun(){
        class InnerClass{
        String r ;
        public  String  getString( ){
             r = x+" "+a;
             return r;
        }
      }
        return new InnerClass().getString();

    }
    public static void main(String args[]){
        OuterClass outer = new OuterClass();
        System.out.println(outer.fun());        

    }
}
4.匿名内部类

开始我还不知道原来有时候写监听事件的时候就用到了匿名内部类
匿名内部类对参数的要求也很严格,而且匿名内部类没有构造方法
如果要初始化匿名内部类,可以写一个代码块
看一下代码:

public class OuterClass{
    private int x = 1;
    private String a = "ordinaryInternalClass";
    public innearClass qqq(){
          return new  innearClass(){
            public void fun(){
                System.out.println("x="+x+"    a="+a);
            }
           };      
    }
    public static void main(String args[]){
        OuterClass outer = new OuterClass();
        innearClass v = outer.qqq();
        v.fun();

    }
}
interface innearClass{
    void  fun();
}

我了解的太浅了,就大概只知道这么多

联系一下生活中的例子应该好理解一些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值