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 ...
随机推荐
- Mysql 服务无法启动解决办法
1.我使用的是MySQL-5.7.10-winx64 版本,在安装后启动服务时出现 “服务无法启动”错误 2.解决办法为删除安装目录中的data文件,然后打开cmd调到自己的安装目录下输入mysqld ...
- import模块后查找模块的绝对路径
>>> import bsddb3>>> bsddb3.__file__'/usr/local/lib/python2.6/site-packages/bsddb3 ...
- 使用auto_ptr需要注意的事项
注:C++11 已不推荐使用,应使用scoped_ptr/shared_ptr. 部分原因就是如下的注意事项. 转自:http://patmusing.blog.163.com/blog/static ...
- SQL Server ->> CLR编程问题汇总
1) CLR不支持C#类方法重载(Method Overload) 今天打算写个枚举目录的C# CLR存储过程,结果发现原来CLR不支持方法重载. Msg 6572, Level 16, State ...
- vue项目运行报错:Module bulid failed: Error: Node Sass does not yet support your current environment
出错起因: 从GitLab clone项目 --> 用 npm install 命令下载依赖包 --> #npm run dev,报错 错误截图: 解决方法: 思路:单独 i ...
- php xml字符串转数组
function xmltoarr($path){//xml字符串转数组 $xmlfile = file_get_contents($path);//提取xml文档中的内容以字符串格式赋给变量 $ob ...
- Android SDK Manager 如何下载?
修改 "C:\Windows\System32\driver\etc\hosts" 文件,添加以下两行 203.208.40.111 dl-ssl.google.com 203.2 ...
- 在Oracle中查看客户端连接的IP信息 .
大家都知道在v$session 中记录着客户端的机器名称,但是没有IP , 如果记录clinet ip 呢? con sys/sys as dba 1. 利用triger 这里不介绍. 2. 利用 D ...
- Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired,
Did not receive a reply. Possible causes include: the remote application did not send a reply, the m ...
- ACM-ICPC(10/23)
贪心 区间相关问题 选择不相交区间: hdu 2037 给定一些区间,选择尽量多的区间,他们互相不交叉.(活动安排问题) 分析:贪心思路是解决活动安排问题的好方案. 按照区间右端点排序,从前往后遍历, ...