Java中的内部类你了解吗

目录
  • 成员内部类
    • 1.定义
    • 2.成员内部类的使用规则
    • 3.成员内部类对象的创建:
    • 4.内部类与静态域
  • 静态内部类:
    • 1.定义:
    • 2.静态内部类的使用规则:
    • 3.静态内部类对象的创建
  • 成员内部类 VS 静态内部类
  • 方法内部类:
    • 1.定义:
    • 2.方法内部类的使用规则:
    • 3.注意形参的使用
  • 匿名内部类(函数式编程)
  • 总结

成员内部类

1.定义

成员内部类是直接定义在类中,不加任何修饰符的(特指不加static修饰的)的内部类,可以类比着成员变量来理解,如下面这个代码段中的Inn类就是一个成员内部类

public class Inner1 {
    private String o = "外部类属性";
    public class Inn{
        private String i = "成员内部类属性";
    }
}

2.成员内部类的使用规则

  • 内部类可以直接的访问外部类的成员变量,但是因为内部类也是一个类,所以外部类必须通过内部类的对象才能访问内部类的成员变量
  • 内部类就相当于外部类的成员变量,故而内部类与外部类之间可以方便的相互访问,包括privte权限修饰的属性和方法
  • 成员内部类可以实现“曲线救国”,通过多个内部类继承别的类,变相的实现多继承
//成员内部类
public class Inner1 {
//    外部类的私有属性o
    private String o = "外部类属性";
    public class Inn{
//        内部类的私有属性i
        private String i = "成员内部类属性";
        private void Itest(){
//            内部类直接访问外部类的属性,包括私有属性
            System.out.println(o);
        }
    }
    public void Otest(){
//        外部类则要先创建内部类的对象再访问其成员变量,这里注意,也可以访问其私有属性
        Inn in = new Inn();
        in.Itest();
        System.out.println(in.i);
    }
    public static void main(String[] args) {
        Inner1 i1 = new Inner1();
        i1.Otest();
    }
}

3.成员内部类对象的创建:

  • 外部类的内部创建:与正常类的对象创建方法一样,
  • 内部类名称 对象名 = new 类名()
public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    private class Inn{
        private String str2 = "内部类";
    }
}
  • 外部类的外部创建:成员内部类就相当于是外部类的一个特殊的成员变量,故而,我们知道,成员内部类依赖于外部类的存在而存在,也就是说,必须先有外部类的对象才能创建成员内部类的对象
  • 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
  • 当前,在外部类的外部创建内部类对象时,前提也需得内部类对外部类的外部是可见的

如下图, 内部类为private,在外部类的外部无法创建该对象

修改内部类访问权限为public时正确创建 :

public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    public class Inn{
        private String str2 = "内部类";
    }
}
class Test{
//    外部类的外部创建外部类的内部类对象
    Inner1.Inn i2 = new Inner1().new Inn();
}

4.内部类与静态域

  • 成员内部类可以访问外部类的静态域,但是自己不能定义静态变量(成员内部类是依赖于外部类的,如果它自己能定义静态变量,没有外部对象也能访问了,失去其意义)
  • 外部类中的静态方法也不能使用成员内部类(相当于在静态变量中调用成员变量,是不可行的)。
  • 为此,特别注意,main方法就是static方法,故而不能直接在外部类的main方法中创建内部类对象,要借助外部类才能创建
public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    public class Inn{
        private String str2 = "内部类";
    }
    public static void main(String[] args) {
//        main中创建
        Inner1.Inn inn = new Inner1().new Inn();
        System.out.println(inn.str2);
    }
}

静态内部类:

1.定义:

  • 静态内部类也是定义在类中,但是与成员内部类不同的是,它用static修饰,是静态内部类,可类比静态变量进行理解
  • static修饰,所以它无需依赖外部类对象,我们可以把它看作一个普通类
public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn{
        private String str2 = new String("静态内部");
    }
}

2.静态内部类的使用规则:

