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,一经查实,立即删除!

相关文章

IPython 使用记录

记录使用的一些技巧处理 1 自动重载修改的文件 局部的会话中使用 如果想在当前 ipython 会话中使用&#xff0c;则运行 ipython 后&#xff0c;依次键入下面语句即可 %load_ext autoreload %autoreload 2 全局使用如果想为了懒省事&#xff0c;我希望 IPython 一直会自动重载&a…

有道智能学习灯 初体验

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

视频处理器

http://baike.baidu.com/link?url9Ql-myLXWgFtt8ItgnYe1suvbqU57tivB8WwTVHqNqGWKNQqgvkQ7uqYrw22I44LO-LCmjQuKAk-SGGWV8di4_

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;否则主从…

linux之PHY

一.结构体 1.PHY设备 [cpp]view plaincopy struct phy_device { struct phy_driver *drv; //PHY设备驱动 struct mii_bus *bus; //对应的MII总线 struct device dev; //设备文件 u32 phy_id; //PHY ID enum phy_state state; //PHY状态 …

元器件 失效分析 过程介绍

硬件产品在使用过程中&#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…

Python中正则表达式讲解

正则表达式是匹配字符串的强大武器&#xff0c;它的核心思想是给字符串定义规则&#xff0c;凡是符合规则的字符串就是匹配了&#xff0c;否则就是不合法的。在介绍Python的用法之前&#xff0c;我们先讲解一下正则表达式的规则&#xff0c;然后再介绍在Python中如何运用。 如果…

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

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

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

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

JS小技巧

JS操作伪元素 CSS代码&#xff1a; #myId:before {content: "hello world!";display: block;width: 100px;height: 100px;background: red; } JS 代码&#xff1a; var myIdElement document.getElementById("myId"); var beforeStyle window.getCompute…

流媒体服务器

1 引言   随着互联网的飞速发展,流媒体技术的应用越来越广泛,从网上广播、电影播放到远程教学以及在线的新闻网站等都用到了流媒体技术。但现有公开文献所报道 的大多是利用现有的流媒体服务器来搭建一个流媒体服务系统&#xff0c;或者是针对流媒体数据的编码方式所进行的…

试产机器发现元器件损毁 风险排查过程

产品在试产阶段或者公测阶段&#xff0c;发现有个别机器功能异常&#xff0c;研发定位为个别元器件损坏&#xff1b; 定位过程大致有如下步骤&#xff1a; A-故障现象复现 B-输入输出检查 C-电源及管脚状态测量 D-交叉验证 E-基本外观观察和特性测量 然后将器件邮寄给原…

腾讯面试经验2

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

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

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

CSS 如何设置垂直居中

1、水平居中我们都知道&#xff0c;可以直接用&#xff1a; margin:0 auto; 2、垂直居中&#xff0c;需要做一点小小的计算&#xff0c;关键代码如下&#xff1a; height: 600px; position: absolute; top: 50%; margin-top:-300px; 如需水平且垂直居中&#xff1a; height: 60…

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

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

有名信号量sem_open和内存信号量sem_init创建信号量的区别

有名信号量sem_open和内存信号量sem_init创建信号量的区别 分类&#xff1a; C/C sem_t *sem sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;int sem_init(sem_t *sem,int shared, unsigned int value);区别&#xff1a;1.创建有名信号量必须…