我在学习java中做的笔记,希望对大家有帮助。
1.关于static的初始化顺序
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f(int marker) {
System.out.println("f(" + marker + ")");
}
}
class Table {
static Bowl b1 = new Bowl(1);
Table() {
System.out.println("Table()");
b2.f(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl b2 = new Bowl(2);
}
class Cupboard {
Bowl b3 = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
b4.f(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl b5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
} ///:~
输出结果为:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
1.首先运行static Table t2= new Table();定义一个Table型的对象t2,在Table内又先初始化 b1, 此时调用Bowl方法,输出Bowl(1);然后回到Table内初始化b2,再次调用Bowl,输出Bowl(2)。将Table 内的static初始化完后才开始初始化Table类中的Table方法,输出Table();接着执行b2.f(1), 输出f(1);
2.然后运行static Cupboard t3=new Cupboard(); 定义了一个Cupboard型的对象t3,再Cupboard内首先初始化b4;调用Bowl方法,输出Bowl(4),然后回到Cupboard内初始化b5,输出Bowl(5),接着初始化b3, 输出Bowl(3),接着输出Cupboard().然后调用f方法输出f(2);
3.接着开始执行main方法, 首先输出Creating new Cupboard() in main , 这是遇到new Cupboard();进入类Cupboard,先运行Bow b3=new Bowl(3), 输出Bowl(3), 接着输出Cupboard(),然后运行b2.f(2),输出f(2).
4.然后回到main方法内,首先输出Creating new Cupboard() in main,又遇到了new Cupboard(), 如上所述,输出Bowl(3),输出Cupboard(), 输出f(2).
5.下面就是运行t2.f2(1); 因为前面已经定义好了t2,此时直接调用t2 的f2方法就行,再Table内调用f2方法输出f2(1);运行t2.f3(1)也一样,调用Cupboard内的方法f2就输出了f3(1).
关于对象的初始化我来说几句吧,说错了的话,不好意思啊:
对于初始化主要包含这几方面:static 变量 、non-static变量、构造函数、new对象建立。
1、static 变量的初始化:当pulic class 被loadin(栽入)的时候,就开始对static变量初始化了,因为static 变量的refrence是存储在static storage(静态存储空间)中。此时不对non-static变量和构造函数初始化,因为还没有对象的产生,只是把某个型别loadin。注意对于static变量只初始化1次,当有新的对象产生时,他并不会重新被初始化了,也就是他的refrence已经固定,但他的值是可以改变的。
2、当有对象产生时,开始对此class(型别)内的non-static变量进行初始化,然后再初始化构造函数。产生已初始化的object对象。
3、按要求顺序执行其它函数。
4、对有继承的class(型别)来说:derivedclass2、derivedclass1、baseclass;因为他们之间的继承关系,所以要想laodin derivedclass2,必须先loadin derivedclass1,如果想laodin derivedclass1,则先loadin baseclass。也就是说,laodin 顺序为:baseclass、derivedclass1、deriveclass2……,每当loadin 一个class时,则按"第一条"进行初始化(初始化该class内的static变量)。
5、对有继承的class 当用new产生对象时,会按baseclass、derivedclass1、deriveclass2……的顺序,每个class内再按"第二条"进行初始化。注意derived class 的构造函数,一定要满足baseclss可初始化。
总体思想:static变量……non-static变量……构造函数。
***********************************************************************************************
2.
静态变量的初始化问题。
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
prt("ct.c="+ct.v.c);
}
}
运行结果如下:
v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11
class中的所有变量一定会在调用任何一个函数(包括构造函数)之前完成初始化.
******************************************************************************************
3.有关sStr1==sStr2 sStr1.equals(sStr2) sStr1.compareTo(sStr2)疑惑
/*
* 其中sstrl==str2 与 sstr1.equals(sstr2);是怎么回事,同一个对象就应该相等呀,
*/
import java.io.*;
class EqualsTest {
public static void main(String args[])throws IOException {
String sStr1,sStr2;
sStr1="using java language";
sStr2=sStr1;
System.out.println("string1:"+sStr1);
System.out.println("string2:"+sStr2);
System.out.println("same objext? "+(sStr1==sStr2));
sStr2=new String(sStr1);
System.out.println("string1:"+ sStr1);
System.out.println("strint2:"+ sStr2);
System.out.println("same object? "+(sStr1==sStr2)); // (1)
System.out.println("same value? "+sStr1.equals(sStr2)); // (2)
System.out.println("same value? "+sStr1.compareTo(sStr2)); //(3)
System.in.read();
}
}
运行结果是:
string1:using java language
string2:using java language
same objext? true
string1:using java language
strint2:using java language
same object? false
same value? true
same value? 0
解答:
sstr1.equals(sstr2):返回值是一个boolean值,它比较两个字符串的值是否相等;
sStr1.compareTo(sStr2):返回值是一个整数,compareTo()不仅比较大小,还确定了排列的顺序。
如果sStr1大于sStr2,返回一个正整数,如果sStr1小于sStr2,返回一个负整数,如果sStr1等于sStr2,返回0。
sStr1="using java language"; //初始化一个字符串
sStr2=new String(sStr1); //新建一个字符串对象,两者的值一样,但是却指向不同的内存空间
//所以sStr1==sStr2 返回的是false,如果要比较两个字符串的内容是否相等,要用equals方法
sStr1==sStr2不仅比较其内容是否相同,还比较其是否是指向同一个内存地址的。
sStr1="using java language";
sStr2=sStr1;
System.out.println("string1:"+sStr1);
System.out.println("string2:"+sStr2);
System.out.println("same objext? "+(sStr1==sStr2));
这里sStr1="using java language";先初始化一个字符串
sStr2=sStr1;这一步,将sStr2也指向了sStr1的地址,即同一个字符串"using java language"
所以,此时,不仅内容相同,而且连地址也一样,于是返回true。
创建一个String类的对象,给它初始化的时候应该是字串,所以你new一个之后,虽然初始化用的是sStr1,但是只是传递的只是sStr1的值。所以还是不同的两个对象
新建一个字符串对象,两者的值一样,但是却指向不同的内存空间
sStr1==sStr2不仅比较其内容是否相同,还比较其是否是指向同一个内存地址的。
sstr1.equals(sstr2):返回值是一个boolean值,它比较两个字符串的值是否相等;
sStr1.compareTo(sStr2):返回值是一个整数,compareTo()不仅比较大小,还确定了排列的顺序。
**********************************************************************************************
4.有关日期的显示问题
import java.util.Date;
import java.text.*;
class TodayDate {
public static void main(String[] args){
DateFormat defaultData= DateFormat.getDateInstance();
System.out.println(defaultData.format(new Date()));
DateFormat shortTime= DateFormat.getTimeInstance(DateFormat.SHORT);
System.out.println(shortTime.format(new Date()));
DateFormat longTimestamp=
DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
System.out.println(longTimestamp.format(new Date()));
DateFormat myformat=new SimpleDateFormat("yyyy.mm.dd"); //?
System.out.print(myformat.format(new Date()));
try {
Date leapday=myformat.parse("1985.01.27");
}
catch(ParseException e){}
System.out.println();
}
}
/*
* 2004-10-29
下午12:52
2004年10月29日 星期五 下午12时52分45秒 CST
2004.52.29 /// 怎么显示的是52,而不是月呀?
DateFormat myformat=new SimpleDateFormat("yyyy.mm.dd"); 把mm改成MM就可以了
*/
***************************************************************************************
5.有关线程的问题
import java.util.Timer;
import java.util.TimerTask;
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.println("Time's up!");
timer.cancel();
}
}
public static void main (String args[]) {
new Reminder(3);
// for(int i=0;i<10000;i++)
// for(int j=0;j<10000;j++);
System.out.println("Task scheduled.");
}
}
/*
timer.schedule(new RemindTask(), seconds*1000);
Task scheduled.
Time's up!
我把这一句改成
timer.schedule(new RemindTask(), seconds*0); 以后显示的是
Task scheduled.
Time's up!
在延迟时间为0的时候与延迟时间为3秒的显示是一样的,我不知道这个程序是怎么调用,
我总觉的是
Time's up!
Task scheduled.
程序改为:
new Reminder(0);
for(int i=0;i<10000;i++)
for(int j=0;j<10000;j++); // 延迟时间
结果是:
D:\Eclipse\workspace\hello>java Reminder
Time's up!
Task scheduled.
*/
*********************************************************************************************
6.
当一个对象被创建时,初始化是以下面的顺序完成的:
1. 设置成员的值为缺省的初始值 (0, false, null)
2. 调用对象的构造方法 (但是还没有执行构造方法体)
3. 调用父类的构造方法
4. 使用初始化程序和初始块初始化成员
5. 执行构造方法体
class A {
int a = f();
int f() {
return 1;
}
}
class B extends A {
int b = 37;
int f() {
return b;
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
}
0
37
执行顺序应该是:
1. 从heap中分配a, b以及method指针, class指针的内存
2. 将a, b 初始化为数据default值,如int为0, 对象指针为null.
3. 调用B(), 注意:未进入构造函数体,传参数用。
4. 调用A().
5. 执行A()函数体,返回.
6. 对a initialize, 调用B().f,此时b=0!!!!!!!!
7. 执行B()函数体,返回
8. 对b initialize, 调用b=37
9. bobj指向heap中最终创建完成的B对象.
分享到:
相关推荐
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
Java学习笔记作为程序员学习和掌握Java技术的重要资料,对于初学者来说是一个宝贵的参考。 在Java学习笔记中,通常会包括以下几个方面的内容。首先,基础语法是学习的起点,它涵盖了变量、数据类型、运算符、控制...
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
Java学习笔记1 Java学习笔记1是学习Java过程中的笔记,主要记录了Eclipse开发环境中的快捷键使用、编辑功能、查找和调试等知识点。 Eclipse快捷键 Eclipse中有许多快捷键,掌握这些快捷键可以大大提高开发效率。...
Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...
Java学习笔记 1、连接数据库步骤 2、不同数据库的驱动程序和连接字符串 3、连接数据库常见问题 4、B/S结构和C/S结构的区别 5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、...
Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...
这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...
本篇“Java学习笔记电子书”显然是一份详尽的资源,旨在帮助新手逐步掌握这门语言。 首先,我们要了解Java中的对象和类。在Java中,一切皆为对象,这是面向对象编程的核心理念。对象是类的实例,类则是对象的蓝图或...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...
"Java学习笔记" 本资源是一个关于Java编程语言的学习笔记,涵盖了Java的基础知识、语法、数据类型、变量、类型转换等方面的内容。 标题:"java学习笔记.pdf" 描述:"想自学的小伙伴可以看俺" 标签:"Java" 部分...
### 瑜琅Java学习笔记概览 瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun ...
Java 学习笔记 本资源摘要信息涵盖了 Java 编程语言的基础知识,着重于面向对象编程(OOP)的概念和实现。下面是该资源的详细知识点: 1. 面向对象编程(OOP)的基本概念: * 对象: everything is an object...
### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...
这份"Java学习笔记PPT"是针对Java2版本的学习资源,旨在帮助初学者或有一定基础的开发者深入理解Java的核心概念和应用。 在Java学习的初期,掌握基本语法是至关重要的。Java的语法与C++有诸多相似之处,但更加强调...