静态内部类不能直接访问外部类的普通成员变量 (普通成员变量有对象才能访问,所以static不能访问普通的成员变量),当然,可以通过new一个外部类的对象来达到访问外部类成员变量的目的

public class Inner2 {
    private String str1 = new String("外部");
    private static String str3 = new String("外部静态属性");
//    静态内部类
    public static class Inn {
    private String str2 = new String("静态内部");
    public void fun(){
//        静态内部类不能直接访问外部类的普通成员变量
        System.out.println(str1);
//        但可以通过new一个外部类对象访问
        Inner2 i2 = new Inner2();
        System.out.println(i2.str1);
//        static家族互通
        System.out.println(str3);
    }
}
}

但是,静态内部类虽然不能直接访问外部类的成员变量,但是是可以拥有自己的普通成员变量 的

3.静态内部类对象的创建

  • 外部类内部:和普通类的用法相同 ,且不同于成员内部类,在静态内部类这里,外部类的静态方法中是可以创建静态内部类的对象(static家族互访),当然,没有对象都可以,那么,外部类的成员方法中也是可以创建静态内部类对象的
  • 内部类名称 对象名 = new 类名()
public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn{
        private String str2 = new String("静态内部");
    }
//    直接在类的内部创建静态内部类的对象
    Inn i = new Inn();
    public static void main(String[] args) {
//        外部类的静态方法中创建使用静态内部类的对象
        Inn inn = new Inn();
    }
}

外部类的外部:

外部类名称.内部类名称 对象名 = new 外部类名称. 内部类名称()

public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn {
    private String str2 = new String("静态内部");
}
}
class Test{
//    外部类的外部创建静态内部类的对象
    Inner2.Inn i = new Inner2.Inn();
}

成员内部类 VS 静态内部类

  • 成员内部类可以访问外部类的成员域和静态域,但是不能拥有自己的静态域
  • 静态内部类不可以直接访问外部类的成员域,但可以拥有自己的成员域,另外,static家族互访,随意

方法内部类:

1.定义:

直接定义在方法内部,不允许使用任何修饰符修饰(包括访问权限修饰符,static等),对外部完全隐藏,出了这个方法,这个类就没有了,可以类比局部变量进行理解

2.方法内部类的使用规则:

除了无法定义static域外,和成员内部类基本一样,这里不再赘述

3.注意形参的使用

方法内部类中若使用了方法的形参, 该形参为隐式的final声明(JDK8之前,必须手动显式定义为final ,但JDK8以后,直接隐式一定为final)

如下面这个例子:

public class Inner3 {
    public void fun(int num){
//        方法内部类
        class Inn{
            public void test(){
//                将下面这行代码注释掉,num正常可作运算
//                System.out.println(num);
            }
        }
        num ++;
        System.out.println(num);
    }
    public static void main(String[] args) {
        Inner3 i3 = new Inner3();
        i3.fun(3);
    }
}

但如果我们的方法内部类使用了方法的形参,编译报错

匿名内部类(函数式编程)

  • 是方法内部类的特殊版本,直接不写类名称
  • 遵从方法内部类的所有要求
  • 默认会继承一个类或实现一个接口,继承类一般是继承抽象类
  • 通常是在传参的过程中使用该类,可以简化写法

如之前我们写的接口传参:

public class Inner4 {
    public static void fun(MessageImpl m) {
        m.printMessage();
    }
    public static void main(String[] args) {
        MessageImpl l = new MessageImpl();
        fun(l);
    }
}
interface IMessage {
    void printMessage();
}
class MessageImpl implements IMessage {
    public void printMessage() {
        System.out.println("aaa");
    }
}

 使用匿名内部类可以这样写:

public class Inner4 {
    public static void fun(IMessage m ){
        m.printMessage();
    }
    public static void main(String[] args) {
//        匿名内部类
        fun(new IMessage() {
            @Override
            public void printMessage() {
                System.out.println("aaa");
            }
        });
    }
}
interface IMessage {
    void printMessage();
}

