第2章 内部类
java内部类知识点总结
![java内部类知识点总结](https://img.taocdn.com/s3/m/4cb46a8264ce0508763231126edb6f1afe007153.png)
java内部类知识点总结概述Java内部类是Java的一种特殊类,它有自己的特殊特性,它可以帮助程序员更好地维护和管理程序的细节,使程序更加可靠。
本文将为大家介绍一些关于java内部类的基本知识,供程序员参考学习。
一、内部类的定义内部类是一种特殊的类,它可以在其他类的内部定义,内部类可以访问它所在的类的所有成员(包括私有变量),而外部类不能够访问内部类的成员。
二、内部类的分类1. 成员内部类:成员内部类是定义在另一个类中的类,它需要使用外部类对象的引用来创建内部类对象。
2. 静态内部类:静态内部类是指在另一个类中定义的静态类,它不能访问外部类的非静态成员,但是可以访问外部类的静态成员,而且静态内部类可以使用外部类的静态变量。
3. 局部内部类:局部内部类是指定义在方法内部的类,它不能使用任何外部类的成员变量,只能使用final类型的局部变量。
4. 匿名内部类:匿名内部类是指没有名字的内部类,它是用匿名类实例化的,不能有构造函数,只能使用一次。
5. 抽象内部类:抽象内部类是一种特殊的内部类,它可以提供抽象方法的包装,让外部类能够使用这些抽象方法,而不需要定义抽象方法,它是抽象类和普通类的中间级别。
三、内部类的使用内部类可以访问外部类的所有成员,这样使得我们能够轻松地定义和管理细节,从而更容易地维护程序。
内部类也可以帮助我们将程序的复杂性融入结构化的代码中,这样可以提高程序的可读性。
此外,内部类可以帮助我们实现封装,可以将类的实现细节隐藏起来,从而保护类的实现细节不被外部访问。
四、小结由以上内容可知,java内部类是java的一种特殊类,它可以帮助程序员更好的维护和管理程序的细节,使程序变得更加可靠,程序员可以根据自己的实际情况选择使用合适的内部类来实现特定的功能。
Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
![Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)](https://img.taocdn.com/s3/m/70b5cd26bc64783e0912a21614791711cc797977.png)
Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类) 我们先看这样⼀段话:⼈是由⼤脑、肢体、器官等⾝体结果组成。
⽽组成我们⼈体的⼼脏它也有⾃⼰的属性和⾏为(⾎液、跳动),显然,此处不能单⽅⾯⽤属性或者⽅法表⽰⼀个⼼脏了,⽽需要⼀个类,但是这个类要依赖于⼈这个类存在(因为⼼脏不能脱离⼈体⽽存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所⼼脏以需要写在⼈类的内部。
内部类就相当于其中的某个器官之⼀。
⾸先看看什么是内部类:在类的内部定义另⼀个类。
没错,定义就这么简单。
如果在类Outer的内部再定义⼀个类Inner,此时Inner就称为内部类,⽽Outer则称为外部类。
内部类的定义格式如下:public class外部类的名称{//外部类的成员public class内部类的名称{//内部类的成员}}使⽤内部类有什么好处;1)实现多重继承;2)内部类可以很好的实现隐藏:⼀般的⾮内部类,是不允许有 private 与protected权限的,但内部类可以3)减少了类⽂件编译后的产⽣的字节码⽂件的⼤⼩使⽤内部类的缺点:使程序结构不清楚。
内部类在编译完成后也会产⽣.class⽂件,但⽂件名称是:外部类名称$内部类名称.class内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类。
下⾯分别详细学习⼀下这四种内部类的具体使⽤。
⼀、成员内部类1、成员内部类也叫实例内部类。
应⽤场合:每⼀个外部类对象都需要⼀个内部类的实例,内部类离不开外部类存在(相当于⼼脏对⼈体)2、成员内部类的特征:作为外部类的⼀个成员存在,与外部类的属性、⽅法并列成员内部类持有外部类的引⽤成员内部类中不能定义static变量和⽅法3、使⽤格式:Outer outer = new Outer();Outer.Inner inner = outer.new Inner();代码演⽰⼀:/** 成员内部类*/public class Body {String arm;String leg;String blood;public Body(String arm, String leg, String blood) {super();this.arm = arm;this.leg = leg;this.blood = blood;}//内部类Heartclass Heart{String name;void work() {System.out.println("⼼脏正在给"+arm+leg+"输"+blood);}};}public class Test {public static void main(String[] args) {Body body=new Body("两个胳膊","两条腿","⾎");Body.Heart heart=body.new Heart();heart.work();}}运⾏截图:代码演⽰⼆:/** 成员内部类*/public class Outer {private String name="Hello World";public class Inner{public void print(){System.out.println(name);}};public void print(){//定义外部类⽅法new Inner().print();//通过内部类的实例化对象调⽤⽅法}public static void main(String[] args) {Outer outer=new Outer();outer.print();//调⽤外部类的⽅法}}运⾏截图:解释⼀下,上述代码中,new Inner().print();代码相当于Inner inner=new Inner();Inner.print();⼆、静态内部类1、内部类如果使⽤static声明,则此内部类就称为静态内部类。
内部类分类案例
![内部类分类案例](https://img.taocdn.com/s3/m/c8093a939f3143323968011ca300a6c30c22f18c.png)
内部类分类案例咱来唠唠内部类的分类哈。
一、成员内部类。
就好比一个大家庭里,有个小家庭住在大房子(外部类)里面。
比如说,咱们有个“汽车”类作为外部类,然后有个“汽车引擎”类作为成员内部类。
这个“汽车引擎”类就依赖着“汽车”这个外部类呢。
它可以直接访问外部类的成员变量和方法,就像汽车引擎知道汽车的速度啊、型号这些信息一样自然。
在代码里呢,就像是这样:java.class Car {private String model;private int speed;// 成员内部类。
class CarEngine {public void start() {System.out.println("启动 " + model + " 的引擎,当前速度:" + speed);}}}二、局部内部类。
这就有点像临时组建的小团队。
比如说在一个“旅行”类里,有个方法是“规划行程”。
在这个方法里呢,临时创建了一个“行程细节”的局部内部类。
这个局部内部类只在这个“规划行程”的方法里有用,出了这个方法就没人认识它啦。
就像这个小团队只在规划这次旅行行程的时候存在,旅行结束就散伙了。
java.class Travel {public void planTrip() {// 局部内部类。
class TripDetails {private String destination;public TripDetails(String dest) {destination = dest;}public void showDetails() {System.out.println("旅行目的地是:" + destination);}}TripDetails details = new TripDetails("巴黎");details.showDetails();}}三、静态内部类。
Java 内部类
![Java 内部类](https://img.taocdn.com/s3/m/37c2a2a9b9f67c1cfad6195f312b3169a451ea3a.png)
Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;成员内部类作为类的角色:可以在内部定义属性、方法、构造器等结构可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关可以声明为abstract类,因此可以被其它的内部类继承可以声明为final的,表示不能被继承编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)注意点:2. 外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式3. 成员内部类可以直接使用外部类的所有成员,包括私有的数据4. 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的1.2.2 创建成员内部类对象实例化静态内部类外部类名.静态内部类名变量 = 外部类名.静态内部类名();变量.非静态方法();实例化非静态内部类外部类名变量1 = new 外部类();外部类名.非静态内部类名变量2 = 变量1.new 非静态内部类名();变量2.非静态方法();1.2.3 举例public class TestMemberInnerClass {public static void main(String[] args) {//创建静态内部类实例,并调用方法Outer.StaticInner inner=new Outer.StaticInner();inner.inFun();//调用静态内部类静态方法Outer.StaticInner.inMethod();System.out.println("*****************************");//创建非静态内部类实例(方式1),并调用方法Outer outer=new Outer();Outer.NoStaticInner inner1=outer.new NoStaticInner();inner1.inFun();//创建非静态内部类实例(方式2)Outer.NoStaticInner inner2=outer.getNoStaticInner();inner1.inFun();}}class Outer{private static String a="外部类的静态a";private static String b ="外部类的静态b";private String c="外部类对象的非静态c";private String d="外部类对象的非静态d";static class StaticInner{private static String a="静态内部类的静态a";private String c="静态内部类对象的非静态c";public static void inMethod(){System.out.println("Inner.a = "+a);System.out.println("Outer.a = "+Outer.a);System.out.println("b = "+b);}public void inFun(){System.out.println("Inner.inFun");System.out.println("Outer.a = "+Outer.a);System.out.println("Inner.a = "+a);System.out.println("b = "+b);System.out.println("c = "+c);//System.out.println("d = " + d);//不能访问外部类的非静态成员 }}class NoStaticInner{private String a="非静态内部类对象的非静态a";private String c="非静态内部类对象的非静态c";public void inFun(){System.out.println("NoStaticInner.inFun");System.out.println("Outer.a = "+Outer.a);System.out.println("a = "+a);System.out.println("b = "+b);System.out.println("Outer.c = "+Outer.this.c);System.out.println("c = "+c);System.out.println("d = "+d);}}public NoStaticInner getNoStaticInner(){return new NoStaticInner();}}1.3 局部内部类1.3.1 非匿名局部内部类语法格式:[修饰符] class外部类{[修饰符] 返回值类型 方法名(形参列表){[final/abstract] class内部类{}}}编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名、$符号、编号。
内部类的定义方法
![内部类的定义方法](https://img.taocdn.com/s3/m/ada64a9e7e192279168884868762caaedc33ba54.png)
内部类的定义方法内部类是指在一个类的内部定义另一个类的情况,它是一种嵌套类的表现形式,具有特定的访问权限和作用域。
在Java等多种编程语言中,内部类提供了一种便捷的方式来组织和管理相关的类,同时也能够实现更加灵活的程序设计和模块化开发。
内部类的定义方法通常包括以下几种形式:1. 成员内部类:成员内部类是定义在类内部的非静态类,它能够访问外部类的成员变量和方法,并且可以使用外部类的引用。
成员内部类的定义方式如下:```javapublic class OuterClass {private int outerVar;public class InnerClass {public void innerMethod() {System.out.println("Accessing outer class variable: " + outerVar);}}}```在上述例子中,InnerClass 就是一个成员内部类,可以直接访问 OuterClass 的成员变量 outerVar。
2. 静态内部类:静态内部类是定义在类内部且带有 static 修饰符的类,它与外部类不具有依赖关系,可以直接通过类名进行访问。
静态内部类的定义方式如下:```javapublic class OuterClass {private static int outerVar;public static class InnerClass {public void innerMethod() {System.out.println("Accessing outer class variable: " + outerVar);}}}```在这个例子中,InnerClass 是一个静态内部类,可以直接通过OuterClass.InnerClass 的方式进行访问。
3. 局部内部类:局部内部类是定义在方法内部的类,它只能在定义它的方法中使用,通常用于辅助实现某个特定的功能。
黑马程序员小鲁哥哥白话笔记-内部类
![黑马程序员小鲁哥哥白话笔记-内部类](https://img.taocdn.com/s3/m/dee73435bd64783e09122b64.png)
小鲁哥哥白话笔记-内部类大家学完Static关键字后,马上又进入了另一项挑战,就是内部类。
What??类里面还能定义类,这不是多此一举吗?很多同学第一次听到这个名词后都有这个反应,且听小鲁哥哥慢慢道来,听完后会让你有一种“原来这就是内部类啊”,没有啥啊。
何为内部类:将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。
这是官方说法,其实就是“大房子里边套了个小单间,房间虽少但是五脏俱全”。
举个栗子:publicclass大房子{//大房子的代码class小房子{//小房子的代码}}内部类有几个分支:成员内部类,局部内部类,匿名内部类。
通过和学生的了解,大家对成员内部类和局部内部类都没有问题,就是遇到匿名内部类就难住了,不知道怎么理解,也没有头绪。
成员内部类和局部内部类就简单举个例子,重点讲一讲匿名内部类。
成员内部类:publicclass InnerDemo {publicstaticvoid main(String[] args) {//Outer o = new Outer();//o.method();Outer.Inner i = new Outer().new Inner();i.function();}}class Outer {privateint num = 10;publicvoid method() {Inner i = new Inner();i.function();}class Inner {publicvoid function() {System.out.println(num);}}}局部内部类:package com.itheima_02;/** 局部内部类* 在方法内,出了方法之后就无法使用***/publicclass InnerDemo3 {publicstaticvoid main(String[] args) {Outer o = new Outer();o.method();}}class Outer {publicvoid method() {int num = 10;class Inner {publicvoid function() {System.out.println("function");}}Inner i = new Inner();i.function();}publicvoid test() {//Inner i = new Inner();//System.out.println(num);}}好了,重点讲一下匿名内部类,这个同学学完了,脑子里第一反应就是,这怎么用??先给大家看一看匿名内部类的例子:new 父类或接口(){//进行方法重写};//已经存在的父类:public abstract class Person{public abstract void eat();}//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量Person p = new Person(){public void eat() {System.out.println(“我吃了”);}};//调用eat方法p.eat();其实很简单,匿名内部类一般应用于接口,为了不再写一个类去实现这个接口,直接在类里去通过new 接口+实体模块的方式去实现这个接口。
内部类 用法
![内部类 用法](https://img.taocdn.com/s3/m/78cbc5b8760bf78a6529647d27284b73f3423662.png)
内部类用法
内部类是定义在另一个类内部的类。
内部类可以访问外部类的所有成员,包括私有成员,并且可以访问外部类的作用域中的变量。
内部类主要有以下几种用法:
1. 实现多重继承:Java是不允许多重继承的,但是通过内部类可以实现多个接口的继承。
2. 封装:内部类可以隐藏在外部类中,只有外部类能够访问到内部类,可以对外部类提供更好的封装性。
3. 事件处理:内部类可以作为事件处理器,可以方便地访问外部类的成员变量和方法。
4. 匿名内部类:可以在使用的地方使用匿名内部类,可以减少创建类的代码量。
5. 可读性和维护性:内部类使得代码更加清晰易读,避免了过多的嵌套。
具体使用内部类时,可以通过以下步骤进行操作:
1. 在外部类中定义内部类,并指定访问修饰符。
2. 在外部类的方法中实例化内部类。
3. 通过内部类的实例调用内部类的方法,或者通过内部类的引用访问内部类的成员变量。
需要注意的是,内部类的实例化需要依赖外部类的实例,因此在实例化内部类之前需要先实例化外部类。
java内部类
![java内部类](https://img.taocdn.com/s3/m/846c8cea998fcc22bcd10d4b.png)
Java内部类总结内部类是指在一个外部类的内部再定义一个类。
内部类作为外部类的一个成员,并且依附于外部类而存在的。
内部类可为静态,可用protected和private修饰(而外部类只能使用public 和缺省的包访问权限)。
内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。
为什么需要内部类?典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。
所以你可以认为内部类提供了某种进入其外围类的窗口。
使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。
从这个角度看,内部类使得多重继承的解决方案变得完整。
接口解决了部分问题,而内部类有效地实现了“多重继承”。
所谓内部类(Inner Class),顾名思义,就是指定义在另外一个类中的类,我们为什么要这么做呢?为什么不直接定义它而要在别的类中定义一个内部类呢?这样做主要有如下三个原因:1.内部类的方法可以访问它所在的外部类中的所有域,包括私有型别的;2.对于同一个包中的其它类它是隐藏的;3.匿名的内部类可以让我们很方便的定义事件响应(call back),这在GUI编程中很常见;一.内部类(inner class)如何访问外部类(outer class)中的域因为安全机制的原因,内部类通常声明为private类别,因此,只有在内部类所在的外部类中才能够创建内部类的对象,对其它类而言它是隐藏的。
另外,只有内部类才会用到private修饰符,一般的类如果用private修饰符则会报错。
下面看如下的代码:package .hust.cm.test;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.Toolkit;import javax.swing.JOptionPane;import javax.swing.Timer;public class InnerClassTest {public InnerClassTest() {super();// TODO Auto-generated constructor stub}public static void main(String[] args) {Court court=new Court(10000,true);court.start();JOptionPane.showMessageDialog(null,"停止么,CMTobby?");System.exit(0);}}class Court{public Court(int interval,boolean beep){this.interval=interval;this.beep=beep;}public void start(){TimerPrinter action=new TimerPrinter();Timer t=new Timer(interval,action);t.start();}private int interval;private boolean beep;private class TimerPrinter implements ActionListener{ public void actionPerformed(ActionEvent e){System.out.println("Cindyelf,would you be my mm?");if(beep) Toolkit.getDefaultToolkit().beep();}}}注意上面红色加粗部分的代码,如你所见beep这个变量在内部类TimerPrinter中我们并没有声明,那么它引用自何处呢?显然是来自于外部类。
内部类详解 1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类
![内部类详解 1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类](https://img.taocdn.com/s3/m/64243bdc80eb6294dd886c40.png)
内部类详解1、定义一个类的定义放在另一个类的内部,这个类就叫做内部类。
Java代码1.public class First {2.public class Contents{3.public void f(){4.System.out.println("In Class First's inner Class Contents method f()");5.}6.}7.}像这样的,Contents就叫做内部类内部类了解外围类,并能与之通信(后面详细讲)2、链接到外围类创建了内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件。
Java代码1.public class First {2.public class Contents{3.public void getStr(){4.System.out.println("First.str="+str);5.}6.}7.private String str;8.}9.在内部类Contents中,可以使用外围类First的字段str。
那么,它是如何实现的呢?是这样的,用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。
通常,这些都是编译器来处理,我们看不到,也不用关心这个。
正是因为如此,我们创建内部类对象时,必须与外围类对象相关联。
注:嵌套类(后面会讲到)除外。
3、使用关键字.this与.new内部类中得到当前外围类对象的引用,可以使用.this关键字,注意与new的区别Java代码1.private int num ;2.public Test2(){3.4.}5.6.public Test2(int num){7.this.num = num;8.}9.10.private class Inner{11. public Test2 getTest2(){12. return Test2.this;13. }14.15. public Test2 newTest2(){16. return new Test2();17. }18.}19.20.public static void main(String [] args){21. Test2 test = new Test2(5);22. Test2.Inner inner = test.new Inner();23. Test2 test2 = inner.getTest2();24. Test2 test3 = inner.newTest2();25. System.out.println(test2.num);26. System.out.println(test3.num);27.}28.输出结果为5 0使用.this后,得到时创建该内部类时使用的外围类对象的引用,new则是创建了一个新的引用。
java内部类
![java内部类](https://img.taocdn.com/s3/m/f7ac34dd08a1284ac8504393.png)
内部类概述内部类是编译期状态!编译器知道,虚拟机不知道,在虚拟机处,会成为正常的类,反编译代码会失败,甚至不好还原JVM和昨天的我一样,不知道什么叫内部类!1什么是内部类把一个类定义在另一个类之内,就是内部类。
例如把B类定义在A类之内,那么我们称A类为外部类,而B类为内部类。
2成员内部类内部类是外部类的成员!即被外部类类体直接包含。
class A {class B {}}3一般内部类都是私有的可以对成员内部类使用任何访问修饰符(4种都可以修饰)非内部类能使用public或者默认。
public class Test{public int a = 10;public static void main(String args[]){Test t = new Test();t.test();}public void test(){A a = new AImpl();Demo.func(a);}//不会被其他类使用,只有Test类会只用//这个类只在外部类的范围内可见//成员内部类通常会被修饰为private//好处:隐藏代码//成员内部类,可以使用外部类的成员(不需要对象的引用,直接使用)private class AImpl implements A{public void fun1(){syso(a);//外部类,不能使用访问内部类的内容}}}class Demo{public static void fun(A a){a.fun1();}}interface A{void func1();}4内部类访问外部类成员内部类中可以直接方法外部类的成员(属性和方法),包含私有成员!interface A{void func1();}class Demo{public static void fun(A a){a.fun1();}}public class Test{public int a = 10;//privatepublic static void main(String args[]){Test t = new Test();t.test();}public void test(){A a = new AImpl();Demo.func(a);}private class AImpl implements A{public void fun1(){System.out.println(a);// 外部类,不能使用访问内部类的内容}}}5外部类中使用创建内部类对象外部类不能直接访问内部类成员外部类的特权可以创建内部类对象。
JAVA内部类的作用方法使用
![JAVA内部类的作用方法使用](https://img.taocdn.com/s3/m/03cac42649d7c1c708a1284ac850ad02de8007bf.png)
JAVA内部类的作用方法使用一、内部类的作用1.封装:内部类可以被用来封装和隐藏代码。
通过将一个类定义在另一个类的内部,可以将类的实现细节隐藏起来,只暴露出对外公开的接口。
这样一来,外部类的使用者只需要关心外部类提供的接口,而不需要关注内部类的实现。
2.实现多继承:内部类可以实现多继承的效果。
由于JAVA是单继承的,但是通过内部类,一个类可以实现多个接口或继承多个类。
这样可以灵活地使用多种功能,增强代码的复用性。
3.回调函数:内部类可以用作回调函数的实现。
在一些情况下,我们需要将一个类的方法传递给另一个类,并在一些事件发生时被调用。
内部类可以轻松地实现这种回调机制,使得代码更加简洁易读。
4.访问外部类的成员:内部类可以访问外部类的私有成员,包括私有变量和私有方法。
这样可以实现对外部类的更加灵活的访问,增强了代码的封装性。
5.提供更好的逻辑组织:内部类可以将相关的类组织在一起,使得代码更加清晰和易于管理。
当一个类只在一个类中使用,又不希望被其他类访问到,就可以使用内部类来定义。
6.实例化内存的开销:由于内部类是和外部类绑定在一起的,所以内部类的创建必须依赖外部类的实例对象。
当外部类创建实例时,内部类实例也会被同时创建。
这样就可以实现一些特殊的功能,例如在外部类的构造器中创建内部类实例,从而实现一些初始化的操作。
二、内部类的方法1.成员内部类:成员内部类是定义在外部类中的类,它可以直接访问外部类的成员,并且可以实现多继承的效果。
成员内部类的定义格式如下:```public class OuterClass//外部类的成员变量和方法public class InnerClass//内部类的成员变量和方法}```要创建成员内部类的实例,需要先创建外部类的实例,然后再通过外部类的实例来创建内部类的实例:```OuterClass outer = new OuterClass(;OuterClass.InnerClass inner = outer.new InnerClass(;```2.静态内部类:静态内部类是定义在外部类中的静态类,它不能直接访问外部类的实例成员,只能访问外部类的静态成员。
java内部类知识点总结
![java内部类知识点总结](https://img.taocdn.com/s3/m/57c29bb4e43a580216fc700abb68a98270feac44.png)
java内部类知识点总结x1、内部类概念内部类(inner class)就是定义在另一个类的内部的类,它有权访问外部类的所有成员属性和方法(包括private类型的成员属性和方法),而且在内部类中可以拥有自己的私有成员属性和方法。
2、内部类的分类(1)普通内部类:定义在类的内部的类,是普通的成员函数,并且可以访问外部类的所有成员函数和变量,即使是private修饰符修饰的函数和变量。
(2)静态内部类:定义在类的内部的静态类,只能访问外部类的静态成员和变量,不能访问外部类的非静态成员变量和方法。
(3)局部内部类:定义在一个方法内部的类,只能在该方法的内部使用,外部不能访问。
(4)匿名内部类:定义没有类名的类,只能使用一次,不能定义构造函数。
3、内部类的优点(1)可以减少向外界暴露的接口,隐藏实现细节,使代码更加安全可靠。
(2)可以提升代码的可读性,使代码更加的简洁,提高开发效率。
(3)可以在外部类的内部,方便的操作外部类的任何实例变量,不需要在外部类的方法中获取实例变量的值。
4、内部类的使用(1)普通内部类它可以调用外部类的public,protected,default方法。
实例:public class OuterClass {public int field = 0;public void printField(){System.out.println('field = '+field);}class InnerClass {public void modifyField() {field += 10;printField();}}}(2)静态内部类它可以调用外部类的public,protected,default静态方法。
实例:public class OuterClass {public static int field = 0;public static void printField(){System.out.println('field = '+field);}static class InnerClass {public void modifyField() {field += 10;printField();}}}(3)局部内部类它可以调用它所在方法的局部变量,但要满足三个条件:(1)局部变量是final的。
Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类
![Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类](https://img.taocdn.com/s3/m/6de3c2c7185f312b3169a45177232f60dccce741.png)
Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类说起内部类这个词,想必很多⼈都不陌⽣,但是⼜会觉得不熟悉。
原因是平时编写代码时可能⽤到的场景不多,⽤得最多的是在有事件监听的情况下,并且即使⽤到也很少去总结内部类的⽤法。
今天我们就来⼀探究竟。
下⾯是本⽂的⽬录⼤纲: ⼀.内部类基础 ⼆.深⼊理解内部类 三.内部类的使⽤场景和好处 四.常见的与内部类相关的笔试⾯试题 若有不正之处,请多谅解并欢迎批评指正。
请尊重作者劳动成果,转载请标明原⽂链接:⼀.内部类基础 在Java中,可以将⼀个类定义在另⼀个类⾥⾯或者⼀个⽅法⾥⾯,这样的类称为内部类。
⼴泛意义上的内部类⼀般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
下⾯就先来了解⼀下这四种内部类的⽤法。
1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另⼀个类的内部,形如下⾯的形式:1 2 3 4 5 6 7 8 9 10 11 12 13class Circle {double radius = 0;public Circle(double radius) {this.radius = radius;}class Draw { //内部类public void drawSahpe() {System.out.println("drawshape"); }}} 这样看起来,类Draw像是类Circle的⼀个成员,Circle称为外部类。
成员内部类可以⽆条件访问外部类的所有成员属性和成员⽅法(包括private成员和静态成员)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14class Circle {private double radius = 0;public static int count =1;public Circle(double radius) {this.radius = radius;}class Draw { //内部类public void drawSahpe() {System.out.println(radius); //外部类的private成员 System.out.println(count); //外部类的静态成员 }}} 不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者⽅法时,会发⽣隐藏现象,即默认情况下访问的是成员内部类的成员。
Java语言的内部类
![Java语言的内部类](https://img.taocdn.com/s3/m/a19c3cc3846a561252d380eb6294dd88d0d23db7.png)
Java语言的内部类Java语言的内部类导语:内部类可以保证java程序的完整性和隐秘性。
以下是店铺为大家整理的Java语言的内部类,仅供参考,欢迎大家阅读。
(1)把一个类定义在某个类中的,这个类就被称为内部类,内置类,嵌套类。
(2)访问特点:A:内部类可以直接访问外部类中的成员,因为内部类持有外部类的引用,格式为:外部类名.thisB:外部类要想访问内部类的成员,必须创建对象访问。
(3)内部类的访问格式:A:当内部类定义在外部类的成员位置,而且非私有,则可以在其他外部类中直接建立内部类对象格式:外部类名.内部类名变量名 = new 外部类对象.内部类对象如:Outer.Inner in = new Outer().new Inner()B:当内部类在外部类成员位置,且被static修饰时**外部其他类可直接访问静态内部类的非静态成员格式:new 外部类名.内部类名().内部类成员如:new Outer.Inner().function();**外部其他类可直接访问静态内部类的静态成员格式:new 外部类名.内部类名.内部类成员如:new Outer.Inner.function();(4)什么使用时候内部类呢?假如有A类和B类,A类想直接访问B类的成员,B类访问A类成员的时候,需要创建A类对象进行访问,这个时候,就可以把A类定义为B 类的内部类。
(5)内部类的位置A:成员位置**可以被private修饰(Body,Heart)**可以被static修饰。
(它访问的外部类的成员必须是静态的)B:局部位置**可以直接访问外部类中的成员,因为还持有外部类的.持用也可以直接访问局部成员,但是局部成员要用final修饰。
注意:局部内部类不能用private和static修饰(6)通过class文件我们就可以区分是否带有内部类,以及内部类的位置Outer$Inner:成员内部类Outer$1Inner:局部内部类Java语言优点Java语言最大的优点是它的跨平台性。
java - 内部类(Inner Class)详解
![java - 内部类(Inner Class)详解](https://img.taocdn.com/s3/m/f1cfda03a6c30c2259019ed2.png)
Java内部类(Inner Class)详解简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。
对于一个内部类,包含其定义代码的类称为它的外部(outer)类。
1 Static member class(静态成员类)类声明中包含“static”关键字的内部类。
如以下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。
静态成员类的使用方式与一般顶层类的使用方式基本相同。
public class Outer{//just like static method, static member class has public/private/default access privilege levels//access privilege level: publicpublic static class Inner1 {public Inner1() {//Static member inner class can access static method of outer classstaticMethod();//Compile error: static member inner class can not access instance method of outer class//instanceMethod();}}//access privilege level: defaultstatic class Inner2 {}//access privilege level: privateprivate static class Inner3 {//define a nested inner class in another inner classpublic static class Inner4 {}}private static void staticMethod() {//cannot define an inner class in a method/*public static class Inner4() {}*/}private void instanceMethod() {//private static member class can be accessed only in its outer class definition scopeInner3 inner3 = new Inner3();//how to use nested inner classInner3.Inner4 inner4 = new Inner3.Inner4();}}class Test {Outer.Inner1 inner1 = new Outer.Inner1();//Test and Outer are in the same package, so Inner2 can be accessed hereOuter.Inner2 inner2 = new Outer.Inner2();//Compile error: Inner3 cannot be accessed here//Outer.Inner3 inner3 = new Outer.Inner3();}1.1 静态成员类特性静态成员类可访问外部类的任一静态字段或静态方法像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符1.2 静态成员类约束静态成员类不能与外部类重名像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
内部类构造方法
![内部类构造方法](https://img.taocdn.com/s3/m/24fa46471611cc7931b765ce050876323012747b.png)
内部类构造方法一、内部类的概念内部类是指定义在一个类的内部的另一个类,它是Java语言中一种特殊的类,与外部类具有相同的访问权限,可以访问外部类的所有成员,包括私有成员。
内部类可以分为成员内部类、局部内部类、匿名内部类和静态内部类等几种类型。
二、成员内部类成员内部类是定义在外部类的成员位置的类,与外部类之间形成了一种包含关系。
成员内部类可以访问外部类的成员,包括私有成员。
成员内部类的构造方法在创建实例对象时被调用,它的语法格式为:[访问修饰符] class外部类 {//外部类的成员[访问修饰符] class内部类 {//内部类的成员}}成员内部类的构造方法可以在内部类中访问外部类的成员,也可以传递参数给外部类的构造方法。
三、局部内部类局部内部类是定义在方法内部的类,它只在当前方法或语句块中有效。
局部内部类主要用于解决某个方法中某个功能的问题,使得代码更加清晰。
局部内部类的构造方法在创建实例对象时被调用,它的语法格式为:[访问修饰符] class外部类 {//外部类的成员[访问修饰符] void 外部方法() {//外部方法的代码[访问修饰符] class内部类 {//内部类的成员}}}局部内部类的构造方法也可以访问外部类的成员,但只能访问外部类中被声明为final 或 effectively final 的变量。
四、匿名内部类匿名内部类是没有名字的内部类,它是通过创建一个继承父类或实现接口的子类对象的方式来定义的。
匿名内部类的构造方法在对象创建时被调用。
匿名内部类的构造方法可以传递参数给父类的构造方法或接口的默认方法。
匿名内部类的语法格式为:[访问修饰符] new父类或接口() {//匿名内部类的成员}匿名内部类没有类名,因此也无法定义构造方法,但可以通过实例初始化块来实现对成员变量的初始化。
五、静态内部类静态内部类是定义在外部类的静态成员位置的类,它与外部类之间没有包含关系。
静态内部类可以直接访问外部类的静态成员,但不能访问外部类的非静态成员。
内部类
![内部类](https://img.taocdn.com/s3/m/20a1942258fb770bf78a55f0.png)
成员内部类
成员内部类,声明为类成员的非静态类。
class OuterClass { class InnerClass {...} }
内部类的声明不带有static关键字。它可以访问外部类中的 任何成员。反过来,外部类也可以访问内部类的任何成员。 在能够调用内部类的方法,以及为其数据字段赋值之前,父 类必须首先创建内部类的实例。 语法示例: MemberInnerClassTest.java 应用示例:TalkingClockTest.java
内部类
北京理工大学计算机学院 金旭亮
什么叫内部类(inner class)?
其定义直接包容于另一个类(或一方法)内部的 类。 内部类可看成是外部类的成员,其地位等同于类 中的其他成员。 内部类编译以后,每个内部类都会产生一 个.class文件,其文件名通常具有以下格式:源自外部类名$内部类名.class
匿名内部类对象可以访问外部类的成员。 语法示例:AnonymousInnerClassTest.java
6
匿名内部类的使用场景
多用于创建一个实现了某接口的对象或派生自某 抽象基类的对象 用匿名内部类重写前面的定时调用示例: TalkingClockTest2.java 实现键盘和鼠标事件驱动示例:Inventory.java
2
静态内部类
一个声明为static的内部类。
class TopClass { static class NestedClass{...} }
静态内部类不能访问其外部类的对象的实例数据, 但可以访问其静态成员(包容字段与方法)。 语法示例: StaticInnerClassTest.java 应用示例:MinMax.java
7
4
本地内部类
内部类构造方法
![内部类构造方法](https://img.taocdn.com/s3/m/402bea51a55177232f60ddccda38376baf1fe068.png)
内部类构造方法1. 什么是内部类?在Java中,内部类是指定义在其他类内部的类。
与外部类相比,内部类具有更高的封装性和灵活性。
内部类可以访问外部类的所有成员,包括私有成员,而外部类不能直接访问内部类的成员。
2. 内部类的分类Java中的内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态嵌套类。
2.1 成员内部类成员内部类是定义在一个类的内部,并且与外部类的实例相关联的。
成员内部类可以访问外部类的所有成员,包括私有成员。
下面是一个示例代码:public class OuterClass {private int outerField;public class InnerClass {public void innerMethod() {outerField = 10;}}}2.2 局部内部类局部内部类是定义在一个方法或代码块中的内部类。
局部内部类只能在所在方法或代码块中使用,并且不能被其他方法或代码块访问到。
下面是一个示例代码:public class OuterClass {public void outerMethod() {class LocalInnerClass {public void innerMethod() {System.out.println("Hello from local inner class!");}}LocalInnerClass innerClass = new LocalInnerClass();innerClass.innerMethod();}}2.3 匿名内部类匿名内部类是没有名字的内部类,它通常用于创建只需要使用一次的类。
匿名内部类可以继承一个类或实现一个接口,并且可以在创建对象的时候直接定义类的内容。
下面是一个示例代码:public class OuterClass {public void outerMethod() {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello from anonymous inner class!");}};Thread thread = new Thread(runnable);thread.start();}}2.4 静态嵌套类静态嵌套类是定义在一个类的内部,并且被声明为静态的内部类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章内部类Java中可以把一个类的定义放在另一个类的内部,外面的类称为外围类,里面的类称为内部类。
内部类可以与其所在的外围类进行通信。
内部类可以分成员类、局部内部类、匿名内部类和静态内部类(嵌套类),下面就这几种内部类进行介绍。
2.1 成员类没有static修饰的内部类称为成员类,成员类的使用与普通类类似。
示例代码如下:public class OuterClassOne {class InnerOne{private int i = 1;InnerOne(){System.out.println("InnerOne()");}public int getI(){return i;}}public void testInnerClass(){InnerOne one = new InnerOne();int a = one.getI();System.out.println(a);}public static void main(String[] args) {OuterClassOne outer = new OuterClassOne();outer.testInnerClass();}}在外围类的testInnerClass方法中可以创建成员类的对象,并可以调用成员类的方法。
那么我们可以在外围类的哪些地方创建其成员类的对象呢?下面的代码可以回答这个问题:public class OuterClassTwo {InnerOne one = new InnerOne(1);class InnerOne{InnerOne(int i){System.out.println(i+":InnerOne");}}public void OuterMethod1(){InnerOne two = new InnerOne(2);}public static void OuterMethod2(){OuterClassTwo outer1 = new OuterClassTwo();InnerOne three = outer1.new InnerOne(3);}public static void main(String[] args) {OuterClassTwo outer2 = new OuterClassTwo();outer2.OuterMethod1();OuterMethod2();OuterClassTwo.InnerOne four = outer2.new InnerOne(4);}}从上面的代码可以看出,成员类的对象依赖于其外围类的对象,也就是说,要想创建一个成员类的对象必须先创建一个其外围类的对象。
成员类能够访问其外围类的所有成员,示例代码如下:public class OuterClassThree {public int i = 1;int j = 2;protected int m = 3;private int n = 4;static int k = 5;class InnerOne{public void show(){System.out.println("i = "+i);System.out.println("j = "+j);System.out.println("m = "+m);System.out.println("n = "+n);System.out.println("k = "+k);}}public static void main(String[] args) {new OuterClassThree().new InnerOne().show();}}那么在内部类中怎么使用外部类对象的引用呢?我们可以使用点语法,即外围类跟圆点和this。
示例代码如下:public class OuterClassFour {public void print(){System.out.println("OuterClassFour.print()");}class InnerOne{public OuterClassFour getOuterClass(){return OuterClassFour.this;}}public static void main(String[] args) {new OuterClassFour().new InnerOne().getOuterClass().print();}}2.2 局部内部类可以在一个方法内或者在一个作用域内定义内部类,称为局部内部类。
下面代码展示了在一个方法内部定义的内部类。
interface MyInterface{void print();}public class OuterClassFive {public MyInterface showInnerClass(){class InnerOne implements MyInterface{public void print(){System.out.println("implementation");}}return new InnerOne();}public static void main(String[] args) {new OuterClassFive().showInnerClass().print();}}下面代码展示了在任意的作用域内嵌入式一个内部类:public class OuterClassSix {private int showInnerClass(boolean b){if(b){class InnerOne{private int i = 1;public int getI(){return i;}}InnerOne one = new InnerOne();return one.getI();}else return 0;}public static void main(String[] args) {boolean b = true;//boolean b = false;int a = new OuterClassSix().showInnerClass(b);System.out.println(a);}}2.3 匿名内部类如果一个局部内部类没有名字,那么这个类称为匿名内部类。
一个匿名内部类要么继承一个类(或抽象类),要么实现一个接口。
示例代码如下:class AClass{AClass(){System.out.println("AClasss");}}interface AInterface{int j = 2;void show();}public class OuterClassSeven {public AClass getObjectOne(){return new AClass(){};}public AInterface getObjectTwo(){return new AInterface(){public void show(){System.out.println("AInterface");}};}public static void main(String[] args) {OuterClassSeven outer = new OuterClassSeven();outer.getObjectOne();outer.getObjectTwo().show();}}2.4 静态内部类如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static,这样的内部类称为嵌套类。
嵌套类没有连接到其外围类的this引用,它类似于其外围类的一个static方法。
示例代码如下:public class NestedClassOne {private int i = 1;InnerOne one = new InnerOne();static class InnerOne{private int m = 2;public static int n = 3;public void show(){System.out.println("m = "+m);System.out.println("n = "+n);//System.out.println(i);//非法访问}public static int get(){return n;}}void OuterMethodOne(){InnerOne two = new InnerOne();two.show();int k = two.get();}static void OuterMethodTwo(){InnerOne three = new InnerOne();three.show();three.get();}public static void main(String[] args) {int x = NestedClassOne.InnerOne.get();System.out.println("x = "+x);NestedClassOne.OuterMethodTwo();new NestedClassOne().OuterMethodOne();}}从上面的代码可以看出嵌套类的对象并不依赖于其外围类的对象,并且不能从嵌套类中访问其外围类的非静态成员。
众所周知,接口中只能放置final的域和抽象方法。
但嵌套类是static的,所以可以放在接口中定义,甚至可以实现这个接口,示例代码如下:public interface NestedInterface {int i = 1;void show();static class InnerOne implements NestedInterface{public void show(){System.out.println("i = "+i);}public static void main(String[] args){new NestedInterface.InnerOne().show();}}}2.5 内部类的命名在同一类中可以定义成员类和嵌套类,可以定义局部内部类和匿名内部类,那么编译以后,每个类的内部类所生成的.class文件的命名有什么规则呢?可以通过程序总结其命名规则。