锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

浅谈c++和java的内部类

时间:2023-11-17 05:07:02 开关三极管3ck15a

最近在项目中遇到一个有趣c 比较问题Java,整理如下。

 class AUBCRoll : public VWFC::VWSceneController         {                  public:             struct tstBCButtonInfo              {                 bool m_boVisible;                 uint8 m_u8SubDisplayID;                 uint8 m_u8Layer;                 uint16 m_u16BCRollMappedIndex;                 uint16 m_u16BCRollRealIndex;                  const static uint8 m_u8BigBCRollNumbers;                 const static uint8 m_u8SmallBCRollNumbers;                 const static uint8 m_u8NaviRealIndex;                 const static uint8 m_u8AccRealIndex;                 const static uint8 m_u8LGRealIndex;              };  protected:             /**             * Miscellaneous values             */             enum enMisc              {                 AUWFC_BCROLL_WHEEL_TICKS =  VWFC_WHEEL_TICKS,           // System defined event                 AUWFC_BCROLL_ACTIVATE_NEXT_CHILD =   1,                          // Next child offset                 AUWFC_BCROLL_ACTIVATE_PREVIOUS_CHILD =   -1,                         // Previous child offset                 AUWFC_BCROLL_ACTIVATE_FIRST_VISIBLE_CHILD       =   0,                          // Indicate show first visible child                 AUWFC_BCROLL_INVALID_CHILD_INDEX =   WFC::nMAX_RANGE_OF_CHILDREN,     // Invalid child real index                 AUWFC_BCROLL_MAXIMUM_POSSIBLE_INPUT_MFL_VARIANTE =   7,                          // Maximum MFL wheel tick                 AUWFC_BCROLL_MINIMUM_POSSIBLE_INPUT_MFL_VARIANTE =   -7,                         // Minimum MFL wheel tick                 AUWFC_BCROLL_NOT_POSSIBLE_INPUT_MFL_VARIANTE  =   0,                          // Invalid MFL wheel tick                 AUWFC_BCROLL_CHANGE_DIRECTION  =   -1,                         // Change direction indication                 AUWFC_BCROLL_NUM_SPECIAL_BUTTONS                  =   3,                          // The number of special button types( ACC, Navi, LG )                 AUWFC_BCROLL_8BIT_INVALID                         =   0xFF,                       // Invalid value for 8 bit fields                 AUWFC_BCROLL_16BIT_INVALID                        =   0xFFFF,                     // Invalid value for 16 bit fields                 AUWFC_BCROLL_32BIT_INVALID                        =   0xFFFFFFFF,                 // Invalid value for 32 bit fields                 AUWFC_BCROLL_INVALID_MAPPING                      =   AUWFC_BCROLL_8BIT_INVALID,  // Invalid child mapped index                 AUWFC_BCROLL_INVALID_LANEGUIDANCEONOFF              =   0xFE                        // Invalid value for LaneGuidanceOnO              };  };

tstBCButtonInfo是BCRoll的一个public的in-class,我们可以用tstBCButtonInfo定义新的类对象:
AUBCRoll::tstBCButtonInfo stButtonInfo = AUBCRoll::tstBCButtonInfo ();


但是,外部类AUBCRoll和内部类tstBCButtonInfo两者之间的访问权是什么?

        static AUBCRoll::tstBCButtonInfo stSmallBCRollChildBCButtonInfoTable[AUBCRoll::tstBCButtonInfo::m_u8SmallBCRollNumbers] =         {             /*m_boVisible, m_u8SubDisplayID, m_u8Layer, m_u16BCRollMappedIndex, m_u16BCRollRealIndex*/             {true,  11, 0, 0, 0},//__cK15ON__cNO_SCP__vREF_FELD3_BC__REF_FELD3_BC__F3_Container_prioDF3__BCRoll__Date             {false, 19, 0, AUBCRoll::AUWFC_BCROLL_INVALID_MAPPING, 1},//__cK15ON__cNO_SCP__vREF_FELD3_BC__REF_FELD3_BC__F3_Container_prioDF3__BCRoll__Tota             {false, 17, 0, AUBCRoll::AUWFC_BCROLL_INVALID_MAPPING, 2}   }


此时,编译器将报告错误,表明内部类不能访问外部类public成员;
同样,外部类也不能访问内部类的非public成员。


对于c ,内外类之间的访问完全取决于成员自身的访问修饰符。


再看看Java,这个比c 更复杂有趣。


另一个类可以在一个类的内部定义,称为嵌套类(nested classes),它有两种类型:静态嵌套和非静态嵌套。非静态嵌套也被称为内部类(inner class)。嵌套是其外部成员,可以声明为private, public, protected, 或者package private。 (此时,外部类只能声明为public 或者package private。)
嵌套类 从JDK1.1开始引入。内部类别。(inner可分为三类:
内部类直接定义在一个类(外部类)中;
内部类在一种方法(外部类方法)中定义;
匿名内部类。
内部类访问外部类
规则和内部可以自由访问外部static一样。(访问非静态时必须先创建对象)


具体如下:
非静态内部非静态方法
* 直接访问

  1. public class Outter {  
  2.     int i = 5;  
  3.     static String string = "Hello";  
  4.       
  5.     class Inner1{  
  6.         void Test1 (){  
  7.             System.out.println(i);  
  8.             System.out.println(string);  
  9.         }  
  10.     }  
  11. }
静态内部类的非静态方法
因为静态方法访问非静态外部成员需先创建实例,所以访问i时必须先new外部类。

  1. public class Outter {  
  2.     int i = 5;  
  3.     static String string = "Hello";  
  4.       
  5.     static class Inner2{  
  6.         void Test1 (){  
  7.             System.out.println(new Outter().i);  
  8.             System.out.println(string);  
  9.         }  
  10.     }  
  11. }  


外部类访问内部类

大方向:因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先new一个对象。
非静态方法访问非静态内部类的成员:
new 内部类对象

  1. public class Outter {  
  2.     void Test1(){  
  3.         System.out.println(new Inner1().i);  
  4.     }  
  5.     class Inner1{  
  6.         int i = 5;  
  7. //      static String string = "Hello";  定义错误!  
  8.     }  
静态方法访问非静态内部类的成员
静态方法Test2访问非静态Inner1需先new外部类;
继续访问非静态成员i需先new 内部类
所以访问规则为:new Outter().new Inner1().i。

  1. public class Outter {  
  2.     static void Test2(){  
  3.         System.out.println(new Outter().new Inner1().i);  
  4.     }  
  5.     class Inner1{  
  6.         int i = 5;  
  7. //      static String string = "Hello";  定义错误!  
  8.     }  
  9. } 
非静态方法访问静态内部类的成员
先“外部类.内部类”访问至内部类。
若访问静态成员,则需先new再访问;若访问非静态成员,则可直接访问。

  1. public class Outter {  
  2.     void Test1(){  
  3.         Outter.Inner2 inner2 = new Outter.Inner2();  
  4.         System.out.println(inner2.i);  
  5.         System.out.println(inner2.string);  
  6.         System.out.println(Outter.Inner2.string);  
  7.     }  
  8.     static class Inner2{  
  9.         int i = 5;  
  10.         static String string = "Hello";   
  11.     }  
非静态方法访问非静态内部类的成员
先“外部类.内部类”访问至内部类,再new即可访问静态成员。

浅谈c++和java的内部类

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章