内部类详解 1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类

合集下载

Java语言入门基础内部类

Java语言入门基础内部类

Java语言基础:内部类内部类,计算机面向对象程序设计概念。

向对象程序设计中,可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型,即静态嵌套类和非静态嵌套类。

静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。

内部类是JAVA语言的主要附加部分。

内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。

1. 普通内部类普通内部类的一个最简单的例子:1.// 外部类2.class OutterClass {3.// 内部类4.public class InnerClass {5.private int i = 0。

6.public int getInt(){7.return i。

8. }9. }10.public void proc(){11. InnerClass inClass = new InnerClass()。

12. System.out.println(inClass.getInt())。

13. }14.}15.16.public class Main {17.public static void main(String[] args) {18. OutterClass outClass = new OutterClass()。

19. outClass.proc()。

20. }21.}外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:22.// 外部类23.class OutterClass {24.private int mOut = 10。

25.// 内部类26.public class InnerClass {27.private int mIn = 0。

28.public void printOutPrivate(){29.// 直接打印外部类的成员30. System.out.println(mOut)。

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

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声明,则此内部类就称为静态内部类。

Java内部类

Java内部类

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 静态成员类约束静态成员类不能与外部类重名像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。

Java 内部类

Java 内部类

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内部类{}}}编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名、$符号、编号。

内部类构造方法

内部类构造方法

内部类构造方法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 静态嵌套类静态嵌套类是定义在一个类的内部,并且被声明为静态的内部类。

内部类的理解

内部类的理解

内部类的理解Java中可以定义一个类在另一个类的内部,这个被定义的类称为内部类。

Java的内部类包括成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类是嵌套在另一个类中的类,它可以访问外部类的成员,包括私有成员。

例如,一个人类(外部类)中可以包含若干个眼类(内部类),眼类可以访问人类的姓名、年龄等信息。

局部内部类是定义在方法内部的类,它与方法的局部变量具有相同的作用域,并且只能在方法内部被访问。

局部内部类的优点在于可以访问方法内的变量和参数,缺点是只能在方法中使用。

例如,一个计算器类中的某个方法可以包含一个局部内部类,用于实现某一项特殊计算。

匿名内部类是一个没有名称的内部类,它通常是在创建对象时定义的。

它没有实际的类定义,在创建时会自动创建一个子类,这个子类是继承了某个父类或者实现了某个接口。

匿名内部类的优点在于可以省略掉类定义的步骤,方便代码编写。

例如,一个控制台应用程序中可以使用一个匿名内部类来监听键盘输入事件。

