黑马程序员技术交流社区

标题: 为啥会报错啊???? [打印本页]

作者: 403383221    时间: 2012-11-15 21:01
标题: 为啥会报错啊????
public class p {
        Strin  a ;
        a =new Strin();
}
Strin类已经建好了, 这样写不是等价于 Strin a  = new Strin();吗?为啥不加主函数会报错?直接写Strin a  = new Strin();又不会报错?



作者: 聽聽我dē❤    时间: 2012-11-15 21:05
这是什么写法啊???  是
String
作者: 李栋梁    时间: 2012-11-15 21:12
你把a = new Strin();这句话放入一个方法中去,就不会有错了,你见过在类里面new出对象的吗?
作者: 403383221    时间: 2012-11-15 21:37
有Strin类。。。这问题感觉挺无聊的   同学问的    我不知道为啥才发这帖子的

作者: 许坤    时间: 2012-11-15 21:41
楼主是说笑话么,Strin是什么,你是想声明String 字符串么。 要是的话那就是String a="..";
作者: 王玮    时间: 2012-11-15 21:45
还真是这么回事。分开写,报语法错误,在编译期间就不会通过。在一个类中,有方法和属性,没见过 a=new A();类似的情况发生的。

Strin a  = new Strin();  这表示 a 是p类的一部分
后者的 Strin a;可以当做是属性的话,就要用方法给他初始化。像 a=new Strin();这种是不能存在的。

作者: 程宏志    时间: 2012-11-15 21:45
本帖最后由 程宏志 于 2012-11-15 21:56 编辑

  Strin  a ;
  a =new Strin();
这样写当然会出错啊!
因为String a;这是建立一个引用对象;
而new String();是创建一个新的对象并不是指向上面的那个a的,这样的就是你建立了两个对象。
这里知识点,涉及到引用型数据在内存之中对象的建立的问题了!在这里,说明白一点,只要用到new关键字,就是创建一个新对象!

打个比方:int [] arr;
              arr=new int[];
同样这也是两个对象,并不是指向同一个arr的。

作者: 403383221    时间: 2012-11-15 21:49
Strin不是String类 ....是一个已经写好的类,他的想法是生成一个Strin类的对象昂。。。。
作者: 葛旭东    时间: 2012-11-15 21:57
类里的成员是变量、方法、构造方法、代码块。

Strin  a;//可以看做是变量

a  = new Strin();//是赋值语句,不能直接在类中出现,放在方法或者代码块里就可以了
作者: 程宏志    时间: 2012-11-15 22:08
403383221 发表于 2012-11-15 21:49
Strin不是String类 ....是一个已经写好的类,他的想法是生成一个Strin类的对象昂。。。。  ...


你是说对象是吧,在java中数据类型分两种,一种是基本数据类型,一种是引用数据类型,基本数据类型只是在栈内存运行的,而引用数据类型就不同了,它是在堆和栈中运行的,它的引用对象是在栈里面,而实例对象确实在堆中的,两者之间的关系是通过地址值来联系的。同样类也是一种引用型数据。
  Strin a;这句话表明你在栈内存中建立了一个引用对象;
而 a=new Strin(),这句话表明,你在栈内存中建立了一个引用对象是a(这个a和上面的一个a是不同的),而new Strin()表面在堆内存中实例化了一个对象,然后通过地址值传给了a,这时因为在栈内存中有两个引用对象a,这时传地址值时会再栈内存中出现紊乱,因为两个同名,不知传给那一个,会造成错误。自然就会运行出错了
作者: 王玮    时间: 2012-11-15 22:09
程宏志 发表于 2012-11-15 21:45
Strin  a ;
  a =new Strin();
这样写当然会出错啊!

那程同学啊~第一,他说的是他自己定义的Strin类
第二,假如按String理解的话,String a 是声明String类型的引用,当new String()的时候才建立了String类型的对象,并且把 对内存地址赋给a。即不是两个对象。这是我的理解哈·--·
作者: 陈莹    时间: 2012-11-15 22:12
类中只能出现属性和方法吧,赋值语句执行在方法中.....
作者: 陈莹    时间: 2012-11-15 22:12
类中只能出现属性和方法吧,赋值语句执行在方法中.....
作者: 程宏志    时间: 2012-11-15 22:14
iacky2 发表于 2012-11-15 22:09
那程同学啊~第一,他说的是他自己定义的Strin类
第二,假如按String理解的话,String a 是声明String类型 ...

引用数据在内存中,是先在栈内存中建立引用对象的,然后才会在堆内存中创建实例对象的,而不是先有实例而对象后有引用对象的,这个不要弄反了
作者: 崔维友    时间: 2012-11-15 22:22
不知道能否贴出全代码?我测试的
Show s;s=new Show();
可以通过,不知道你的主函数里怎么写的。
  1. class Show
  2. {
  3.         public void show()
  4.         {
  5.                 System.out.println("Show time !");
  6.         }
  7. }

  8. class ExtendsTest
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 Show s;
  13.                 s=new Show();
  14.                 s.show();
  15.         }
  16. }
复制代码






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