03-类与对象——课后动手动脑

1.早期我们经常这样定义变量

             int value=100;

     前面的示例中这样定义变量

             MyClass obj = new MyClass();

这两种方式定义的变量是一样的吗?

 

这两种方式定义的变量是一样的,因为它们都是类的实例化,只是第一种是一个简便的写法,第二种是正常的对类进行实例化。

 

2.对象变量也可以使用“==”判断两变量值是否相等吗?

当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象,换句话说,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

在Java中要比对两个对象的字段值,可以重写基类的equals()方法。将其改成自己类的一个方法用来调用。

 

3.请输入并运行以下代码,得到什么结果?

public class Test {public static void main(String[] args) {Foo obj1=new Foo();Foo obj2=new Foo();System.out.println(obj1==obj2);}}
class Foo{int value=100;
}

运行结果:

原因:按照第2条,我们可知,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。obj1和obj2虽然都是Foo类型的变量,但其指向的空间或者地址不同,所以输出的是false。

 

4.

请总结一下,这个方法有哪些“与众不同之处”,你能列出几条?

 1.方法名与类名完全相同。

2.无返回值,也没有void关键字。

 

5.以下代码为何无法通过编译?哪儿出错了?

 

原因:在类中如果提供了一个构造函数,那么在进行类的实例化时,调用的就是这个构造函数。此例中,Foo类本身提供了一个有参构造函数,这就导致系统不会提供默认的构造函数,那么定义obj1时就无法调用无参构造函数,所以整个程序当中会出现错误。

 

 6.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

例:

 1 public class InitializeBlockClass {
 2 
 3     {
 4         
 5         field = 200;
 6         
 7     }
 8     
 9     public int field = 100;
10     
11     public InitializeBlockClass(int value){
12         
13         this.field = value;
14         
15     }
16     
17     public InitializeBlockClass(){
18         
19     }
20     
21     public static void main(String[] args) {
22         // TODO Auto-generated method stub
23         InitializeBlockClass obj = new InitializeBlockClass();
24         
25         System.out.println(obj.field);
26         
27         
28         obj = new InitializeBlockClass(300);
29         
30         System.out.println(obj.field);
31         
32     }
33 
34 }

运行结果:

Java字段初始化的规律:

如果有多个不同地方对字段进行初始化,那么该字段的最终取值取决于最后一次初始化。

 

7.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

TestStaticInitializeBlock.java

 1 class Root
 2 {
 3     static{
 4         System.out.println("Root的静态初始化块");
 5     }
 6     {
 7         System.out.println("Root的普通初始化块");
 8     }
 9     public Root()
10     {
11         System.out.println("Root的无参数的构造器");
12     }
13 }
14 class Mid extends Root
15 {
16     static{
17         System.out.println("Mid的静态初始化块");
18     }
19     {
20         System.out.println("Mid的普通初始化块");
21     }
22     public Mid()
23     {
24         System.out.println("Mid的无参数的构造器");
25     }
26     public Mid(String msg)
27     {
28         //通过this调用同一类中重载的构造器
29         this();
30         System.out.println("Mid的带参数构造器,其参数值:" + msg);
31     }
32 }
33 class Leaf extends Mid
34 {
35     static{
36         System.out.println("Leaf的静态初始化块");
37     }
38     {
39         System.out.println("Leaf的普通初始化块");
40     }    
41     public Leaf()
42     {
43         //通过super调用父类中有一个字符串参数的构造器
44         super("Java初始化顺序演示");
45         System.out.println("执行Leaf的构造器");
46     }
47 
48 }
49 
50 public class TestStaticInitializeBlock
51 {
52     public static void main(String[] args) 
53     {
54         new Leaf();
55         
56 
57     }
58 }

执行结果:

“静态初始化块的执行顺序”:

1.静态初始化块只执行一次。

2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

8.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

在静态方法中使用new进行实例化,然后再调用非静态成员。

例:

 1 public class Task {
 2     
 3     public int a = 2;
 4     
 5     static int b = 3;
 6     
 7     static void display()
 8     
 9     {
10         
11         Task t1 = new Task();
12         
13         System.out.println("a="+t1.a);
14         
15     }
16     public static void main(String[] args) {
17         // TODO Auto-generated method stub
18         Task t2 = new Task();
19         
20         t2.display();
21         
22     }
23 
24 }

执行结果:

 

9.请看以下的神奇代码:

public class StrangeIntegerBehavior { 
public static void main(String[] args){Integer i1=100;Integer j1=100;System.out.println(i1==j1);Integer i2=129;Integer j2=129;System.out.println(i2==j2);}}

