原址:http://blog.csdn.net/a450828540/article/details/8993160
c++与java都允许类的嵌套,不过在机制和使用方法上还是有较大不同的
一、C++的嵌套类
C++的嵌套类可以在封装类的私有、公有、保护部分定义,当然这些访问控制也做用于嵌套类上。
虽然嵌套类在封装类内部定义,但它是一个独立的类,基本上与封装类不相关。它的成员不属于封装类,同样,封装类的成员也不属于该嵌套类。嵌套类的出现只是告诉封装类有一个这样的类型成员供其使用。并且,封装类对嵌套类成员的访问没有任何特权,嵌套类对封装类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
不过也有特例: 嵌套类可以直接访问封装类的静态成员、类型名( typedef )和枚举值(enum)。
- #include <iostream>
- using namespace std;
- class X{
- class Y{
- int m;
- public:
- Y(int t){ m=t; }
- }
- public:
- X(){}
- }
- int main () {
- X::Y y(5); //使用“::”调用
- return 0;
- }
如上代码所示是将成员函数都定义为内联函数了,若不想定义为内联,在外部定义函数是应该使用作用域操作符 ::
例如:
- X::Y::Y(){
- your code;
- }
嵌套类的定义也可位于封装类之外,定义时也要如上使用作用域操作符
注意事项:
- 封装类无法直接访问嵌套类私有成员,若想直接访问,必须在嵌套类中使封装类成为其友元。
- 嵌套类无法直接访问封装类私有成员,若想直接访问,必须在封装类中使嵌套类成为其友元。
- 嵌套类可以直接访问封装类的静态成员、类型名( typedef )和枚举值(enum)。
- 若嵌套类想访问封装类的非静态成员,必须通过封装类的一个对象作为载体才行。
二、java的嵌套类
1、静态嵌套类:
C++的嵌套类与java中的静态嵌套类“类似”。
- //java
- class X{
- static class Y{ //非public
- private int a;
- public Y(int m){ a=m; }
- public void printY(){
- system.out.println( "xxxxxxxxx");
- }
- }
- private Y yref;
- public X(){}
- Y get_yref(){ return yref; }
- }
- class test{
- public static void main( String[] args) {
- X x=new X();
- x.get_yref().printY(); //因为非public所以要先获取对象
- //java
- class X{
- public static class Y{ //public
- private int a;
- public Y(int m){ a=m; }
- public void printY(){
- system.out.println( "xxxxxxxxx");
- }
- }
- private Y yref;
- public X(){}
- Y get_yref(){ return yref; }
- }
- class test{
- public static void main( String[] args) {
- X.Y x=new X.Y(); /public直接使用成员操作符“.”来调用
- x.printY();
静态嵌套类与C++嵌套类类似,可以直接访问封装类的static成员,但是,如要访问非静态成员就要使用一个封装类的对象作为载体。此外java中嵌套类可以直接访问封装类中的私有成员。
2.非静态嵌套类:内部类
内部类允许我们直接访问封装类的所有成员,不论静态成员还是非静态,不论private还是protected更别说public。
请看如下代码:
- //java
- class X{
- private int a;
- private static int b=30;
- public class Y{ //内部类,非静态
- private int m;
- private int n;
- public Y(){
- m = a; //访问private成员
- n = b; //访问静态私有成员
- }
- }
- public X(int n) { a = n; }
- }
- class test {
- public static void main ( String[] args) {
- X x=new X.Y();
- // X.Y y = new X.Y() //错的!!!
- X.Y y= x.new Y(); //这样才对
- }
- }
接下来说一下名字冲突的情况下以前缀避免冲突:
- //java
- class X{
- private int m;
- private static int n=300;
- public class Y{
- private int m;
- private int n;
- public Y(){
- this.m = X.this.m; //此处留意
- this.n = X.this.n;
- }
- }
- public X(){}
- }
java的接口也可以包含嵌套的接口或者类,当接口包含了一个类时,这个类会被隐式的声明为public和static
最后,如果有多重嵌套例如:x( y( z() ))可以在z中使用x.前缀访问x成员,还有,内部类不允许有静态成员。