第四周Java课后作业

发布时间 2023-09-26 18:33:15作者: 软工人

一、p9 自定义类

1、源代码

package disizhou;
public class ClassAndObjectTest
{

public static void main(String[] args)
{
//创建类的实例,定义一个对象变量引用这一实例
MyClass obj = new MyClass();
//通过对象变量调用类的公有方法
obj.myMethod("Hello");
//给属性赋值
obj.setValue(100);
//输出属性的当前值
System.out.println(obj.getValue());
//直接访问对象公有字段
obj.Information = "Information";
//输出对象公有字段的当前值
System.out.println(obj.Information);
}
}

/**
* 自定义Java类的示例
*/
class MyClass
{
// 公有字段
public String Information = "";

// 自定义公有Java实例方法
public void myMethod(String argu)
{
System.out.println(argu);
}

// 定义属性:私有字段+get方法+set方法
private int value;
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}

}

 

2、运行结果

二、p23 如何比较两个对象的“内容”是否一样

1、源代码

package disizhou;
public class ObjectEquals
{



public static void main(String[] args)
{

MyTestClass obj1=new MyTestClass(100);

MyTestClass obj2=new MyTestClass(100);
System.out.println(obj1==obj2);

System.out.println(obj1.equals(obj2));

}


}

class MyTestClass

{

public int Value;

//注意:只有参数类型为Object的,才是重写了Object的equals方法

//参数类型为MyTestClass的,仅仅是Overload了equals方法。

// @Override

// public boolean equals(Object obj)

// {

// return ((MyTestClass)obj).Value==this.Value;

// }


public boolean equals(MyTestClass obj)

{

return obj.Value==this.Value;

}

public MyTestClass(int initValue)

{

Value=initValue;

}

}

2、运行结果

三、p30动手动脑

不能通过编译的原因:既调用默认构造方法,也调用自定义的构造方法

四、p34 如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

1、源代码

package disizhou;

public class InitializeBlockDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        InitializeBlockClass obj=new InitializeBlockClass();
        System.out.println(obj.field);
        
        obj=new InitializeBlockClass(300);
        System.out.println(obj.field);
    }

}

class InitializeBlockClass{
    //下面这句在初始化块之前与之后,会影响到field字段的初始值
    //public int field=100;
    
    {
        field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
        
    }
}

2、运行结果

Java字段初始化的规律:如果在构造器中没有显示地为字段设置初值,那么就会被自动地赋为默认值:数值为 0、布尔值为 false、对象引用为 null。方法中的局部变量必须明确初始化。但是在类中,如果没有初始化类中的字段,将会自动初始化为默认值(0、 false 或 null)

五、p40动手动脑

1、源代码

package disizhou;
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 TestStaticInitializeBlock
{
    public static void main(String[] args) 
    {
        new Leaf();
        

    }
}

2、运行结果

Java中静态初始化块的执行顺序:1、Java 父类构造函数 父类静态成员变量,父类普通成员变量,父类静态代码块,父类代码块,

2、子类构造函数 子类静态成员变量,子类普通成员变量,子类静态代码块,子类代码块执行顺序

3、没有继承情况下: 执行顺序、静态成员变量、静态代码块、普通成员变量、普通代码块、构造函数

4、子类继承父类的情况下:父类的静态成员变量、父类的静态代码块、子类的静态成员变量、子类的静态代码块、父类的成员变量、父类的代码块、父类的构造函数、子类的成员变量、子类的代码块、子类的构造函数

六、p43 静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

把静态方法的参数设置为类的实例

1、源代码

package disizhou;

public class trr {

    public static void main(String[] args) {
    x w;
    w=new x();
    x.show(w);//直接用类名调用静态方法
    }

}
 class x
{

int num=10;
static void show(x n) //参数设置为类的实例


{
    System.out.println(n.num);    //访问实例的成员
}

}

2、运行结果