执行结果:

两对整数明明完全一样,为何一个输出true,一个输出false?

 首先,利用javap对该程序进行反汇编。结果如图:

可以看到其调用了Integer中的valueOf方法,valueOf方法的源代码为:

可以看到,valueOf(int i)调用了IntegerCache.cache,通过网上查找,我得到了它的源代码如下:

 1 private static class IntegerCache {
 2         static final int low = -128;
 3         static final int high;
 4         static final Integer cache[];
 5 
 6         static {
 7             // high value may be configured by property
 8             int h = 127;
 9             String integerCacheHighPropValue =
10                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
11             if (integerCacheHighPropValue != null) {
12                 try {
13                     int i = parseInt(integerCacheHighPropValue);
14                     i = Math.max(i, 127);
15                     // Maximum array size is Integer.MAX_VALUE
16                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
17                 } catch( NumberFormatException nfe) {
18                     // If the property cannot be parsed into an int, ignore it.
19                 }
20             }
21             high = h;
22 
23             cache = new Integer[(high - low) + 1];
24             int j = low;
25             for(int k = 0; k < cache.length; k++)
26                 cache[k] = new Integer(j++);
27 
28             // range [-128, 127] must be interned (JLS7 5.1.7)
29             assert IntegerCache.high >= 127;
30         }
31 
32         private IntegerCache() {}
33     }

通过这两段代码,我们可知,在[-128,127]这个区间中“”==”比较的是这两个数的数值,但当超出这个范围时,其就会创建一个新的对象,对于对象来说,我们是无法通过“==”进行比较的,因为“==”比较的是这两个对象所指向的空间是否相同,所以第二个会输出false。

转载于:https://www.cnblogs.com/guo-xu/p/7688886.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有道智能学习灯 初体验

有道词典笔在业内树立了一个标杆&#xff0c;自认为有道出品必须精品&#xff01; 但是今天刚初步体验了一下有道智能学习灯&#xff0c;硬件方面说实话有点意外&#xff0c;猜测这应该不是有道词典 笔团队打造的硬件产品吧。 现在将个人体验感受表格化陈述如下&#xff1a;…

centos忘记root用户的密码

方法&#xff1a; 1.在开机启动的时候快速按键盘上的“E”键 或者“ESC”键&#xff08;如果做不到精准快速可以在启动前一直按着或者不停的按&#xff09;&#xff0c;会进入如下界面。如果你的有多个操作系统就会出现多个内核&#xff0c;就会出现多个选项 2. 选择你忘记密码…

MySql(18)——Linux MySQL主从配置

MySQL 主从配置 Author:xushuyi 参照技术&#xff1a;http://www.cnblogs.com/kevingrace/p/6256603.html 1. 主从数据库 1、主库&#xff1a;192.168.56.100 2、从库&#xff1a;192.168.56.102 3、创建主从数据库一定要保证主从数据库字符集编码的一致性&#xff0c;否则主从…

元器件 失效分析 过程介绍

硬件产品在使用过程中&#xff0c;常常会出现功能失效的情况。排除装配异常的话&#xff0c;功能失效一般是电路可能出现故障&#xff0c;具体可能是某个元器件损坏了。需要研发及时分析定位故障原因及时改善排除故障&#xff0c;尤其是在试产阶段&#xff0c;显得十分重要&…

OWI

2019独角兽企业重金招聘Python工程师标准>>> V$EVENT_NAME V$EVENT_NAME displays information about wait events. ColumnDatatypeDescriptionEVENT#NUMBERNumber of the wait eventEVENT_IDNUMBERIdentifier of the wait eventNAMEVARCHAR2(64)Name of the wait e…

201521123110《Java程序设计》第5周学习总结

1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点。 2. 书面作业 1.代码阅读&#xff1a;Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误&#xff1f;试改正该错误。并分析输出结果。不能编译通过,因为System.out.println…

电源适配器上各符号的意义都清楚吗?

现在家里的电子产品是越来越多了&#xff0c;比如&#xff1a;手机、平板、笔记本、智能电视、智能音箱、路由器、剃须刀等&#xff1b;机身或者充电器上都有很多符号标志。 有没有好奇过或者被小孩询问过&#xff0c;这些符号标志都是什么意思呢&#xff1f;只有读懂这些符号…

苏宁海量服务器自动化配置运维实践