最后,重点掌握成员内部类与静态内部类,以及二者使用区别。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java 内部类的定义与范例

    目录 一.前言 二.内部类 语法格式: static修饰内部类 内部类未被static修饰时: 内部类被static修饰后 演示操作: 一.前言 前面我们学习了一个小的项目,现在我们来学习新的知识点,关于内部类的描述,其实 顾名思义就是在类的内部有一个类,简称套娃类(个人观点) 二.内部类 一个类定义在另一个在一个类的内部叫内部类. 内部类可以直接访问外部类的私有和非私有成员,而外部类不能直接访问内部类 (包括所有外部类成员) 外部类成员要访问内部类是,必须创建内部类对象. 外部类通过创建对象也

  • Java的内部类总结

    目录 前言 一,成员内部类 1,成员内部类的特点 2,成员内部类的实现 3,内部类和外部类的关系 二,静态内部类 1,静态内部类的特点 2,比较成员内部类和静态内部类 3,静态内部类的实现 三,方法内部类 1,方法内部类的特点 2,方法内部类的实现 四, 匿名内部类 1,匿名内部类的特点 2,匿名内部类的实现 总结 前言 最近看了内部类后,总结一下,首先内部类嵌套在其他内部的类,根据出现的位置和关键字,可以分为以下四种类:成员内部类,静态内部类,方法内部类,匿名内部类,接下来就介绍下这四种类,记

  • java外部类与内部类简介

     一.内部类 内部类就是将一个类A定义在类B里边,里边的那个类A称为内部类,外边的类B称为外部类 成员内部类定义格式: class 外部类{ class 内部类{ } } class A{ class B{ } } 在描述一个事物是,事物的里边还有另外一个事物就可以用到内部类 访问特点: 1.内部类可以直接访问外部类的成员,包括私有成员. 2.外部类要访问内部类的成员,必须要建立内部类的对象. 创建内部类格式: 外部类.内部类 对象名=new 外部类型().new 内部类型(); 二.匿名内部类

  • 详解Java匿名内部类

    匿名内部类: 先举个例子吧,给大家看一下什么是匿名内部类,Endeavor刚刚接触的时候,觉得哇哦,好奇怪的样子,这也太别扭了吧,不知道大家是什么感觉. 为了进行对比,先举一个正常的类方法调用的例子(大家应该都看的懂吧): 输出结果为: 接下来便开始说正题吧,匿名内部类,通过名字,想必大家就知道什么是匿名内部类了吧, 1.定义:就是没有名字的内部类(内部类之前介绍过了哦). 2.使用内部类有什么好处呢,一句话就概括了:简化书写,至于是怎么简化的,哪里简化了等下再说. 3.先说一下什么时候使用匿名

  • java的内部类和外部类用法讲解

    目录 一.为何使用内部类 二.内部类与外部类的联系 2.1 内部类是一个相对独立的实体,与外部类不是is-a关系 2.2 内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素 2.3 外部类可以通过内部类引用间接访问内部类元素 三.创建内部类 3.1 在外部类外面(或外部类main方法)创建内部了对象 3.2 在外部类里面创建内部类 四.内部类的种类: 4.1 成员内部类 4.2 方法内部类 4.3 匿名内部类 4.4 静态内部类 一.为何使用内部类 内部类提供了更好的封装,只有

  • JavaSE学习之内部类及常用API

    目录 1.内部类 1.1 内部类概述 1.2 成员内部类 1.3 局部内部类 1.4 匿名内部类 1.5 匿名内部类在开发中的使用 2.常用API 2.1Math 2.2 System 2.3 Object 2.4 Array的排序 1.内部类 1.1 内部类概述 内部类:就是在一个类中定义一个类.例如:在一个类A内部定义一个类B,类B就被称为内部类 格式:public class 类名{修饰符 class 类名{}} 范例 public class Outer{ public class In

  • 全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构.下面从以下几个方面来介绍: 第一次见面 public interface Contents { int value(); } public interface

  • java中的内部类内部接口用法说明

    简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. 内部类 先讲内部类,内部类就是在类中定义的类.类中的类可以看做是类的一个属性,一个属性可以是static也可以是非static的.而内部类也可以定义在类的方法中,再加上匿名类,总共有5种内部类. 静态内部类 我们在class内部定义一个static的class,如下所示: @Slf4j publi

  • 一文带你真正理解Java中的内部类

    目录 概述 内部类介绍和分类 常规内部类 局部内部类 匿名内部类 静态内部类 静态内部类和普通内部类的区别 内部类的作用 概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么要有内部类,内部类都有哪几种形式,静态内部类和普通内部类有什么区别呢?本篇文章主要带领大家理解下这块内容. 内部类介绍和分类 顾名思义,内部类是指一个类在另外一个类的内部,是定义在另一个类中的类.根据类的位置和属性不同,可以分为下面几种. 常规内部类 @Data public class Tree

  • 深入解析Java中的内部类

    概述 最近学习python,发现python是支持多继承的,这让我想起Java是通过内部类实现的这套机制.这篇文章不是讲如何通过内部类实现多继承,而是总结一下内部类的类型和使用方法. Java内部类分为: 非静态内部类 静态内部类 局部内部类 匿名内部类 内部类在Android源码中被大量的使用,先介绍一下这四种内部类的共同点: 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号. 内部类不能用普通的方式访问.内部类是外部类的一个成员,因

  • Java中的内部类你了解吗

    目录 成员内部类 1.定义 2.成员内部类的使用规则 3.成员内部类对象的创建: 4.内部类与静态域 静态内部类: 1.定义: 2.静态内部类的使用规则: 3.静态内部类对象的创建 成员内部类 VS 静态内部类 方法内部类: 1.定义: 2.方法内部类的使用规则: 3.注意形参的使用 匿名内部类(函数式编程) 总结 成员内部类 1.定义 成员内部类是直接定义在类中,不加任何修饰符的(特指不加static修饰的)的内部类,可以类比着成员变量来理解,如下面这个代码段中的Inn类就是一个成员内部类 p

  • 整理java读书笔记十五之java中的内部类

    内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 前言 Java从JDK1.1的时候,就开始引入内部类的概念了,那么小编也通过这篇博客来分享一下Java中有关内部类的一些特性.  什么是内部类? 在很多情况下,类被定义成一个独立的程序单元,但是有时候也会把一个类放在另一个类的内部定义,这个定义在

  • Java 中引入内部类的意义?

    前言 这是个好问题,因为它让我想起来自己刚学到内部类时候的"想用的冲动". 导致我代码里到处都是层层的内部类套嵌.不但经常搞得静态域错误一堆(内部类不允许有static成员字段),而且过一段时间自己都搞不清当初写的是什么. 一个很重要的设计准则是:设计是做减法,能不用模式就不用模式. 这个准则对内部类来说同样适用. 所以回答这个问题的基调应该是: 能不用内部类就不用内部类. 实践 我以前觉得内部类用来有针对性地暴露外部类的特定接口,比一下子把整个对象都给人家要好.比如说下面代码中的外部

  • Java中的内部类使用详情

    目录 一,内部类访问成员 二,访问内部类成员 1,直接访问内部类的中的成员 2,访问成员 一,内部类访问成员 1,内部类可以直接访问外部类的成员,包括私有. 2,外部类要访问内部类,必须建立内部类对象. class Outer { int x = 3; class Inner{ void function(){ System.out.println("inner : " + x); } } void method(){ Inner in = new Inner(); in.functi

  • java中的内部类详细总结

    内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部内当中 实例1:内部类的基本结构 复制代码 代码如下: //外部类 class Out {     private int age = 12; //内部类     class In {         p

  • java中关于内部类的使用详解

    内部类访问规则 •内部类可以直接访问外部类中的成员,包括私有.访问格式:外部类名.this•外部类要访问内部类必须创建内部类对象.•内部类在成员位置上,可以被成员修饰符修饰. 复制代码 代码如下: public class InnerClassDemo1 {     public static void main(String[] args){         Outer ou =new Outer();         ou.method();// 4  3         Outer.Inn

随机推荐