我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中为什么需要内部类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中为什么需要内部类

这篇文章给大家分享的是有关Java中为什么需要内部类的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

内部类:定义在类的内部的类

为什么需要内部类?

  • 典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。

  • java中的内部类和接口加在一起,可以实现多继承。

  • 可以使某些编码根简洁。

  • 隐藏你不想让别人知道的操作。

使用内部类最吸引人的原因是:

每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。

特点:

一、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。

二、内部类可以直接或利用引用访问外部类的属性和方法,包括私有属性和方法(但静态内部类不能访问外部类的非静态成员变量和方法)。内部类所访问的外部属性的值由构造时的外部类对象决定。

三、而外部类要访问内部类的成员,则只能通过引用的方式进行,可问内部类所有成员

四、访问机制:

System.out.println(this.x);或System.out.println(x);//内部类访问内部类的成员变量或成员方法可用此方法。   System.out.println(OuterClass.this.x);//内部类访问外部类的同名变量时可用此方法,如果没有同名可用System.out.println(x);

五、内部类可以使用任意的范围限定:public/private/protected class InnerClass,且严格按照这几种访问权限来控制内部类能使用的范围。普通类的范围限定只可以是public或者不加。

六、内部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)。

七、内部类可以定义为接口,并且可以定义另外一个类来实现它

八、内部类可以定义为抽象类,可以定义另外一个内部类继承它

九、内部类使用static修饰,自动升级为***类,外部类不可以用static修饰,用OuterClass.InnerClass inner=new OuterClass.InnerClass();创建实例。内部类还可定义为final.

十、内部类可以再定义内部类(基本不用)

十一、方法内的内部类:

  • 方法内的内部类不能加范围限定(protected public private)

  • 方法内的内部类不能加static修饰符

  • 方法内的内部类只能在方法内构建其实例

  • 方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰

1)静态内部类(静态嵌套类)

从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为***嵌套类。

静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。

语法

