1.默认构造方法与自定义的构造方法的冲突

  1. package com.xu;
  2. class fool
  3. {
  4. int value;
  5. fool(int nowvalue)
  6. {
  7. value=nowvalue;
  8. }
  9. }
  10. public class hello {
  11.  
  12. public static void main(String[] args) {
  13. // TODO Auto-generated method stub
  14. fool f=new fool();
  15.  
  16. }
  17.  
  18. }

可他为什么会报错呢?

原因是:假如不去自定义构造函数方法,java编译器在编译时会自动提供一个没有参数的“默认构造方法”,上述代码即可成立

然而,如果你自己定义了一个构造方法,将导致系统不再提供默认的构造方法,因此会报错,报错原因是你没有初始化的时候传入参数。

2.java初始化的先后顺序

  1. package com.xu;
  2. public class hello {
  3. hello()
  4. {
  5. System.out.println("调用无参构造");
  6. }
  7.  
  8. hello(int nowvalue)
  9. {
  10. this.value=nowvalue;
  11. System.out.println("调用有参构造");
  12. }
  13.  
  14. {
  15. value=900;
  16. System.out.println("999");
  17. }
  18.  
  19. public int value=200;
  20.  
  21. public static void main(String[] args) {
  22. // TODO Auto-generated method stub
  23. hello h1=new hello();
  24. System.out.println("无参构造的输出为:"+h1.value);
  25.  
  26. hello h2=new hello(1000);
  27. System.out.println("有参构造的输出为:"+h2.value);
  28.  
  29. }
  30.  
  31. }

输出为:

999
调用无参构造
无参构造的输出为:200
999
调用有参构造
有参构造的输出为:1000

在初始化块和数据的指定值之间的执行数序是:谁在前就先执行谁

对于构造函数在他们之后执行。

3.静态初始化块的执行顺序

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

输出为:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

在构造子类对象时,会先构造父类对象,静态初始化块优先执行,其次是父类的非静态初始化块,父类的构造函数,然后是子类的非静态初始化块,子类的构造函数。

4.在静态方法中访问非静态成员和方法

我们都知道在静态方法中不能直接访问非静态的成员及方法

那么,我们就真的不能吗?

当然也可以,我们可以在静态方法中实例化包含非静态方法的类的对象。这样通过对象就可以间接的访问非静态方法和数据

  1. package com.xu;
  2. public class hello {
  3. public int value=0;
  4.  
  5. public int getValue() {
  6. return value;
  7. }
  8.  
  9. public void setValue(int value) {
  10. this.value = value;
  11. }
  12. //静态方法中调用非静态的成员及方法
  13. static void f()
  14. {
  15. hello s=new hello();
  16. System.out.println(s.getValue());
  17. int k=10;
  18. s.setValue(k);
  19. System.out.println(s.getValue());
  20. }
  21.  
  22. public static void main(String[] args) {
  23. // TODO Auto-generated method stub
  24. f();
  25. }
  26.  
  27. }

输出:

0

10

5.诡异的Integer

  1. public class StrangeIntegerBehavior
  2. {
  3.  
  4. public static void main(String[] args)
  5. {
  6.  
  7. Integer i1=100;
  8.  
  9. Integer j1=100;
  10.  
  11. System.out.println(i1==j1);
  12.  
  13. Integer i2=129;
  14.  
  15. Integer j2=129;
  16.  
  17. System.out.println(i2==j2);
  18.  
  19. }
  20.  
  21. }

输出:

true
false

为什么第二个会是false呢?

java在编译Integer x = yyy ;时,会翻译成为Integer x = Integer.valueOf(yyy)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。如果超过128就会重新new一个新对象。

所以i2和j2都是重新new的对象,故他们的地址不同,输出为false。

而i1和j1都是缓存过的,用的时候直接提取出来即可,因而他们的地址是一样的。

课后作业

