JavaSE 第二次学习随笔(关于内存的小题)
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{
System.out.println("I'm A class");
}
static {
System.out.println("static A");
}
} public class HelloB extends HelloA {
public HelloB() {// 优先调用父类的构造方法
System.out.println("HelloB");
}
{
System.out.println("I'm B class");
}
static {
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
new Dervied();
}
} class Dervied extends Base {
private String name = "dervied";
public Dervied() {
tellName();
printName();
} public void tellName() {
System.out.println("Dervied tell name: " + name);
} public void printName() {
System.out.println("Dervied print name: " + name);
} // public static void main(String[] args){
// //1.执行父类的构造方法 2.给自己的成员变量赋值 3。调用构造方法中的调用的方法 多态
// }
} class Base {
private String name = "base";
public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}
public void printName() {
System.out.println("Base print name: " + name);
}
} 输出:
static A
static B
I'm A class
HelloA
I'm B class
HelloB
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied 1, 原因, 类加载时发现B.class 还有父类, 好先去加载 A.class
众所周知 static 块 是在.class 里的其执行的比main优先级更高, 所以先执行父类的static 方法, 好 然后继续回去加载B.class 的方法 又遇到个static 块,
ok执行它, 终于进 main() 了, new HelloB() ,额等等, 它里边隐藏了一部分代码 : 自动调用的 super(), 好的...先去执行父类的初始化... 执行父类的实例代码块,
终于轮到自己了,,,执行自己的实例代码块, ok 执行 自身的构造方法 -_-|||
2, 原因, 引用《疯狂Java讲义》中的一段话。因为Java里的方法不能独立存在,它必须属于一个类或一个对象,因此方法也不能直接像函数那样被独立执行,执行方法时必须使用类或对象作为调用者,
即所有的方法都必须使用“类.方法”或“对象.方法”的形式来调用。这里可能产生一个问题:同一个类里不同方法之间相互调用时,不就可以直接调用吗?
这里需要指出的是:同一个类的一个方法调用另一个方法时,如果被调用方法是普通方法,则默认使用this作为调用者;如果被调用方法时静态方法,则默认使用类作为调用者。
也就是说表面上看起来某些方法可以被独立执行,但实际上还是使用this或类来作为调用者。
那么这不就和多态似的了吗 this.tellName();this.printName();....由于初始化父类时对两个变量还没赋值(执行super()时,这时的name时被子类覆盖的,
子类的name还没初始化呢, 接下来开始执行执行sysout, 然后子类初始化, 初始化变量~, 执行sysout)
JavaSE 第二次学习随笔(关于内存的小题)的更多相关文章
- JavaSE 第二次学习随笔(五)
/* * 中文乱码出现的情况研究 * 注意点:乱码解决的办法是再编码再解码 * 但是如果是编码出错了,无法解决.如果是解码出错了,可以利用再编码再解码 * * * 编码 解码 结果 * GBK utf ...
- JavaSE 第二次学习随笔(四)
---------------------------------------------------------------------------------------------------- ...
- JavaSE 第二次学习随笔(三)
* 常见异常 * 数组越界异常 * 空指针异常 * * * 特点: 当程序出现异常的时候, 程序会打印异常信息并中断程序 * 所以当同时出现多个异常的时候只能执行第一个, 后边的用不到 * * 单异常 ...
- JavaSE 第二次学习随笔(二)
循环结构中的多层嵌套跳出 targeta: for(int i = 0; i < 100; i++){ for (int j = 0; j < 100; j++) { if(i + j = ...
- JavaSE 第二次学习随笔(String的坑 + ==)
String 类是一个final类, 其内部是使用的 private final char value[]; 来存储内容, 其既可以当作一个基本类型来使用也可以当作一个类来使用;final 类(Str ...
- JavaSE 第二次学习随笔(一)
Java是一种区分大小写的强类型准动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,类型的检查是在运行时做的,优点为方便阅读,清晰明了,缺点 ...
- JavaSE 第二次学习随笔(作业一)
package homework2; import java.io.ObjectInputStream.GetField; import java.util.Arrays; public class ...
- 学习练习 java数据库查询小题
10. 查询Score表中的最高分的学生学号和课程号.(子查询或者排序) 11. 查询每门课的平均成绩. 12.查询Score表中至少有5名学生选修的并以3开头的课程的平均分数. 13.查询分数大于7 ...
- Python(Python+Qt)学习随笔:使用xlwings新建Execl文件和sheet的方法
在<Python学习随笔:使用xlwings读取和操作Execl文件>介绍了使用xlwings读取和操作Execl文件的方法,但老猿这两天写个例子使用时,发现使用该文的方法无法新建EXCE ...
随机推荐
- Azure 8月众多新版本公布
Azure 8月新发布:IoT 中心S3 版,Azure 热/冷存储层,DocumentDB,SQL Server Stretch Database, MySQL 5.7, Cloud Foundry ...
- 三、python webservice
#!/usr/bin/python # -*- coding: utf-8 -*- import logging import suds url="http://172.17.2.199:8 ...
- pip下载太慢解决方法
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --upgrade tensorflow 用清华的镜像下载会快很多.
- MATLAB安装与注册(血泪总结)
工具/原料 R2016a_win64.iso(安装文件) Matlab 2016a Win64 Crack.rar(破解文件) 方法/步骤 1 下载R2016a_win64.iso(安装文件) ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- Arcgis Javascript中geometryEngine报错’hq‘of undefined的解决方法
这个问题困扰了我一个星期,原因是使用geomagicbuffer时候,有的线可正常使用,有的就直接报错,一直没有解决,后来发现是api自己的bug导致的 干脆直接读代码,在geometryEngine ...
- visual assist x vs2012不智能提示
今天装了visual assist x,但是在vs2012里不智能提示,在哪里看了看.找到了开关. 我英文不好.... 默认的话是不选中的.
- Asset Store 下载的package存在什么地方?
发现从Asset store下载的packages都不知道放在了什么地方 Windows 7,C:\Users\<username>\AppData\Roaming\Unity\Asset ...
- VMware虚拟机修改BIOS启动项
vmware默认是硬盘启动,要进bios里面设置成开机的启动顺序,要将光盘设置成第一启动项.但vm的开机画面比笔记本的还要快很多,基本都在1s内的,想进入 bios里面也有难度.. 对于网上说的开vm ...
- 常用的linux指令整理
ls 列出文件目录 -a全部文件,连同隐藏文件一起列出 -d仅列出目录本身,而不是列出目录内的文件数据 -l 连同权限一同列出 cd 切换文件目录的命令 pwd显示目前所在的目录 mkdir 创建新的 ...