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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 荣右铭 中级黑马   /  2013-10-7 19:10  /  6300 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 荣右铭 于 2013-10-8 20:07 编辑

有些类型的变量可以可以用不用new声明:

public static struct Node{
int age;
string name;
}
Node aaa;
或者
Node aaa=new Node();


请问这两种写法有什么区别?

10 个回复

倒序浏览
new操作符暗示一个类实例的创建,但不一定必须暗示动态内存分配,这和C++中对指针的操作不同。
回复 使用道具 举报
本帖最后由 七里香 于 2013-10-7 19:41 编辑

你的静态成员能够new么?
回复 使用道具 举报
有什么区别不太懂哦,看看高手们怎么回答~~
回复 使用道具 举报
本帖最后由 Always. 于 2013-10-7 21:00 编辑

我的想法是这样的:
new这个关键字是产生一个对象的意思,当我们的方法有加static的时候,就必须把类实例化,也就是要用new,然后通过实例名.方法名()调用这个方法,而有了static,是不需要new的,只需要通过类名.方法名()来调用。
而且:静态成员中,绝对不允许出现非静态的成员。并且在调用的时候,不能创建静态类的对象,只能使用类名.静态成员名;

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1 很给力!

查看全部评分

回复 使用道具 举报
Always. 发表于 2013-10-7 20:29
我的想法是这样的:
new这个关键字是产生一个对象的意思,当我们的方法有加static的时候,就必须把类实例化 ...

明明是结构,你偏要说成是类,是不是面向对象学多了转不过弯来了啊{:soso_e101:}
回复 使用道具 举报
七里香 发表于 2013-10-7 20:55
明明是结构,你偏要说成是类,是不是面向对象学多了转不过弯来了啊 ...

我看错了,好么。我错了。。。求罚
回复 使用道具 举报
leayon 中级黑马 2013-10-7 21:06:35
8#
结构变量使用的时候,可以new,也可以不new,没有啥区别。但你在前面加个静态修饰就没见过了。
回复 使用道具 举报
本帖最后由 张林杰 于 2013-10-7 23:03 编辑
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             test t1;
  6.             t1.x = 1;
  7.             //t1.y = 2;//不能调用y,因为y访问级别为private
  8.             //以上x,y都为结构的字段
  9.             //t1.Z = 4;//错误提示:使用了未赋值的局部变量“t1”:原因:结构不能对属性赋值        
  10.             test t2 = new test();
  11.             t2.x = 2;
  12.             t2.Z = 3;//此处没有错误,new之后的对象可以访问属性
  13.             Console.WriteLine(t2.Z);//输出3
  14.             Console.ReadKey();
  15.         }
  16.     }

  17.     struct test
  18.     {
  19.         public int x;
  20.         int y;
  21.         //声明一个自动属性Z
  22.         int z;
  23.         public int Z
  24.         {
  25.             get;
  26.             set;
  27.         }
  28.     }
复制代码
(上面是个小例子)
这个问题我也研究过,我的理解是:
第一方面:首先讲下new 的作用:1:在内存的堆中开辟内存空间2:在开辟的堆中创建对象3:调用对象的构造函数进行初始化 这三步骤(注意:这三部只针对类)
第二方面:对于结构来说,结构是值类型的,而类是引用类型的,这点很重要,值类型是在内存的栈中开辟空间,而类是在内存的堆中开辟内存空间,所以说不能把结构和类相提并论..因为类型不一样.
第三方面:Node aaa;如此声明,相当于在栈中开辟空间,但没有对字段进行初始化(我认为:结构对属性赋值前必须对所有字段赋值).Node aaa=new Node();如此声明,也是在栈中开辟空间,调用默认无参构造函数(结构中没写而已),对字段进行了初始化。当然你自己也可以重载构造函数,但你写的这个构造函数必须是全参的构造函数,并且构造函数中必须给结构中的所有字段赋值,且不能给属性赋值(这个针对没有new的,若new了可以调用对象对属性赋值)(而类的构造函数中既可以给字段赋值,又可以给属性赋值),不知道有没有说错了,请指点。。(最后,结构不能static修饰吧..不能编译啊)
              
回复 使用道具 举报
本帖最后由 夏闯富 于 2013-10-8 09:57 编辑

补全应该是这样的
public static struct Node{
public Node(){};//无参的构造函数,这句代码是自动隐藏的
public Node(int Age,string Name){this.age=Age;this.name=Name};//如果加上个有参数的构造函数
int age;
string name;
}
Node aaa;//在栈中开辟Node 型的单元空间,没有对字段进行初始化,相当于aaa=NUll
aaa=new Node()//实例化Node(就是给aaa赋值  等效于aaa!=NULL),调用的是无参的构造函数实例化对象
两步合为一步Node aaa=new Node();
按正常的逻辑   输出console.WriteLine("姓名:"+aaa.name+"  "+"年龄:"+aaa.age)的结果应该是  姓名:(不显示任何内容,显示为空) 年龄:(不显示任何内容,显示为空) 。但实际上,struct是不能这么(调用无参的构造函数)实例化对象的,因为struct是值类型而不是引用类型!程序会报错!
Node bbb;
bbb=new Node(34,"周杰伦");//调用有参数的构造函数实例化对象
两步合为一步:Node aaa=new Node(34,"周杰伦");
输出console.WriteLine("姓名:"+bbb.name+"  "+"年龄:"+bbb.age)的结果是  姓名:周杰伦 年龄:34
回复 使用道具 举报
静态类不可以new哇!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马