1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可向他查询生成多少个对象

  1. package com.xu;
  2. public class hello {
  3. static int num=0;
  4. hello()
  5. {
  6. num++;
  7. System.out.println("已创建"+num+"个对象");
  8. }
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. hello h1=new hello();
  12. hello h2=new hello();
  13. hello h3=new hello();
  14. System.out.println("一共创建了"+num+"个对象");
  15. }
  16.  
  17. }

输出:

已创建1个对象
已创建2个对象
已创建3个对象
一共创建了3个对象

JAVA之类的动手动脑的更多相关文章

  1. JAVA 数组作业——动手动脑以及课后实验性问题

    JAVA课后作业——动手动脑 一:阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 1.源代码 // PassArray.java // ...

  2. java学习——关于java课件上动手动脑问题简单的分析

    问题一:关于以下的代码为什么会产生错误的问题的简单分析. 第一个动手动脑提供了一下的代码,可以发现,在Foo的这个类中只定义了一个Foo(int)类型的构造函数,在之前的学习工程中,我们并没有接触到j ...

  3. java语言课堂动手动脑

    1 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是 ...

  4. java语法基础--动手动脑问题及课后实验问题

    ---恢复内容开始--- 动手动脑: 1:仔细阅读示例:EnumTest.java,运行它,分析运行结果 结果 :枚举类型是引用类型!枚举类型不属于原始数据类型,它的每个具体指都引用一个特定的对象.相 ...

  5. java第二节课 java语法基础动手动脑

    动手动脑1:枚举变量   运行EnumTest.java package test2; public class EnumTest {  public static void main(String[ ...

  6. java学习(4)——动手动脑

    根据ppt所给的例子,运行的结果如下所示: ppt中出现的第二个动手动脑如下: 代码如下: 其运行结果如下: 作出简单的分析如下:有点类似于if 和else的关系,总是对应try和catch同层中的异 ...

  7. java课程作业--动手动脑

    随机数: 1)编写一个方法,使用以下算法生成指定数目(比如1000个)的随机整数. Modulus=231-1=int.MaxValue Multiplier=75=16807 C=0 当显示过231 ...

  8. java文件课后动手动脑

    package 第九周作业1; import java.io.File; import java.io.FileInputStream; import java.io.IOException; imp ...

  9. JAVA课堂练习-动手动脑--数组

    1.阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 源代码: public class PassArray { public stat ...

  10. Java语法基础动手动脑

    仔细阅读示例:EnumTest.Java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? EnumTest.java public class EnumTest { pub ...

随机推荐

  1. Spring MVC 配置类 WebMvcConfigurerAdapter

    WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置.因此,在spring b ...

  2. Python保留小数的几种方法

    Python保留小数的几种方法 1.使用字符串格式化 print("%.2f"%a) 2.使用round内置函数 round(num,2) 3.使用Decimal模块 from d ...

  3. springboot使用 @EnableScheduling、@Scheduled开启定时任务

    1.在main启动项添加一个注解@EnableScheduling package com.example.springmybatis; import org.mybatis.spring.annot ...

  4. Vert.x Web之Router

    Vert.x Web 是一系列用于基于 Vert.x 构建 Web 应用的构建模块. Vert.x Web 的大多数特性被实现为了处理器(Handler),因此您随时可以实现您自己的处理器.我们预计随 ...

  5. jumper-server-第一次粗略配置

    https://www.cnblogs.com/zsl-find/articles/11179450.html

  6. kubernetes搭建Harbor无坑及Harbor仓库同步

    一.helm搭建harbor 1.安装helm 1.1.安装helm客户端 tar -zxvf helm-v2.14.3-linux-amd64.tar.gz mv linux-amd64/helm ...

  7. Redis常用命令(Set、Hash、Zset)

    1.Set(单值多value) 1. sadd.smembers key . > SADD set01 (integer) > SMEMBERS set01 ) " ) &quo ...

  8. Hadoop常见重要命令行操作及命令作用

    关于Hadoop [root@master ~]# hadoop --help Usage: hadoop [--config confdir] COMMANDwhere COMMAND is one ...

  9. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  10. DirectX12 3D 游戏开发与实战第四章内容(上)

    Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...