1. 构造方法不能有返回值
2. 单例模式就是用private修饰构造函数的
3.构造函数是可以重载的
4.构造函数的名字必须和类名相同
inputstream,outputstream都位于system.io包中
子类A继承父类B
A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
也就是说非静态初始化块的执行顺序要在构造函数之前
会先执行静态代码块,因为静态代码块是类级别的,是在创建对象之前就执行的。因为子类继承了父类,所以父类的静态代码块会先执行,接着执行子类的静态代码块。
因为构造函数可能要给动态代码块的一些成员变量赋值,所以必须在这之前先执行动态代码块,要不然构造函数会出现相关的成员属性无定义。所以会先执行动态代码块,在执行构造函数。一般先按父类的执行,再按子类的执行
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。
无论是C++还是JAVA程序,s2调用了new,是在heap上创建了字符串;
而s1是在stack上,直接比较s1和s2肯定是不同的。但是equal函数(当然,C++中String是没有equal成员函数的)比较的是字符串元素的ACSII值,他们是由于他们的元素对应相等的,所以结果是4执行,6不执行;
而s1是在stack上,直接比较s1和s2肯定是不同的。但是equal函数(当然,C++中String是没有equal成员函数的)比较的是字符串元素的ACSII值,他们是由于他们的元素对应相等的,所以结果是4执行,6不执行;
public
static
void
main(String args[]) {
Thread t=
new
Thread(){
public
void
run(){
dianping();
}
};
t.run();
System.out.print(
"dazhong"
);
}
static
void
dianping(){
System.out.print(
"dianping"
);
}
dianpingdazhong
如果将t.run() 换成t.start()就会变成dazhongdianping
这可以用执行顺序静态方法->非静态方法->构造函数
因为run 仅仅是方法的调用,直接调用静态方法就行,但是start得先创建thread实例,然后再调用start方法,所以执行顺序是不同的
字符串new的都是在堆中 字符串常量是在permgen中 也就是堆得永久区(这时候就不是堆了) 是常量池 栈用来存放局部变量和方法调用
关于寄存器
Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined
在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度.。
如下,1,2,3可以通过编译,4,5不行。而String是Object的子类,所以上述BCF均可定义一个存放50个String类型对象的数组。
1. String a[]=new String[50];
2. String b[];
3. char c[];
4. String d[50];
5. char e[50];