A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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.外部类调用另一个外部类的内存过程是怎样的,有几种方法在什么范围类可以可以调用外部类的内部类,各有什么优点?




评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
我懂了,谢谢大家,我对这些语法还不熟练,需要练习。
回复 使用道具 举报
1.内部类分为局部内部类(方法中定义的内部类)和成员内部类。成员内部类是一种与field,方法,构造器和初始化块相似的类成员;局部内部类和匿名内部类则不是类成员。成员内部类分为静态内部类和非静态内部类。
2.因为内部类被当成外部类成员,内部类成员可以直接访问外部类的私有数据。但根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
3.在外部类Outer以外创建非静态内部类Inner的对象,
Outer.Inner in = new Outer().new Inner();
在外部类Outer以外创建静态内部类Inner的对象,
Outer.Inner in = new Outer.Inner();

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,静态的内部类创建对象是不需要外部类实例化的。
内部类对象创建形式可以是:
new A.AInClass()
如果单单是内部类创建对象的话就需要外部类就需要实例化了。
就是new A().new AInClass()
而且内部类可以直接访问外部类的所有属性和方法
这是因为内部累持有外部类引用
但是,一旦被static修饰以后,内部类就只能直接访问外部类的静态成员了。
但是你的a不能初始化不是这个原因。
那是因为你用内部类访问a 的时候是通过外部类对象来引用的。
你改变的是外部类对象所引用的那个a
然后你调用打印a的方法的时候却创建了另一个外部类对象
结果当然是0了
但当你用static修饰外部类中的a时
a就会被加载进内存中的共享区
这样一来两个对象引用的a就是共享的了
所以可以打印出1
如果你听不懂我在说什么
你就再好好看看静态修饰符和静态内部类的教程
希望对你有所帮助。。。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 侯宪博 于 2012-7-25 12:48 编辑

额这个。。。
回复 使用道具 举报
1.成员变量加上private就是私有的了,只能在本类范围内访问,一般我们设计类的时候都把实体的属性(成员变量)设为private,再提供公共的getter和setter,这是java里面向对象的一种特性,封装。
2.内部类可以直接访问外部类的方法,因为内部类的实例依赖于外部类实例。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马