浅谈c++和java的内部类
时间:2023-11-17 05:07:02
最近在项目中遇到一个有趣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一样。(访问非静态时必须先创建对象)
具体如下:
非静态内部非静态方法
* 直接访问
- public class Outter {
- int i = 5;
- static String string = "Hello";
- class Inner1{
- void Test1 (){
- System.out.println(i);
- System.out.println(string);
- }
- }
- }
因为静态方法访问非静态外部成员需先创建实例,所以访问i时必须先new外部类。
- public class Outter {
- int i = 5;
- static String string = "Hello";
-
- static class Inner2{
- void Test1 (){
- System.out.println(new Outter().i);
- System.out.println(string);
- }
- }
- }
外部类访问内部类
大方向:因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先new一个对象。非静态方法访问非静态内部类的成员:
new 内部类对象
- public class Outter {
- void Test1(){
- System.out.println(new Inner1().i);
- }
- class Inner1{
- int i = 5;
- // static String string = "Hello"; 定义错误!
- }
静态方法Test2访问非静态Inner1需先new外部类;
继续访问非静态成员i需先new 内部类
所以访问规则为:new Outter().new Inner1().i。
- public class Outter {
- static void Test2(){
- System.out.println(new Outter().new Inner1().i);
- }
- class Inner1{
- int i = 5;
- // static String string = "Hello"; 定义错误!
- }
- }
先“外部类.内部类”访问至内部类。
若访问静态成员,则需先new再访问;若访问非静态成员,则可直接访问。
- public class Outter {
- void Test1(){
- Outter.Inner2 inner2 = new Outter.Inner2();
- System.out.println(inner2.i);
- System.out.println(inner2.string);
- System.out.println(Outter.Inner2.string);
- }
- static class Inner2{
- int i = 5;
- static String string = "Hello";
- }
先“外部类.内部类”访问至内部类,再new即可访问静态成员。
浅谈c++和java的内部类