• carZycriss
    2019-10-31
    public class myphone {
        public static void main(String[] args) {
            phone xiaomi = new phone();
            zhuban zhuban1 = new zhuban();
            
            xiaomi.price = 1999;

            xiaomi.zhuban.daxiao=1;

            System.out.println(xiaomi.price + xiaomi.zhuban.daxiao.n);
        }
    }
    老师只是我的main方法函数,
    public class zhuban {
        String producer;
        int daxiao;
        int chuchang;
    }
    public class phone {
        zhuban zhuban;
        int price;

    }
    这是另外几个类
    然后报错这样
    Exception in thread "main" java.lang.NullPointerException
        at myphone.main(myphone.java:8)
    我不知道错在哪,请问一下老师。
    展开

    作者回复:

            phone xiaomi = new phone();
            zhuban zhuban1 = new zhuban();

    然后你应该让xiaomi对象的zhuban这个引用指向你新创建出来的对象, 也就是下面这一句:

        xiaomi.zhuban = zhuban1


    P.S. 类名建议按照习惯, 使用首字母大写.

     2
     2
  • 彧豪
    2020-01-14
    public class Storage {
      long capacity;
      String producer;
      String model;
    }

        Storage storage = new Storage();

    emmmm,抱歉老师,我不是太明白,你之前回复我的:"storage对象里只有引用,创建出来时引用没有指向任何对象",那是不是意味着引用还是被创建出来了呢?就是除了storage之外还有它里面的两个String类型的成员变量是吗?总共3个?还是说就只创建了一个对象,就是storage,而它里面的2个String类型的成员变量不算,因为它们并没有被storage.producer = "戴尔"这样赋值,没有指向任何对象呢?求指点
    展开

    作者回复: Storage创建出来了,就像一个本子,挂在公告板上。这个Storage对象里面有三个纸片,分别是存储一个capacity的值,和两个String对象的地址。但是这两个存储String对象地址的纸片上,是空的,没有指向任何实际的String对象。

    
    
  • 彧豪
    2020-01-12
    哈哈哈,谢谢老师!
    以及,仔细看了你的回复,我又有了一个疑问,哈哈,或者是想法吧:

    public class Storage {
      long capacity;
      String producer;
      String model;
    }

        Storage storage = new Storage();


    此时这里,创建了1个对象没有疑问,而引用是不是就是3个了呢?就是创建Storage的实例/对象的时候创建出了3个对象, 就是它里面的非基础类型的成员变量,和后面是否对Storage的成员变量赋值无关了呢?
    展开

    作者回复: Java中除了string对象,所有对象都是new操作符创建出来的。storage对象里只有引用,创建出来时引用没有指向任何对象。

     1
    
  • 彧豪
    2020-01-11
    老师你好,这节课我有这么几个问题:
    1.
        Storage storage = new Storage();
        storage.producer = "Intel";
        storage.capacity = 512;

        Screen screen = new Screen();
        screen.size = 15.6;
        screen.producer = "戴尔";
    这段代码创建了2个对象,那创建了几个引用呢?是4个吗?storage storage.producer screen screen.producer这4个?

    2.
    情形一:
    Phone phone = new Phone();
    phone.price = 1999;

        phone.prePhone = phone;
        phone.prePhone.price = 2999;

        System.out.println(phone.price); //2999.0
        System.out.println(phone.prePhone.price); //2999.0

    情形二:
    Phone phone = new Phone();
    phone.price = 1999;

        phone.prePhone = new Phone();
        phone.prePhone.price = 2999;

        System.out.println(phone.price); //1999.0
        System.out.println(phone.prePhone.price); //2999.0
    两种情形输出的结果不一样,是因为情形一种phone和phone.prePhone都是指向的同一个引用:phone;而情形二中phone是new Phone(), phone.prePhone又是另一个new Phone(),phone和phone.prePhone指向的是两个不同的引用的缘故吗?
    展开

    作者回复: 1)对
    2)对
    你理解的很对,比起我当年理解的快多了,赞👍

    其实这俩问题都和对象创建以及引用指向对象有关。

    1)里面,四个引用分别是代码创建了两个,用来指向对象(指向公告板上的小本子),创建每个对象时,又分别创建了一个,是对象内部的成员变量。

    2)也是一样,情况1只有一个本子(对象),改变price都是在操作同一个本子(对象)的同一张纸(成员变量),情况2是两个本子(对象),每个本子(对象)都有price。

    
    
  • 彧豪
    2020-01-10
    老师,我有个关于String的问题想问你
    1. 如下代码,为何没有输出内容, 直接报错:
    public class MyPhone {
      public static void main(String[] args) {
        String str;
        System.out.println(str); //Error: 可能尚未初始化变量str
      }
    }

    2. 而如下代码却能输出初始值null;
    public class OnlyString {
      String str;
    }
    public class MyPhone {
      public static void main(String[] args) {

        OnlyString oS = new OnlyString();

        System.out.println(oS.str); //null

      }
    }
    3. String数组的初始值也都是null:
    public class MyPhone {
      public static void main(String[] args) {

        String[] strArr = new String[3];

        for (int i = 0; i < strArr.length; i++) {
          System.out.println(strArr[i]); //null null null
        }

      }
    }

    str被创建出来,不是默认初始值是null吗,为何第一种那样会直接报错呢?

    展开

    作者回复: 成员变量的引用类型会被初始化为null,局部变量(方法里创建的变量)不会被初始化,没有初始化就使用的话会有编译错误

    
    
  • 睡觉表演者
    2019-09-04
    赋值string类型的值,算不算创建新对象?

    作者回复:
    准确来说,是用string对象的引用的值,给一个string类型的引用赋值。

    如果是如下这种,是不会创建string对象的:

    String a2 = a1;

    其中a1是另一个string类型的引用。

    如下这种,会创建一个String对象:


    String a1 = “abc”;

    但这个和赋值没有必然关系。过程是先创建一个内容为“abc”的String对象,然后将这个对象的引用作为值,赋值给a1这个String类型的引用。

    
    
我们在线,来聊聊吧