1.课后作业
问题:
原码:
Test.java:
package test3;
public class Test {
public static void main(String[] args) {
Ch c[]=new Ch[10];
for(int i=0;i<10;i++)
{
c[i]=new Ch();
System.out.println(c[i].gettime());
}
}
}
Ch.java
package test3;
public class Ch {
private static int time=0;
public Ch()
{
time++;
}
public int gettime()
{
return time;
}
}
截图:
说明:
声明为类的静态字段可以保证time的不会随着对象的声明而改变,构造函数中让time+1,表示创建了一个对象.
2.
动手动脑:
1)问题:
当为类Foo写了构造函数之后,系统将不会再生成默认的构造函数,由于Foo已有含参数int initValue,而主函数调用时有是无参,所以会发生错误.
2)
package text2;
public class test {
public static void main(String[] args) {
ob ob1=new ob();
System.out.println(ob1.value);
}
}
package text2;
public class ob {
public int value=100;
{
value=200;
}
public ob()
{
value=300;
}
}
测试结果:
说明:构造函数中的优先级最高,其次是初始化块,最后是定义时.
3)
原码:
package text2;
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 test
{
public static void main(String[] args)
{
new Leaf();
}
}
运行结果:
说明:首先从父类开始执行静态初始化块,随后从父类开始执行普通初始化块和构造函数.
原码:
package text2;
public class test
{
public static void main(String[] args)
{
ob c=new ob();
c.shuchu();
}
}
package text2;
public class ob {
private int a=1;
private static int b=2;
public static void shuchu()
{
System.out.println("实例a="+new ob().a);
System.out.println("静态b="+b);
}
}
输出结果: