• Java课后练习4


    课后练习1:以下代码为何无法通过编译?哪儿出错了?

    如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

    课后练习2:使用幻灯片中定义的类,以下代码输出结果是什么?请依据代码的输出结果,自行总结Java字段初始化的规律。

     输出结果:

      Java字段初始化的规律:

    (1)执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。

    (2)执行类的构造函数。

    课后练习3:请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

    源代码:

    package test;

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

     }
    }

    输出结果:

    静态初始化块的执行顺序:

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

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

    源代码:

    public class aaaa {
    static int n = 200; //静态变量

    public static void main(String[] args) {
    New e = new New();
    n = e.Shi(); //将实例变量赋值给静态变量
    New.Jing(n); //

    }

    }
    class New{
    int m = 100; //实例变量
    int Shi(){
    int x;
    x = m;
    return x;//实例函数,返回一个实例值
       }
    static void Jing(int x){
    System.out.println(x); //输出静态变量
    }

    }

    输出结果:

    课后作业5:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?

    源代码:

    package test;

    class sum{
    public static int a=0;
    int c1;
    public sum(int c2){
    c1=c2;
    a++;
    }
    public int get(){
    return a;
    }
    }
    public class aaaa {
    public static void main(String[] args) {
    // TODO 自动生成的方法存根
    //调用
    sum one=new sum(5);
    sum two=new sum(6);
    //输出
    System.out.println(one.get());
    }
    }

    输出结果:

    思考问题1:

    早期我们经常这样定义变量

    int value=100;

    前面的示例中这样定义变量 

    MyClass.obj=new MyClass();

    这两种方式定义的变量是一样的吗?

      不一样。前者定义的是原始数据类型变量,在定义原始数据变量时就为变量开辟了空间;后者是定义了对象的变量,并用构造方法为其开辟内存空间。

    思考问题2:

    对原始数据类型,可以直接使用“==”来判断两个变量的值是否相等。

    对象变量也可以使用“==”来判断两变量的值是否相等吗?

    答:不可以。

    当“==”施加在两个原始数据类型变量时,是比较两个变量的值是否相等。施加在引用类型变量时,是比较这两个变量是否引用同一个对象。即比较两个引用类型变量所保存的对象地址是否一样。

    思考问题3:

    在java中要比较两个对象的字段值,可以“重写(override)”基类的equals()方法,只有参数类型为Object的,才是重写了Object的equals方法;参数类型为其他类时要Overload了equals方法。代码如下:

    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;

    }

    }

    思考问题4:

    请总结一下,这个方法有哪些“与众不同”之处?你能列举几条?

    1)方法名与类名相同;

    2)方法名的第一个首字母大写了;

  • 相关阅读:
    第一章 数据集散地:数据库
    第六章 使用ADO.NET查询和操作数据
    第五章 使用ADO.NET访问数据库
    第四章 深入C#的String类
    IOS框架和服务
    一步步调试解决iOS内存泄漏
    app跳转
    iOS 视频直播
    学习心得
    iOS中FMDB的使用
  • 原文地址:https://www.cnblogs.com/bai123/p/5984270.html
Copyright © 2020-2023  润新知