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

package com.xu;
class fool
{
int value;
fool(int nowvalue)
{
value=nowvalue;
}
}
public class hello { public static void main(String[] args) {
// TODO Auto-generated method stub
fool f=new fool(); } }

可他为什么会报错呢?

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

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

2.java初始化的先后顺序

package com.xu;
public class hello {
hello()
{
System.out.println("调用无参构造");
} hello(int nowvalue)
{
this.value=nowvalue;
System.out.println("调用有参构造");
} {
value=900;
System.out.println("999");
} public int value=200; public static void main(String[] args) {
// TODO Auto-generated method stub
hello h1=new hello();
System.out.println("无参构造的输出为:"+h1.value); hello h2=new hello(1000);
System.out.println("有参构造的输出为:"+h2.value); } }

输出为:

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

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

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

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

class Root
{
static{
System.out.println("Root的静态初始化块");
} {
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static{
System.out.println("Leaf的静态初始化块");
} {
System.out.println("Leaf的普通初始化块");
} public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
} } public class TestStaticInitializeBlock
{
public static void main(String[] args)
{
new Leaf(); }
}

输出为:

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

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

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

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

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

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

package com.xu;
public class hello {
public int value=0; public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
}
//静态方法中调用非静态的成员及方法
static void f()
{
hello s=new hello();
System.out.println(s.getValue());
int k=10;
s.setValue(k);
System.out.println(s.getValue());
} public static void main(String[] args) {
// TODO Auto-generated method stub
f();
} }

输出:

0

10

5.诡异的Integer

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

为什么第二个会是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.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可向他查询生成多少个对象

package com.xu;
public class hello {
static int num=0;
hello()
{
num++;
System.out.println("已创建"+num+"个对象");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
hello h1=new hello();
hello h2=new hello();
hello h3=new hello();
System.out.println("一共创建了"+num+"个对象");
} }

输出:

已创建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. 【Nginx】 中的配置命令

    一.location 1.1 概述 1.2 location的语法 1.3 Location正则案例 二.nginx rewrite 2.1 rewrite全局变量 2.2 判断IP地址来源 2.3 ...

  2. Python连载37-多进程、进程子类、进程父子id

    一.线程替代方案 1.subprocess (1)完全跳过线程,使用进程 (2)是派生进程的主要替代方案 (3)python2.4后引入 2.multiprocessing (1)使用threadin ...

  3. Linux入门基础之 中

    五.Linux 下获取帮助 没必要记住所有东西 Linux 提供了极为详细的帮助工具及文档,一定要养成查帮助文档的习惯,可以大大减少需要记忆的东西并且提高效率 5.1.HELP 几乎所有命令都可以使用 ...

  4. 手写RPC框架指北另送贴心注释代码一套

    Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的.所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架. 完整代码以及 ...

  5. 在一个升序数组中添加最少的数字,使得从1--n之间所有的数都能用数组中几个数的和表示

    一个Java的笔试题上面遇到的题,当时没有做出来. 拆分: 序列升序 1--n所有的数都要能表示 用数组中数字的和表示 添加最少的数字 思路:这个要先从小的数开始表示,因为大的数可以用小数表示. 1- ...

  6. 开发利器JRebel部署SpringBoot项目

    不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你. idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitte ...

  7. window 定时关机小程序bat

    复制以下文本,新建txt文件并修改为bat后缀 如图: @echo off title 定时关机 echo 定时关机程序 echo ---------------------------------- ...

  8. LeetCode 230.二叉树中第k小的元素

    题目: 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 这道题在leetCode上难 ...

  9. Spark Streaming 入门

    概述 什么是 Spark Streaming? Spark Streaming is an extension of the core Spark API that enables scalable, ...

  10. C# 事件 Event

    一.事件是什么 微软的定义:和委托类似,事件是后期绑定机制. 实际上,事件是建立在对委托的语言支持之上的.事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式. 任何其他组件都可以订阅事件 ...