c#中如下:
using System;
class A
{
void qq()
{
B b=new B();
b.age=33;//失败
}
public static void Main(string[]args)
{
}
}
class B:A
{
protected int age=22;
}----------------------------------------------------------------------]
java中:
class A
{
void qq()
{
B b=new B();
b.age=33;//成功
}
public static void main(String[]args)
{
System.out.println("success");
}
}
class B extends A
{
protected int age=22;
}想请问一下,此时两种语言的运行机制.

解决方案 »

  1.   

    java如果能成功,说明java有缺陷
    基类根本就不应该知道派生类的存在
    在基类中使用派生类,逻辑混乱!
      

  2.   

    LZ啊,你到底想说什么?我到现在也没找到age的声明……编译都通不过的代码,你要说明什么?
      

  3.   

    一个人怎么可能一会有缺陷一会没有呢/
    听说java 和 c#的开发工程师是一个人啊.
      

  4.   

    回复:
    LZ啊,你到底想说什么?我到现在也没找到age的声明……编译都通不过的代码,你要说明什么?C#当中的age是在子类(b)中声明的,C#编译当然通不过,
    java中可以通过,希望你测试一下.谢谢你
      

  5.   

    终于看明白了,原来是指protected关键字。刚才眼花了……很正常,C#明确的说protected修饰的成员只有本类和派生类能够访问。事实上这也是protected的含义,并不是指继承链上的类都能访问。在基类里面出现派生类的代码是很危险的事情,尤其是在构造函数中。
      

  6.   

    首先,这是个死循环。
    其次,这说明Java的语法有缺陷……
      

  7.   

    谢谢楼上的朋友们的回答,也就是说java中虽然能通过,但是这样做并不合理对吗?不过还是请有java运行环境的朋友帮我调试一下,是否真的能通过,我这边测试的可以通过另外特别感谢"Ivony(授人以鱼不如授人以渔,上海谋生) ( ) 信誉:100 "
      

  8.   

    protected限制了基类访问它的功能,应该改为public.
    不过建意不要写这样的程序,没有意义。
      

  9.   

    本帖最后由 webwalker 于 2008-06-05 17:38:40 编辑
      

  10.   

    建议说楼主胡说八道的还是了解一下java先.net的protected变量在父类是不能访问的,只能在自身或者子类中访问而java中如果两个类在同一个包内的话,protected变量是可以被访问的,并不是缺陷,跟c#的internal差不多
      

  11.   

    本帖最后由 webwalker 于 2008-06-05 17:38:50 编辑
      

  12.   

    基类根本就不应该知道派生类的存在
    因此基类访问不了派生类的属性 但反之即可(除了 private )
      

  13.   

    xwk789xwk() 
    我说你能不能嘴巴干净点
      

  14.   

    ls的讲的好像有点道理
    我似乎也有这个印象,两者的protected不一样
      

  15.   

    shalen520(Love will keep us alive) 而java中如果两个类在同一个包内的话,protected变量是可以被访问的,并不是缺陷,跟c#的internal差不多=============================================================================真的?
      

  16.   

    yaoshuwen() ( ) 信誉:100  2007-07-25 11:47:56  得分: 0  
     
     
       父亲有先天心脏病,儿子也有可能有。但是儿子有先天心脏病不能说父亲一定也有先天心脏病 呵呵~~
    ================================================================================
    错了,儿子有的话父亲一定有,遗传基因Y的问题!
     -----------------------------------------------
    不对吧,心脏病不一定是由性染色体携带吧?
     
      

  17.   

    protected在c#中表示只有自己或者自己的子类可以访问,自己的父类不能访问~~~protected在java中好像表示的是同一个包内可以访问就这么简单...
      

  18.   

    A是B的父类,A又要定义、调用子类中的成员。逻辑错误!
      

  19.   

    1.
    听说java 和 c#的开发工程师是一个人啊.
    ================
    哪个说的?也不知道 “开发工程师” 指的什么?James Gosling 认识不? Anders Hejlsberg 认识不?要是把 C# 和 Dephi 摆在一起还情有可原
    2.
    LZ 还没有了解 java 基本知识?事实上, Java 中的 protected 修饰符成员,对于所有子类以及同一个包内的所有其他类都是可见的。我看到这里的时候,我几乎崩溃了,多么好的 Java ,不知为何 James 他们要如此设计?
    我没有多少 java 的实践经验,体会不到如此设计的好处。所以,一直持“简单就是美” 的 Anders Hejlsberg 保留了 protected 在 C++ 中原始语义,并增加了 internal 修饰符,internal 表示程序集内可见,而且可以组合 protected internal 
    表示访问仅限于从包含类派生的当前程序集或类型。
      

  20.   

    事实上, Java 中的 protected 修饰符成员,对于所有子类以及同一个包内的所有其他类都是可见的。我看到这里的时候,我几乎崩溃了,多么好的 Java ,不知为何 James 他们要如此设计?
    我没有多少 java 的实践经验,体会不到如此设计的好处。
    我觉得这是胡说八道,当然这需要Java的人出来解释下。
    我的印象中,Java中有四种访问权限:public和private是不用说了,与C++/C#语义相同,protected是指派生类能访问,而同一个包内能访问是啥都不写,没有访问修饰符。等同于C#的internal。
      

  21.   

    nod
    至少我用java的时候protected还是指派生类能访问的。
      

  22.   

    不用争了吧,java的protected就是同一个包内可访问的偶java和.net都做,已经验证过,编译是没有问题的(jdk 1.3,1.4,1.5)
      

  23.   

    1. C#和Java父类构造函数都可以访问子类public虚函数,这一点和C++不同...2. C#父类不能访问子类protected,而Java可以.
      

  24.   

    java我还懂一点   C#我就不是很懂了  这个是类中类的问题 子类可以访问父类中的方法和成员函数     只是随便说说不要扔我
      

  25.   

    Java下protected果然是包内可见的。
    感觉java的语法有点奇怪……
      

  26.   

    2. C#父类不能访问子类protected,而Java可以.==================================
    这句有误,lz的例子里父类可以访问子类的protected成员是因为在同一个包里,而由于java奇怪的语法同一个包里是可以访问protected成员的……
      

  27.   

    TO Ivony(授人以鱼不如授人以渔,上海谋生)   
     
    我觉得这是胡说八道,当然这需要Java的人出来解释下。我的印象中,Java中有四种访问权限:public和private是不用说了,与C++/C#语义相同,protected是指派生类能访问,而同一个包内能访问是啥都不写,没有访问修饰符。等同于C#的internal。=======================================================
    我觉得你这种上来就居高临下的姿态需要改一改,你自己也只是一个印象,就开口一句“这是胡说八道”,实在令人有些生厌 
      

  28.   

    shrinerain(圣影雨) ( ) 信誉:100  2007-7-26 10:32:30  得分: 0  
    1. C#和Java父类构造函数都可以访问子类public虚函数,这一点和C++不同...
    ========================
    如果是虚函数的话,C++似乎也可以的吧  
     
      

  29.   

    java如果能成功,说明java有缺陷
    基类根本就不应该知道派生类的存在
    在基类中使用派生类,逻辑混乱!------------------------------------------------------------------------------------
    完全同意。
      

  30.   

    1. C#和Java父类构造函数都可以访问子类public虚函数,这一点和C++不同...
    构造函数……C#和Java的对象构造是不同的。
      

  31.   

    我觉得你这种上来就居高临下的姿态需要改一改,你自己也只是一个印象,就开口一句“这是胡说八道”,实在令人有些生厌
    即使是protected包内可访问,我也有极大的把握是包内或者派生类能访问,等同于C#的protected internal,而不是internal。看不惯某些人,实际上我都有把握直接说:肯定不是那样的,只是我没有Java环境来测试而已。
      

  32.   

    对于别人的“ Java 中的 protected 修饰符成员,对于所有子类以及同一个包内的所有其他类都是可见的。”
    Ivony 你来一句“我觉得这是胡说八道,当然这需要Java的人出来解释下。”请问,你说的“我也有极大的把握是包内或者派生类能访问”,难道和“对于所有子类以及同一个包内的所有其他类都是可见的。”这句有很大区别吗?
    是不是也是说你自己的说法,也是“胡说八道”?自己没有看仔细,就想当然,难道不是“居高临下的姿态”?
    更何况,一上来,对着lz的问题,也是一句“楼主你再胡说八道这贴就水了……”,可再一看问题,只能说一句“终于看明白了,原来是指protected关键字。刚才眼花了……”来下台阶我也不是想针对你干吗,只是提醒你一下罢了,用个“居高临下的姿态”并不算侮辱你吧