3类与对象

 一、java字段初始化规律

如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?根据下面代码结果,总结java字段初始化规律。

复制代码
 1 package opinion;
 2 public class InitializeBlockDemo {
 3        /**
 4         * @param args
 5         */
 6        public static void main(String[] args) {
 7              
 8              InitializeBlockClass obj=new InitializeBlockClass();
 9              System.out.println(obj.field);//100
10              
11              obj=new InitializeBlockClass(300);
12              System.out.println(obj.field);//300
13        }
14 }
15 class InitializeBlockClass{
16        //下面这句在初始化块之前与之后,会影响到field字段的初始值
17        //public int field=100;
18        
19        {
20            field=200;
21        }
22        public int field=100;
23        public InitializeBlockClass(int value){
24              this.field=value;
25        }
26        public InitializeBlockClass(){
27              
28        }
29 }
复制代码

结果截图:

类的初始化块:可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。类的这种“没有名字”的“成员”,多用于初始化类的字段。{value=100;}即为初始化块
100即InitializeBlockClass类中当public int field在初始化块filed=200之后的值100,若在初始化块之前,则输出的值为filed=200;300即为构造方法输出的值。
1执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
2执行类的构造函数。
注:类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
 
 
二、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
复制代码
 1 package opinion;
 2 public class Interet {
 3 int age=0;//实例成员
 4 static String name="sherry";//静态成员
 5 static void create()
 6 {
 7        System.out.println("实例成员"+new Interet().age);
 8         //在静态方法中访问类的实例变量需首先进行类的实例化
 9        System.out.println("静态成员"+name);
10        //在静态方法中可直接访问类的静态变量 推荐使用类名来直接访问静态字段
11 }
12 public static void main(String[]args)
13 {
14        Interet.create();
15        }
16 }
复制代码

结果截图:

三、

 

如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
(本题则无new Foo()无参构造函数)
四、查看以下代码,两对整数明明完全一样,为何一个输出true,一个输出false?
复制代码
 1 public class StrangeIntegerBehavior
 2 {
 3     
 4        public static void main(String[] args)
 5        {
 6         
 7              Integer i1=127;
 8        
 9              Integer j1=127;
10         
11              System.out.println(i1==j1);//true
12         //调用Integer.valueOf(),它的范围为-128~127
13              Integer i2=139;
14         
15              Integer j2=139;
16         
17              System.out.println(i2==j2);//false
18        }
复制代码

提示: 使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。

经查验,发现其调用Integer.valueof(),其范围为-128~127,即超出有效范围,无法正常比较。

 

 

 

 

posted @   天明宝  阅读(154)  评论(0编辑  收藏  举报
编辑推荐:
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
阅读排行:
· 我干了两个月的大项目,开源了!
· 千万级的大表,如何做性能调优?
· 推荐一款非常好用的在线 SSH 管理工具
· 盘点!HelloGitHub 年度热门开源项目
· Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,
点击右上角即可分享
微信分享提示