类的成员之内部类

2023-12-30 15:58
文章标签 之内 成员 部类

本文主要是介绍类的成员之内部类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类。相对而言, 包含它的类称为外部类.
在这里插入图片描述

内部类:作为类: 1.可以继承父类,实现接口2.类内部可以有类的成员(普通类可以做的事情内部类都可以)作为类的成员:1.可以被static修饰2.可以使用四种权限修饰符、3.内部类还可以调用外部类的成员(属性、方法)         学习目标:1.如何创建内部类的对象?静态内部类:new 外部类名.内部类名()非静态内部类:外部类的对象.new 内部类名()2.内部类如何调用外部类的成员(属性和方法)静态内部类:外部类名.类变量名、静态方法(只能调用外部类的类变量和静态方法)非静态内部类:外部类名.this.属性名、方法名3.如何使用局部内部类

静态内部类

静态内部类与静态变量和静态方法定义的位置一样, 也带有关键字static.

它的一般定义格式如下:

class 外部类{static class 内部类{//静态内部类的实现}
}

静态内部类:
(1)与一个独立的类差别不大,可以有静态变量、静态方法、成员变量、成员方法、构造器等
(1)可以访问外部类的静态变量和方法, 但是不可以访问实例变量和方法.
(2)public 修饰的静态内部类可以通过"外部类.静态内部类"的方式被外部使用.

成员内部类:它定义在另一个类中

它的一般定义格式如下:
class 外部类{class 内部类{//成员内部类的实现}
}

内部类可以无条件访问外部类的属性和方法,但是如果外部类想要访问内部类中的属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。

(1)内部类访问外部类的方法和属性

public class Outer {private String name = "我的名字是外部类";String greet = "Hello";public void outerMethod(){System.out.println(greet+","+name);}class Inner{public void innerMethod(){System.out.println(name);outerMethod();//成员内部类直接访问外部类的方法}}public void test(){Inner inner = new Inner();inner.InnerMethod();//外部类使用内部类中的方法}
}

(2)成员内部类在外部的使用

public class Outer {private int a = 100;public class Inner{public void InnerMethod(){System.out.println("Inner class");}}public static void main(String[] args) {Outer outer = new Outer();//创建外部类对象Outer.Inner inner = outer.new Inner();//通过外部类对象创建非静态内部类对象inner.InnerMethod();}
}

(1)与静态内部类不同, 成员内部类对象总是和一个外部类对象相连的, 在外部使用时,他不能直接通过new Outer.Inner()的方式创建对象,而是先创建一个Outer类对象,然后使用“外部类对象.new 内部类”的方式创建内部类对象
(2)与静态内部类不同,成员内部类中不可以定义静态成员(final 变量例外,它等同于常量)

方法内部类

方法内部类定义在方法体中。它和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域内.
class 外部类{方法(){class 局部内部类{}}
}

如何使用方法内部类?
(1)只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方都不能使用该类
(2)但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类的父类或父接口类型.
注:
(1)方法内部类可以使用外部方法的局部变量,但是必须是final的。由方法内部类和局部变量的声明周期不同所致。
(2)方法内部类和局部变量地位类似,不能使用public,protected,缺省,private
(3)方法内部类不能使用static修饰,因此也不能包含静态成员

匿名内部类

与前面介绍的内部类不同,匿名内部类没有单独的类定义,它在创建对象的同时定义类,语法如下:
new 父类(参数列表){//匿名内部类实现部分
}
或者
new 父接口(参数列表){//匿名内部类实现部分
}

匿名内部类只能被使用一次, 用来创建一次. 它没有名字, 没有构造方法, 但可以根据参数列表, 调用对应的父类构造方法. 与方法内部类一样, 匿名内部类也可以访问外部类的所有变量和方法, 可以访问方法中的final 参数和局部变量.

abstract class Computer{public abstract void info();
}class SuperClass{public void show(){System.out.println("superClass");}
}public class AnonymousTest2 {public static void main(String[] args) {//创建了一个Computer匿名子类的对象Computer c = new Computer(){@Overridepublic void info() {System.out.println("c info");}			};test(c);System.out.println("----------创建普通类的匿名子类------------");//创建了一个SuperClass匿名子类的对象SuperClass sc = new SuperClass(){@Overridepublic void show(){System.out.println("subClass");}};sc.show();}public static void test(Computer c){c.info();}
}

输出结果

c info
----------创建普通类的匿名子类------------
subClass

这篇关于类的成员之内部类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553332

相关文章

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

C++ 在外部访问对象的protected成员的方法

起因 起因在于,今天在写UE4插件时,有一个对象的protected成员我想要访问。这个类没有提供接口来访问那个成员,并且这个类是定义在引擎代码中的而我不想“污染”引擎代码。 不过,我想到这么做或许可以在不改变原有类的定义下访问其中的protected成员: 定义一个原有类的子类,在其中定义可以访问protected成员的接口。想要访问对象的成员时,将原有类类型的指针转变为子类类型的指针,然

一种在C++中外部强行访问私有成员的方法

问题 C++在设计上,是不允许类的私有成员在外部被访问读写的。 然而,有时是想要在外部访问私有成员的。我目前常见的情况是:想要访问UE引擎代码中的类的私有成员,但又不想“污染”其源代码将其private改为public。 方法 一种方法是,再建立一个完全相同结构的类,只不过将成员改为public: class MyClassA_MirrorPublic{public:int dat

在C++中成员初始化的区别

在C++中,构造函数中的成员初始化列表(member initializer list)和构造函数体(constructor body)中进行的初始化存在显著的不同。这种不同主要体现在初始化时机、效率和语义上。 成员初始化列表(Member Initializer List) 在你的示例中,CMotorCtrl的构造函数使用了成员初始化列表来初始化成员变量。这是通过在构造函数定义中的冒号:后面

【大数据Java基础-JAVA 面向对象09】类成员(三)类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念

1.构造器(或构造方法):Constructor 构造器的作用: 1.创建对象 2.初始化对象的信息   2.使用说明: 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器 2.定义构造器的格式:权限修饰符 类名(形参列表){} 3.一个类中定义的多个构造器,彼此构成重载 4.一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器 5.一个类中,至少会有一个构

【大数据Java基础-JAVA 面向对象07】类成员(二)类结构 方法(四)递归方法

1.定义: 递归方法:一个方法体内调用它自身。 2.如何理解递归方法? > 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。 > 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。 3.举例: // 例1:计算1-n之间所自然数的和 public int getSum(int n) {// 3if (n == 1) {return 1;}

【大数据Java基础-JAVA 面向对象06】类成员(二)类结构 方法(三) JAVA的值传递机制

java的值传递机制 1.针对于方法内变量的赋值举例: System.out.println("***********基本数据类型:****************"); int m = 10; int n = m; System.out.println("m = " + m + ", n = " + n); n = 20; System.out.println("m = " + m + ",

PHP 成员方法和类的调用

1、PHP成员方法详解: <span style="font-size:18px;"><?php//屏蔽notice 级错误error_reporting(E_ALL^E_NOTICE);/* 成员方法的讲解:函数和成员方法关系:当我们把一个函数写到 某个类中,则该函数称为成员方法;成员方法的基本语法:访问修饰符号 function 函数名(参数列表)\{函数体retu

Android JNI 访问Java中的成员变量及非native方法

JNI的头文件生成及编译请参考《Android中的JNI使用指南一》 1、修改Java类中的成员变量。通过HelloJNI.java类中changeNum()本地方法来修改成员number的值。number初始化为0,通过本地方法changeNum()修改为100。HelloJNI.java类中定义如下: changeNum()在C++中的实现,如下: //修改java类中的成员变量(i