10月14日课堂动手动脑

动手动脑

一、为何下面的代码无法编译

public class D1 {
public static void main(String[] args) {
    //int a=1;
    Foo f=new Foo();
    //System.out.println(f.value);
}
}
class Foo{
    int value;
    public Foo(int i)
    {
        value=i;
    }
}

原因是当类中有自己定义的构造函数时,初始化时要传参进行初始化。

如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

二、

以下代码输出结果是什么?

public class InitializeBlockDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {

        InitializeBlockClass obj=new InitializeBlockClass();
        System.out.println(obj.field);

        obj=new InitializeBlockClass(300);
        System.out.println(obj.field);
    }

}

class InitializeBlockClass{
    //下面这句在初始化块之前与之后,会影响到field字段的初始值
    //public int field=100;

    {
        field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){

    }
}

结果是100和300

Java字段初始化的规律:

1.执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。

2.执行类的构造函数。

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

在Java中定义一个类后,有三种方式可以对其中的变量进行初始化:直接输入,初始化块,构造函数。

而对于这三者的优先级,其应该是:1.类的构造函数(构造方法)2.看类的初始化块和在执行类成员的时候默认给出的值是哪个排在类中的前面

三、静态初始化块的执行顺序

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的构造器

结论:

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

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

执行顺序:

  1. 在加载类时执行一次静态初始化块(之后不再调用)。
  2. 在每次初始化实例对象时:先执行非静态初始化块。
  3. 再执行构造方法。

原文地址:https://www.cnblogs.com/a155-/p/11681849.html

时间: 2024-10-10 01:17:40

10月14日课堂动手动脑的相关文章

【每日圣经日历】2014年10月14日

注:移动用户(特别是苹果(Ipad))可以全选文字使用机器朗读 Mardi le 14 Octobre 2014 礼拜二 2014年10月14日 Quel homme d'entre vous, s'il a cent brebis, et qu'il en perde une, ne laisse les quatre-vingt-dix-neuf autres dans le désert pour aller après celle qui est perdue, jusqu'à ce q

IntelliJ IDEA 最新激活码(截止到2018年10月14日)

IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInBy

Java11月9日的动手动脑

Java动手动脑 请自行编写代码测试以下特性(动手动脑): 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 程序源代码: package yanzhengjicheng; class add{ public int jiafa(int a,int b){ int s; s=a+b; return s; } } class add1 extends add{ public int jiafa(int a,int b){System.out.println("调用父类的"

2015年10月27日课堂笔记

今天是开课的第一天,上午见到了我们的班主任,一个干练的美女.而且每个同学都做了简单的自我介绍,选出了班长,也有了我们小班级的群,算是正式开始了. 下午,我们学习了计算机中的基本数制和数制间的转换. 一.数制 计算机中采用的是二进制,因为二进制具有运算简单,易实现且可靠.二进制就是逢二进一,借一当二.同理八进制是逢八进一,借一当八:十六进制是逢十六进一,借一当十六. 二.数制转换 1.十进制与其他进制之间的转换 (1)十进制转换成二进制:十进制数除以2,除至0时所得余数按反方向写出,即为二进制数.

2019年10月21日课堂测试

一.题目 石家庄铁道大学2019年秋季   2018 级课堂测试试卷(六)(10分) 课程名称: JAVA语言程序设计  任课教师:王建民        考试时间: 150 分钟 一.   考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单选框或下拉框实现,选项只有“男”或“女”:(1分) 4学号:要求八位数字组成,前四位为“2018”开头,输入自

2015年10月14日之前的知识点整理汇总[MVC]

暗恋项目:考察 MVC 格式和布局,其中涉及到 OpenGLView(跨行业标准) 和 OpenGLViewes(移动端跨行业标准) 我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是至关重要的. 一.MVC的概念 MVC是Model-VIew-Controller,就是模型-视图-控制器,这些都是什么东西呢? MVC把软件系统分为三个部分:Mod

10月14日笔记

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>音乐</title> <!-- 引入css样式文件 --> <link rel="stylesheet" type="text/css" href="./css/yinyue.css"> </head>

老李说事:下课:北京时间2015年10月14日23:20

你能想象一个培训机构的下课时间是23点么?现在是北京时间23:20.学员们辛苦了,基本上天天都这么晚.在将来回忆起这一刻的,我想是甜蜜的

2016年10月14日学习回忆

if结构:       if(条件){ //(条件为真则输出) 多重if:     if(条件){ //(条件为真则输出,为假输出下一个if) if(条件){ //(同上,多次重复) ------- if-else结构