代码如下:```import java.awt.event.*;import javax.swing.*;public class KeyListenerExample extends JFrame {public KeyListenerExample() {addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent event) {System.out.println("键盘按下了:" + event.getKeyChar());}});setSize(400, 400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}静态内部类是一个独立的类,它与外部类的实例无关,可以通过外部类名称直接访问。

静态内部类通常用于将一组相关的方法或常量封装在一个类中。

java内部类

java内部类

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中我们并没有声明,那么它引用自何处呢?显然是来自于外部类。

JAVA基础资料 day08面向对象-内部类、异常

JAVA基础资料 day08面向对象-内部类、异常

1内部类1.1 内部类的概述将类定义在另一个类的内部则成为内部类。

其实就是类定义的位置发生了变化。

在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为成员内部类和局部内部类。

备注:内部类生产的class文件为“外部类$内部类”,为了标明该内部类是属于具体哪个外部类的。

1.2 成员内部类的访问方式1.内部类可以直接访问外部类的成员属性。

(孙悟空相当于内部类飞到牛魔王的肚子里面去)。

2.外部类需要访问内部类的成员属性时需要创建内部类的对象。

1.在外部类的成员函数中创建内部类的对象,通过内部类对象对象直接访问内部类的成员。

2.在其他类中直接创建内部类的对象。

Outer.Inner inner = new Outer().new Inner();外部类访问内部类的属性编译异常分析:外部类需要访问内部类的属性时,需要创建内部类的对象访问。

有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来A 类中的成员。

这时,就将A类定义成B类的内部类。

比喻:孙悟空和铁扇公主。

孙悟空到了公主肚子中,就成了内部类(其实是持有外部类的对象引用)。

疑问:什么时候使用内部类呢?当我们分析事物时,发现事物的内部还有具体的事物,这时则应该定义内部类了。

比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。

这时就将心脏定义在人体类中,作为内部类存在。

内部类的优势:成员内部类作为外部类的成员,那么可以访问外部类的任意成员。

1.3 成员内部类访问细节私有的成员内部类不能在其他类中直接创建内部类对象来访问。

如果内部类中包含有静态成员,那么java规定内部类必须声明为静态的访问静态内部类的形式:Outer.Inner in = new Outer.Inner();总结:成员内部类(成员属性、成员方法)特点:1.私有的成员内部类特点:不能在其他类中直接创建内部类对象来访问2.静态的成员内部类特点:如果内部类中包含有静态成员,那么java规定内部类必须声明为静的访问静态内部类的形式:Outer.Inner in = new Outer.Inner();疑问:目前打印的num是20,如果想打印10的话,应该怎么做?解答:这时候其实在show方法中已经存在了两个this对象,一个是外部类对象,一个是内部类对象,所以要在this前面加上类名标明对应的this。

java内部类

java内部类

内部类概述内部类是编译期状态!编译器知道,虚拟机不知道,在虚拟机处,会成为正常的类,反编译代码会失败,甚至不好还原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外部类中使用创建内部类对象外部类不能直接访问内部类成员外部类的特权可以创建内部类对象。

14. Java中内部类与匿名内部类

14. Java中内部类与匿名内部类

Java中内部类与匿名内部类一、内部类1.内部类:将一个类定义在另外一个类的里面,里面的类的就称为内部类又称为内置类,嵌套类。

class Outer{class Inter{}}编译后的class文件是:Outer.class 和 Outer$Inter.class。

2.为什么把类定义在内部,什么时候需要定义内部类?答:类定义在另外一个类内部,该内部类就可以直接访问外类中的成员,特别是private的成员。

内部类其实也是一种封装。

当描述一个事物A时,发现该事物中还有其他事物(B,C等),而且这些其他事物(B,C等)还要访问该事物A的内容,这时就需要把这些其他事物(B,C等)定义为内部类来描述。

例如:人体是一个类,其中包括很多器官和组织,而大脑又要访问人体的其他器官,可以把大脑单独定义成一个类,从而成为内部类。

3.内部类的访问特点:(1)内部类可以直接访问此外部类中的成员(private的可以直接被访问);(2)此外部类要访问内部类的内容,需要建立内部类的对象。

4.内部类也可以放在类中与成员并列的位置,也可以放在局部位置上(成员方法中)(局部内部类);如果内部类放在局部位置(成员方法中)中,内部类内部需要访问此方法中的局部变量,此局部变量必须定义为final的,即内部类在局部位置上时,内部类只能访问局部中被final修饰的局部变量即常量。

原因:因为内部类定义在成员方法中,当执行方法时,会产生一个对象,但是方法执行完后就会释放,而这个对象再次访问这个方法的局部变量,肯定找不到了,之所以定义为final,是在定义个常量,即只是给常量起个名字,所以对象再次寻找时,找的就是一个常量而已,而常量并不是随着方法的消失而消失。

实例:class Outer {void method() {finalint num = 10 ;class Inter{void show1() {System.out.println(num);}}Inter inter = new Inter();inter.show1();}}publicclass OuterInter {publicstaticvoid main(String[] args) {new Outer().method();}}5.(1)如果在外类的外部直接生成一个内部类(前提:不是private的)的对象方法是Outer.Inter inter = new Outer().new Inter();inter.xxxx(); //就可以直接利用内部类的引用访问内部类的成员(2)如果内部类是静态的,则就差不多相当于一个外部类。

内部类

内部类

四种java内部类总结博客分类:Java基础第一成员内部类定义在另一个类的内部,而且与成员方法和属性平级叫成员内部类。

1成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。

2在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式3创建成员内部类的实例使用“外部类名.内部类名实例名 = 外部类实例名.new 内部类构造方法(参数)”的形式。

在创建内部类实例之前需要先创建外部类的实例对象。

Java代码1.package test5;2.3.public class MyTest {4.public static void main(String[] args) {5. Outer outer=new Outer("test");6. Outer.Inner inner = outer.new Inner(20);7. }8.}9.10.class Outer{11. Outer(String str){12.13. }14.protected class Inner{15.public Inner(int a){16.17. }18. }19.}4成员内部类可以可以使用public,protected,default,private,static,final,abstract 来修饰.当然了,被static修饰的内部类,是静态内部类。

5内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。

例如上面定义的三个类的class文件分别是:MyTest.class、Outer.class和Outer$Inner.class三个文件。

内部类的定义文件名形式是“外部类定义名$内部类定义名”,即Outer$Inner.class。

C++中的内部类

C++中的内部类

C++中的内部类1. 内部类的概念如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。

注意此时这个内部类是⼀个独⽴的类,它不属于外部类,更不能通过外部类的对象去调⽤内部类。

外部类对内部类没有任何优越的访问权限。

即说:内部类就是外部类的友元类。

注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。

但是外部类不是内部类的友元。

2. 内部类可以定义在外部类的public、protected、private都是可以的。

如果内部类定义在public,则可通过外部类名::内部类名来定义内部类的对象。

如果定义在private,则外部不可定义内部类的对象,这可实现“实现⼀个不能被继承的类”问题。

3. 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。

class A{private: static int k;int h;public: class B{void foo(){cout<<k<<endl;//OK//cout<<h<<endl;// ERROR}};};int A::k=3;这⾥cout<<h<<endl;是⼀个⾮常常见的错误。

因为内部类是⼀个独⽴的类,不属于外部类,所以此时还没有外部类的对象,显然也不存在h。

⽽k就不同了,不需要外部类的对象就已存在,所以这⾥k是OK的。

这和友元类的使⽤也是同样的道理。

“想要使⽤另⼀个类的成员,必须要存在这个类的对象”。

class A{private: static int k;int h;public: class B{void foo(A a){cout<<k<<endl;//OKcout<<a.h<<endl;//OK}};};int A::k=3;这样就没问题了。

4. 在堆中创建内部类对象:class A{public: class B{};};int _tmain(int argc, _TCHAR* argv[]){A::B*b=new A::B();return0;}5.内部类可以现在外部类中声明,然后在外部类外定义:class A{private: static int i;public: class B;};class A::B{public:void foo(){cout<<i<<endl;}//这⾥也不需要加A::i.};int A::i=3;这形式上就更像友元类了。

JAVA内部类的作用方法使用

JAVA内部类的作用方法使用

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语言内部类概念

匿名内部类
• 没有名字的内部类 • 应用场合
– 只用到类的一个实例 – 类在定义后马上实例化 – 类非常短小
• 匿名内部类限制
– 不能有构造方法。 – 不能定义任何静态成员变量和成员方法。 – 不能受public,protected,private,static修饰
匿名内部类样例
public class Car {
使用内部类好处
• 内部类可以很好的实现隐藏
– 一般的类不允许有 private 与protected权限的,但内部类可以
• 内部类拥有外围类的所有元素的访问权限 • 可以实现多重继承 • 可以避免修改接口而实现同一个类中两种同名方法的调用。
内部类种类
• 成员内部类 • 方法内部类 • 匿名内部类 • 静态嵌套类
内部类概念
• 定义 – 内部类是指在一个外部类的内部再定义一个类 – 内部类的名称无需与文件名相同
• 特征
– 内部类是一个独立的类,被编译成独立的.class文件, – class文件名前面冠以外部类的类名和$符号 ,如 outer$inner.class – 内部类不能用普通的方式访问。 – 内部类是外部类的一个成员,内部类可以自由地访问外部类的成员
public void drive( ){System.out.println("Driving a car!");}
public static void main(String[] args) {
Car car = new Car( ){
பைடு நூலகம்
public void drive() {
System.out.println("Driving another car!");}};

java内部类知识点总结

java内部类知识点总结

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内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类

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笔记——5内部类

java笔记——5内部类

内部类将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。

(一)内部类的访问规则:1.内部类可以直接访问外部类中的成员,包括私有。

之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this2.class Outer{private int x = 3;class Inner//内部类{//int x = 4;void function(){//Int x = 6; 如果这句成立,结果是6System.out.println("innner :"+Outer.this.x);}}void method(){Inner in = new Inner();in.function();}}class InnerClassDemo{public static void main(String[] args){Outer out = new Outer();out.method();//直接访问内部类中的成员。

Outer.Inner in = new Outer().new Inner();in.function();}}3.当内部类定义在外部类的成员位置上,而且非私有,可以在外格式外部类名.内部类名变量名 = 外部类对象.内部类对象;Outer.Inner in = new Outer().new Inner();4.当内部类在成员位置比如:private:将内部类在外部类中进行封装。

static:内部类就具备static的特性。

当内部类被static修饰后,只能直接访问外部类中的static成员。

出现了访问局限。

(1)在外部其他类中如何直接访问staticnew Outer.Inner().function();(2)在外部其他类中,如何直接访问staticuter.Inner.function();注意:当内部类中定义了静态成员,该内部类必须是static的。

笔记-java内部类

笔记-java内部类

内部类是指在一个外部类的内部再定义一个类。

类名不需要和文件夹相同。

内部类可以是静态static的,也可用public,default,protected和private修饰。

(而外部顶级类即类名和文件名相同的只能使用public和default)。

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。

对于一个名为outer的外部类和其内部定义的名为inner的内部类。

编译完成后出现outer.class和outer$inner.class两类。

所以内部类的成员变量/方法名可以和外部类的相同。

内部类分为四种:静态内部类,成员内部类,局部内部类和匿名内部类,静态内部类可以声明静态的成员变量,其他的内部类则不可以。

1、静态内部类(static inner classes)静态内部类就是声明为static的内部类,注:静态内部类只能访问外部类的静态成员变量与静态方法。

需要了解2个概念:内部类和静态修饰符static1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。

所以没有必要专门用一个Java文件存放这个类。

2)静态都是用来修饰类的内部成员的。

比如静态方法,静态成员变量,静态常量。

它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。

这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。

并且它可以直接被用外部类名+内部类名获得。

不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类的实例。

生成静态内部类对象的方法:OuterClass.InnerClass inner = new OuterClass.InnerClass();以下举例说明怎么使用:Student类有个叫School的内部类(非静态)Student stu = new Student();stu.School sch = new stu.School();//sch就是School的一个对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内部类详解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则是创建了一个新的引用。

.new关键字如果想直接创建一个内部类对象,而不是通过外围类对象的方法来得到,可以使用.new 关键字形式是这样的:Java代码1.OutClass.InnerClass obj = outClassInstance.new InnerClass();必须是外围类对象.new,而不能是外围类.newJava代码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.public void getStr(){7.System.out.println("First.str="+str);8.}9.}10.11.public static void main(String [] args){12. First first = new First();13. First.Contents contents = first.new Contents();14. contents.f();15.}16. }17.必须通过外围类First的对象first来创建一个内部类的对象而且需要注意的是,在创建外围类对象之前,不可能创建内部类的对象(嵌套类除外)。

4、内部类与向上转型将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。

Java代码1.public interface Shape {2.public void paint();3.}4.public class Painter {5.6.private class InnerShape implements Shape{7.public void paint(){8.System.out.println("painter paint() method");9.}10.}11.12.public Shape getShape(){13. return new InnerShape();14.}15.16. public static void main(String []args){17. Painter painter = new Painter();18. Shape shape = painter. getShape();19. shape.paint();20.}21. }22.此时,内部类是private的,可以它的外围类Painter以外,没人能访问。

这样,private内部类给累的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并完全隐藏实现的细节。

5、方法内的类可以在方法内创建一个类。

Java代码1.public void test(){2.ass Inner{3.public void method(){4.ystem.out.println("在方法内创建的类");5.}6.7.}值得注意的是:方法内创建的类,不能加访问修饰符。

另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被编译了(怎么知道的?后面会有讲解)。

6、匿名内部类Java代码1.public class Painter {2.ublic Shape getShape(){3.return new Shape(){4.public void paint(){5.System.out.println("painter paint() method");6.}7.};8.9.public static void main(String [] args){10. Painter painter = new Painter();11. Shape shape = painter.getShape();12. shape.paint();13. }14. }15. public interface Shape {16.ublic void paint();17. }注意,匿名内部类后面的分号不可缺少!匿名类,顾名思义,就是没有名称。

getShape()方法里,就使用了匿名内部类。

看上去很奇怪,不符合传统的写法?第一眼看上去确实是这样的。

这样写,意思是创建了一个实现了Shape的匿名类的对象。

匿名类可以创建,接口,抽象类,与普通类的对象。

创建接口时,必须实现接口中所有方法。

这是无参的,如果需要参数呢?可以直接传。

Java代码1.public class B {2.public A getA(int num){3.return new A(num){4.5.};6.}7.}8.public class A {9.private int num;10.public A(int num){11. this.num = num;12.}13.public A(){14.15.}16. }17.Ok,在这个例子中,可以为A的构造方法传入一个参数。

在匿名内部类中,并没有使用到这个参数。

如果使用到了这个参数,那么这个参数就必须是final的。

Java代码1.public class B {2.public A getA(final int num){3.return new A(num){4.public int getNum(){5.return num;6.}7.};8.}9.}10. public class A {11.private int num;12.public A(int num){13. this.num = num;14.}15.public A(){16.17.}18. }19.如果不是final的,编译器就会提示出错。

另外,还可以在匿名内部类里定义属性由于类是匿名的,自然没有构造器,如果想模仿构造器,可以采用实例初始化({})Java代码1.public A getA(){2.return new A(){3.int num = 0;4.String str;5.{6.str = "javaeye";7.System.out.println("hello robbin");8.}9.};10. }11.匿名内部类通过实例初始化,可以达到类似构造器的效果~另外可以通过匿名内部类来改造工厂方法。

Java代码1.public interface Service {2.public void method1();3.}4.public interface ServiceFactory {5.Service getService();6.}7.public class Implemention1 implements Service{8.public void method1(){9.System.out.println("In Implemention1 method method1()");10.}11.12.public static ServiceFactory factory = new ServiceFactory(){13. public Service getService(){14. return new Implemention1();15. }16.};17. }18. public class Implemention2 implements Service {19.public void method1(){20. System.out.println("in Implemention2 method method1()");21.}22.23.public static ServiceFactory factory = new ServiceFactory(){24. public Service getService(){25. return new Implemention2();26. }27.};28.29. }30. public class Test {31.public static void main(String []args){32. service(Implemention1.factory);33. service(Implemention2.factory);34.35. ServiceFactory factory1 = Implemention1.factory;36. Service service1 = factory1.getService();37. service1.method1();38.39. ServiceFactory factory2 = Implemention1.factory;40. Service service2 = factory2.getService();41. service2.method1();42.}43. }在Implemention1和2中匿名内部类用在字段初始化地方。

相关文档
最新文档