2-16中的疑问及资料问题

2-16中的疑问及资料问题

three和four指向的是相同的实例地址,有没有方法改变three指向实例里面的属性(int)而不是指向新的实例?four是否也就改变了?资料里面各个类中的方法的返回值类型是不是有错误?http://img1.sycdn.imooc.com//climg/5d257ae60001693b07180398.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,


1、理解正确。

2、首先源码是不能被修改的。所以,不管是Object类,Integer类的toString方法都不能被修改。

其次,Integer的实例输出时,会自动调用Integer对象重写后的toString方法,将数字转化为字符串进行输出。


同学现在可以看懂源码是很棒的哦~但是在现阶段,Java的知识还没有完全学习完,不建议同学根据源码中的每一个细节进行学习的呢~


建议同学将就业班的课程学习完毕,回过头来看源码,就会发现很多东西可以融会贯通了呢~

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~


提问者 大大鱼pzy 2019-07-10 20:14:48

问题1:2-16课件大概在9分00秒到10分15秒讲到:four是由于three的存在,所以指向了three新实例化的实例,而hree是新构建一个实例对象(老师的原话是:100肯定不在所以会在缓存区构建一个)。但是在源码中调用valueOf方法的时候其实已经有了Integer的数组cache,且cache是静态代码块中的,所以在类加载的时候已经产生并赋值,所以应该是three和four都指向一个已经构建的实例,而不是three第一次构建。不知道理解对不对?

http://img1.sycdn.imooc.com//climg/5d25d5030001d94f08560234.jpg

http://img1.sycdn.imooc.com//climg/5d25d5030001f57910670696.jpg

问题2:Integer   a=new Integer(1);我想输出a的位置信息,但是Integer里重写了父类Object的toString方法,本想把Integer里的toString方法注释掉,可是发现不能编辑,且并不能通过创建Integer的子类重写toString方法,所以想问对于Integer的实例如何调用父类Object里的toString方法?或者是输出位置信息?

好帮手慕小班 2019-07-10 19:19:47

        同学你好,1、Integer a=1;-->是在缓存区直接创建1的对象

http://img1.sycdn.imooc.com//climg/5d25c3d000019ad105860303.jpg

而 a=2;-->判断缓存区是否有2的对象 有会直接指向2的对象

同学所说的Cat cat=new Cat();cat.age=1;  age是Cat对象的属性,但是Integer中的属性,都是用final修饰的,例如

http://img1.sycdn.imooc.com//climg/5d25c4dc000181a410140609.jpg

同学所说的修改对象的成员属性是不可以的哦!

2、怎样查看Integer的源代码?

(1)、同学可以在Eclipse中的一个类中写一个Integer,然后按住Ctrl鼠标指上它,然后单击,就可以进入它的源码哦!

(2)、但是如果出现的是如下的界面,就是同学没有配置源码信息哦,可以参考如下步骤配置

http://img1.sycdn.imooc.com//climg/5d25c6720001682003010118.jpg

    1)、点击Edit Source

    2)、在此对话框下,选择”External location“,可以看到你的Path路径是空的,点击右边External File...

http://img1.sycdn.imooc.com//climg/5d25c6b600010c5d05990328.jpg

    3)、找到路径为安装java JDK时的路径,关键是在此路径下,找到src.zip,就行了

http://img1.sycdn.imooc.com//climg/5d25c6d900015b1009560537.jpg

    4)、点击OK就可以看到文件源代码就可以出来了。

3、子类实例怎么调用已经重写过的父类的方法?

public class Animal {
    private String name;	 
    public void play(){
        System.out.println("我是父类的方法");
    }
    public Animal(String name) {
        super();
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
public class Cat extends Animal {	 
    public Cat(String name) {
        super(name);
        this.setName(name);
    }
 
    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("小猫"+this.getName()+"在做游戏!");
    }
}

http://img1.sycdn.imooc.com//climg/5d25c9a600014ac106670348.jpg

new  Cat(),就是创建一个Cat类的对象,通过父类Animal类型来接收,在调用方法时,就会调用子类中的play方法!

        如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 大大鱼pzy #1
    谢谢老师耐心的答疑,第二个问题已经解决,很好用。另外两个问题我重新表达下
    2019-07-10 19:42:30
好帮手慕阿莹 2019-07-10 16:35:05

1、首先,非常抱歉,没有明白同学的“有没有方法改变three指向实例里面的属性(int)而不是指向新的实例?four是否也就改变了?”这句话的意思。

同学说的是这个意思吗?

http://img1.sycdn.imooc.com//climg/5d259df90001040416360213.jpg

这个three即使被赋值为int(100),也会自动封装为Intger的。所以,如果是相同的值,

因为这里并没有把three赋值给four,four是从常量池中取的这个100,所以four会改变。

如果不是,同学可以举例说明一下吗?

2、是的,给同学带来不好的学习体验我们感到非常抱歉,老师会告知工作人员去修改一下。

http://img1.sycdn.imooc.com//climg/5d259d160001c21c04820149.jpg



如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 提问者 大大鱼pzy #1
    老师您好,例如Integer a=1;a=2;上面两个语句只是表示引用的实例对象发生了改变,能不能像Cat cat=new Cat();cat.age=1;这样,改变实例里面的属性而不是改变指向的地址?第二个问题是怎么查看Integer的源代码(除了debug的时候查看)?第三个问题是子类实例怎么调用已经重新过的父类的方法?
    2019-07-10 17:00:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师