运维的演进 人力运维阶段 在IT产业的早期&#xff0c;服务器运维是通过各种Ad Hoc命令或者Shell脚本来完成基础设施的自动化工作&#xff0c;这种方式对于简单&#xff0c;一次性的工作很方便&#xff0c;但是对于复杂和长期的项目&#xff0c;后期的脚本维护非常麻烦。自动化工…

腾讯面试经验2

时间&#xff1a;2017年10月16日11:30面试。 地点&#xff1a;重庆万达艾美酒店。 信息&#xff1a;女&#xff0c;本科应届生&#xff0c;面试后台开发岗位。 在深圳的面试已经全部结束了&#xff0c;偶然间听朋友说重庆、长沙等场地的面试还在进行中&#xff0c;只要修改面试…

简易有效Api接口防攻击策略

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。 简单…

被称为海淀妈妈四大神器之一的倾听者K3 硬件拆解

暑假期间发现很多博主都在推荐倾听者K3&#xff0c;被海淀妈妈们称为四大神器之一&#xff0c; 虽然暂没听说其他三大神器是什么&#xff0c;作为教育硬件爱好者还是决定先整个回来拆拆看。 在京东上搜到倾听者K3版本一共有三种颜色&#xff0c;分别是蓝色&#xff08;悟空蓝&…

dds设计信号发生器

高一 150206101 Dds数字信号发生器设计方案 DDS的工作原理框图如下 在微机内&#xff0c;若插入一块D/A转换卡&#xff0c;然后编制一段小程序&#xff0c;如连续进行加一运算到一定值&#xff0c;然后连续进行减一 运算回到原值&#xff0c;在反复运行该程序&#xff0c;则微机…

Maven--资源文件resource的问题

2019独角兽企业重金招聘Python工程师标准>>> Maven项目的目录有&#xff1a; src/java/main src/java/resource src/test/main src/test/resource 有的时候在resource目录下添加文件却不能加载出来&#xff0c;解决的办法是从把添加的资源文件添加到properties---&g…

以太网自动协商原理

自协商基本原理 自动协商模式是端口根据另一端设备的连接速度和双工模式&#xff0c;自动把它的速度调节到最高的公共水平&#xff0c;即线路两端能具有的最快速度和双工模式。 自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端&#xff0c;并接受…

mac与phy如何实现网络自适应

这两天修改网卡驱动以实现10/100/1000M自适应&#xff0c;因此研究了下phy芯片和emac驱动如何兼容10/100/1000M网络环境&#xff0c;记录在此。 网络中设备端数据链路层由mac芯片和phy芯片组成&#xff0c;phy芯片根据外部网络环境完成自动协商以及配置&#xff0c;驱动中根据p…

LVM逻辑卷详解及创建

我们先来看一下这张图片&#xff1a;PV: 底层的一个硬盘设备&#xff0c;可以是一个分区&#xff0c;也可能是一个RAID。我们可以把这个块设备创建成一个物理卷格式&#xff0c;即一个PV。VG: 将一个或多个PV提供的存储空间在一个更低的单位上划分成一个个独立的存储单元&#…

ITU-RBT.656视频标准接口

601是SDTV的数据结构 656是SDTV的interface 709是HDTV的数据结构 1120是HDTV的interface ITU-R BT.601是演播室数字电视编码参数标准&#xff0c;而ITU-R BT.656 则是ITU-R BT.601附件A中的数字接口标准&#xff0c; 用于主要数字视频设备(包括芯片)之间采用27Mhzs并口或243Mb…

C语言博客作业03--函数

1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 本周学习了函数&#xff0c;其实&#xff0c;函数于之前学习的三大控制结构是密不可分的&#xff0c;而函数又有其特殊的地方&#xff0c;例如&#xff1a;函数的声明、函数的调用等等。我们之前编写…

Insta360:从软到硬,一年做出360°全景相机,中间填了多少坑?

摘要刘靖康在大学就开始创业。在大二的时候他曾经去腾讯实习&#xff0c;然后又去了“超级课程表”这个团队实习半年&#xff0c;2013 年 9 月回到南京创业&#xff0c;一开始的产品叫“名校直播”&#xff0c;是一款围绕院校名师讲座所做的视频直播产品。 不久前&#xff0c;一…

No.10 awk、变量、运算符、if多分支

awk、变量、运算符、if多分支 awk语法 ~ awk -F: {print $3,$4} /etc/passwd //-F指定:分隔符 默认以空格作为分隔符 ~ awk -F: {print &0,NF} //$0打印全部,NF有几段内容 ~ awk -F: {print $NF} /etc/passwd //$NF打印最后一段内容 ~ awk -F: {print NR} /etc/passwd…