黑马程序员技术交流社区

标题: 关于外部类和内部类创建类实例对象的问题 [打印本页]

作者: 黑马--马超    时间: 2012-7-24 19:37
标题: 关于外部类和内部类创建类实例对象的问题
本帖最后由 cookie110 于 2012-7-27 20:02 编辑

class A  //创建一个外部类A
{
        
        private int a; //这个属性只能在class A的有效范围内修改和调用,如果不加private,可以直接在此类外的类修改a的值
        private void Ametod1()
        {
           System.out.println("这是一个私有方法,a的值更改为:"+a); //次方法只能在class A的有效范围内调用,如果不加prinvate可以在可以直接在此类外的类调用
        }   
         class AInClass //创建外部类A的一个内部类AInClass  问题:这里使用static修饰符,在编译时为何为提示(限定的新静态类)的错误
        {
                 AInClass(int x)   //创建此类的一个带int类型x型参的构造函数来修改外部类中的私有成员,并调用外部类A中的Amethod1()方法
                {
                                        //A modifyAClass = new A(); //创建外部类A的一个实例对象并引用给变量ModifyAClass,(此过程中会开辟一个新的内存空间,存放类A中的成员,并初始化为空值)
                                        //modifyAClass.a=x; //将x的值赋值给ModifyAClass对象的私有属性a

                                new A().a=x;//

                         //modifyAClass().Ametod1();// 错误: 找不到符号

                        new A().Ametod1(); //创建外部类A的一个实例的私有方法Ametod1()

                        
                }
        }
}

class B //创建一个外部类B
{  

        void SetAx(int x) //创建一个只有一个整形形参x,不需要返回类型的方法成员SetAx
        {
               
                new A().new AInClass(x); //创建外部类A的实例并创建A的内部类AIClass类的实例,创建AIClass类实例后会自动调用构造函数AInClass(int x);
               
                }
         


}

class test
{

public static void main(String[] args)
{
        B ClassB= new B();  //创建一个外部B类的实际对象,引用给变量名ClassB
        ClassB.SetAx(1);    //调用ClassB对象的SetAx()方法并传递整数常量10给SetAx()处理;
}
}


问题:

1.以上程序为何要同时在私有属性a和私有方法Ametod1() 前加static才能更改程序的属性,否则会初始化为0
2.内部类访问外部类的有几种方法,每种方法通常在什么时候使用?
3.外部类调用另一个外部类的内存过程是怎样的,有几种方法在什么范围类可以可以调用外部类的内部类,各有什么优点?





作者: 王志明    时间: 2012-7-24 19:53
1.成员变量加上private就是私有的了,只能在本类范围内访问,一般我们设计类的时候都把实体的属性(成员变量)设为private,再提供公共的getter和setter,这是java里面向对象的一种特性,封装。
2.内部类可以直接访问外部类的方法,因为内部类的实例依赖于外部类实例。

作者: 侯宪博    时间: 2012-7-25 04:32
本帖最后由 侯宪博 于 2012-7-25 12:48 编辑

额这个。。。

作者: 侯宪博    时间: 2012-7-25 12:48
首先,静态的内部类创建对象是不需要外部类实例化的。
内部类对象创建形式可以是:
new A.AInClass()
如果单单是内部类创建对象的话就需要外部类就需要实例化了。
就是new A().new AInClass()
而且内部类可以直接访问外部类的所有属性和方法
这是因为内部累持有外部类引用
但是,一旦被static修饰以后,内部类就只能直接访问外部类的静态成员了。
但是你的a不能初始化不是这个原因。
那是因为你用内部类访问a 的时候是通过外部类对象来引用的。
你改变的是外部类对象所引用的那个a
然后你调用打印a的方法的时候却创建了另一个外部类对象
结果当然是0了
但当你用static修饰外部类中的a时
a就会被加载进内存中的共享区
这样一来两个对象引用的a就是共享的了
所以可以打印出1
如果你听不懂我在说什么
你就再好好看看静态修饰符和静态内部类的教程
希望对你有所帮助。。。
作者: 黑马王冬冬    时间: 2012-7-25 14:57
1.内部类分为局部内部类(方法中定义的内部类)和成员内部类。成员内部类是一种与field,方法,构造器和初始化块相似的类成员;局部内部类和匿名内部类则不是类成员。成员内部类分为静态内部类和非静态内部类。
2.因为内部类被当成外部类成员,内部类成员可以直接访问外部类的私有数据。但根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
3.在外部类Outer以外创建非静态内部类Inner的对象,
Outer.Inner in = new Outer().new Inner();
在外部类Outer以外创建静态内部类Inner的对象,
Outer.Inner in = new Outer.Inner();


作者: 黑马--马超    时间: 2012-7-27 20:01
我懂了,谢谢大家,我对这些语法还不熟练,需要练习。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2