package com.tarena.day13;   import com.tarena.day13.Foo.Koo;   public class StaticInner {   public static void main(String[] args) {    Koo koo = new Koo();    System.out.println(koo.add());//4   }   }  class Foo{   int a = 1;   static int b = 3;     static class Koo{    public int add(){     //a ,不能访问a     return b+1;    }   }  }

2)成员内部类

* 1 成员内部类必须利用外部类实例创建

* 2 成员内部类可以共享外部类的实例变量

import com.tarena.day13.inn.Goo.Moo;   public class InnerClassDemo {   public static void main(String[] args) {    //Moo moo = new Moo(); //编译错误,必须创建Goo的实例    Goo goo = new Goo();    Moo moo = goo.new Moo();//利用goo实例创建Moo实例    Moo moo1 = goo.new Moo();    //moo和moo1共享同一个goo实例的实例变量    System.out.println(moo.add());//2    System.out.println(moo1.add());//2    Goo goo1 = new Goo();    goo1.a = 8;    Moo m1 = goo1.new Moo();    Moo m2 = goo1.new Moo();    System.out.println(m1.add());//9    System.out.println(m2.add());//9       }  }  class Goo{   int a = 1;     class Moo{    public int add(){     return a+1;    }   }  }

3)局部内部类(方法内部类)

(1) 方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

(2) 方法内部类对象不能使用该内部类所在方法的非final局部变量。

因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。用法

package com.tarena.day13.inn;   import java.util.Comparator;    public class LocalInnerClassDemo {   public static void main(String[] args) {    int a = 5;    final int b = 5;    //局部内部类,定义在方法内部,作用域类似于局部变量    //仅仅在方法内部可见    //在局部内部类中可以访问方法中的局部final变量    class Foo{     public int add(){      return  b;//正确      //return a;//编译错误     }    }        Foo foo = new Foo();    //临时的自定义比较规则    class ByLength implements Comparator<String>{     public int compare(String o1,String o2){      return o1.length()-o2.length();     }    }   }   }

4)匿名内部类

顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
只用到类的一个实例。

  • 类在定义后马上用到。

  • 类非常小(SUN推荐是在4行代码以下)

  • 给类命名并不会导致你的代码更容易被理解

在使用匿名内部类时,要记住以下几个原则:

  • 匿名内部类不能有构造方法。

  • 匿名内部类不能定义任何静态成员、方法和类。

  • 匿名内部类不能是public,protected,private,static。

  • 只能创建匿名内部类的一个实例。

  • 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

  • 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

A、继承式的匿名内部类和接口式的匿名内部类。

import java.util.Arrays;  import java.util.Comparator;    public class AnnInnerClass {    public static void main(String[] args) {    // TODO Auto-generated method stub    Yoo yoo = new Yoo();//创建Yoo的实例    Yoo y1 = new Yoo(){};    //new Yoo(){}创建匿名类实例    //匿名类new Yoo(){}是继承Yoo类,并且同时创建了对象    //new Yoo(){}是Yoo的子类型,其中{}是类体(class Body)    //类体中可以定义任何类内的语法,如:属性,方法,方法重载,方法覆盖,等    //子类型没有名字,所以叫匿名类!    Yoo y2 = new Yoo(){     public String toString(){//方法重写(覆盖)      return "y2"; //y2是子类的实例     }    };    System.out.println(y2);//"y2",调用了匿名类对象toString()    //匿名内部类可以继承/实现 于 类,抽象类,接口等    //按照继承的语法,子类型必须实现所有的抽象方法        //Xoo x = new Xoo(){};//编译错误,没有实现方法    final int b = 5;    Xoo xoo = new Xoo(){ //是实现接口,并且创建匿名类实例,不是创建接口对象     public int add(int a){//实现接口中的抽象方法      return a+b; //要访问局部变量b,只能访问final变量     }    };    System.out.println(xoo.add(5));//10,调用对象的方法    //Comparator接口也可以使用匿名类的方式    Comparator<String> byLength = new Comparator<String>(){     public int compare(String o1,String o2){      return o1.length()-o2.length();           }    };    String[] names = {"Andy","Tom","Jerry"};    Arrays.sort(names,byLength);    System.out.println(Arrays.toString(names));    //也可以这样写,工作中常用    Arrays.sort(names,new Comparator<String>(){     public int compare(String o1,String o2){      return o1.length()-o2.length();     }    });   }   }

接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

B. 参数式的匿名内部类。

class Bar{       void doStuff(Foo f){       }   }   interface Foo{       void foo();   }   class Test{     static void go(){         Bar b = new Bar();         b.doStuff(new Foo(){             public void foo(){                 System.out.println("foofy");             }         });    }   }

构造内部类对象的方法有:

内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:

(1)

OuterClass out = new OuterClass();  OuterClass.InnerClass in = out.new InnerClass();

(2)

OuterClass.InnerClass in=new OuterClass().new InnerClass();

其中OuterClass是外部类,InnerClass是内部类。

2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:

InnerClass in = new InnerClass();

3、如果内部类为静态类,则可用如下形式来构造函数:

OuterClass.InnerClass in = new OuterClass.InnerClass();

无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。

感谢各位的阅读!关于“Java中为什么需要内部类”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中为什么需要内部类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中为什么需要内部类

这篇文章给大家分享的是有关Java中为什么需要内部类的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。内部类:定义在类的内部的类为什么需要内部类?典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其
2023-06-17

Java中内部类是什么

这篇文章给大家分享的是有关Java中内部类是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。所谓内部类就是在类的内部申明另一个类,因为只有当前类能够访问到内部类,所以内部类相对来说是非常安全的,另外内部类可以继
2023-06-17

java中什么是局部内部类

这篇文章将为大家详细讲解有关java中什么是局部内部类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3.
2023-06-14

在Java中什么是内部类

小编给大家分享一下在Java中什么是内部类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言一、什么是内部类?在Java中,可以将一个类的定义放在另外一个类的定义
2023-06-16

Java内部类是什么

这篇文章主要为大家展示了“Java内部类是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java内部类是什么”这篇文章吧。一、内部类介绍1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部
2023-06-29

java中内部类有什么优点

java中内部类有什么优点?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了W
2023-06-14

java匿名内部类主要原则是什么

Java匿名内部类的主要原则是为了减少代码的冗余,提高代码的可读性和简洁性。通过使用匿名内部类,可以将一些简单的类定义和实现直接嵌入到其他类中,避免了定义独立的类文件和繁琐的类实例化过程。同时,匿名内部类可以直接访问外部类的成员变量和方法,
2023-10-07

java中为什么需要并发编程

这篇文章主要介绍了java中为什么需要并发编程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为什么需要并发编程?  并发编程帮助我们把做什么和什么时候做分开,可以明显的改进应
2023-06-27

Java中为什么需要慎用异常

这篇文章给大家分享的是有关Java中为什么需要慎用异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。慎用异常在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性
2023-06-27

什么是Java的内部类

这篇文章主要介绍“什么是Java的内部类”,在日常操作中,相信很多人在什么是Java的内部类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Java的内部类”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-20

java项目中的实体类为什么需要实现序列化

这篇文章给大家介绍java项目中的实体类为什么需要实现序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当客户端访问某个能开启会话功能的资源,web服务器就会创建一个HTTPSession对象,每个HTTPSessi
2023-05-31

HIVE外部表为什么比内部表要慢

这篇文章主要为大家展示了“HIVE外部表为什么比内部表要慢”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HIVE外部表为什么比内部表要慢”这篇文章吧。 以HBASE为例,如果把HIVE作为一个H
2023-06-03

Java和ABAP里的外部类和内部类是什么

这篇文章主要讲解了“Java和ABAP里的外部类和内部类是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java和ABAP里的外部类和内部类是什么”吧!JavaOuter class n
2023-06-04

为什么 golang 中需要方法?

go 中需要方法的原因是:封装:方法将数据和行为捆绑在一起,提高可读性和可维护性。代码重用:相同类型的不同值可以共享相同的方法实现,消除重复和简化维护。多态性:子类型可以定义与其基类型具有相同名称但实现不同的方法,实现多态使用。为什么 Go
为什么 golang 中需要方法?
2024-04-25

Java开发为什么需要使用UML

这篇文章主要介绍Java开发为什么需要使用UML,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!知道UML造成了怎样的局面大混乱吗?知道什么样的功能是UML拥有但Java不具备的吗?知道我们为什么需要除JAVA外的另一
2023-06-03

python类中为什么要self?

在python中创建类时必须有一个self参数,eg: >>> class miss: ...              def mi(self):...             print "i like python" ...  >>
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录