java类与对象课后测试

1.测试ClassAndObjectTest.java

复制代码
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;
    }

}
复制代码

需要定义一个对象变量,然后“new”一个对象,赋值给对象变量

2.早期我们经常这样定义变量“int value=100;”,而前面的示例中这样定义变量“MyClass obj=new MyClass();”,这两种方式定义的变量是一样的吗?

不一样

“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。诸如int,float之类的变量称为“原始数据类型”的变量)。

从变量与内存分配上讲,当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。定义一个原始类型的变量时,会马上给其分配内存。

3.对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等,那么对象变量也可以使用“==”判断两变量值是否相等吗?

复制代码
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
Foo obj1 = new Foo();
Foo obj2 = new Foo();
System.out.println(obj1==obj2);
    }
}
class Foo{
    int value=100;
}
复制代码

运行结果:

 

 不可以,类似于字符串的比较大小,使用equals()进行比较,用法与其相同。当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

4.以下代码为何无法通过编译?哪儿出错了?

复制代码
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
     Foo obj1 = new Foo();
    }
}
class Foo{
    int value;
public Foo(int initValue){
    value=initValue;
}
}
复制代码

如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。所以可以将“Foo obj1 = new Foo();”改为“Foo obj1 = new Foo(4);”

5.运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”

复制代码
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();
        

    }
}
复制代码

运行结果:

 

 静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。

posted @   lcz111  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示