动手动脑1
以下代码为何无法通过编译?哪儿出错了?
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Foo obj1=new Foo();
}
class Foo()
{
int value;
public Foo(int intiValue)
{
value =intivalue;
}
}
}
结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
运行试验
public class shi {
public static void main(String[] args) {
// TODO 自动生成的方法存根
IntializeBlockClass obj=new IntializeBlockClass();
System.out.println(obj.field);
obj =new IntializeBlockClass(300);
System.out.println(obj.field);
}
}
class IntializeBlockClass{
{
field =200;
}
public int field=100;
public IntializeBlockClass(int value){
this.field=value;
}
public IntializeBlockClass(){
}
}
结果:
java字段初始化规律:类成员定义时指定执行的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”;执行类的构造函数;类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
动手动脑2://The program of java
//LinLinHe,Oct,15,2015
public class Jicheng {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Son f=new Son();
f.output();
}
}
class Father{
int x=10;
Father()
{
}
Father(int newx){
x=newx;
}
}
class Son extends Father{
int y=0;
Son()
{
}
Son(int newy){
y=newy;
}
void output()
{
System.out.println(x+" "+y);
}
}
结论:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
动手动脑3:
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Leaf();
}
}
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的构造器");
}
}
静态初始化块的执行顺序:先执行静态初始化块,再执行普通初始化块,然后执行无参数的构造器。
问题:静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
public class Cheng {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Test t=new Test();
t.getY(1);
t.I();
}
}
class Test
{
int x=0;
static int y;
static public int getY(int newy)
{
y=newy;
System.out.println(y);
return y;
}
public int I()
{
int i=10;
return i;
课后作业://The homework of java
public class Inquiry {
private static int i;
public Inquiry ()
{
i++;
}
public static int get()
{
return i;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Inquiry t1=new Inquiry();
Inquiry t2=new Inquiry();
Inquiry t3=new Inquiry();
System.out.println("共创建了"+Inquiry.get()+"个对象");
}
}
}
}