java课后作业-5

作业一:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?“

程序源代码;

public class Lei {

/**

* @param args

*/

 

public static void main(String[] args) {

// TODO Auto-generated method stub

lei1 a=new lei1();

lei1 b=new lei1();

b.out();

}

}

class lei1{

static int n=0;

lei1(){

n++;

}

public void out(){

System.out.println("你已经创建了"+n+"个对象!");

}

}

 

程序结果截图: 

课后作业二:动手动脑

(1):以下代码为何无法通过编辑,哪出错了?

程序源代码:


public class Test1 {
 public static void main(String[] args){
  Foo obj1=new Foo();
 }

}
class Foo{
 int value;
 public Foo(int initvalue){
  value=initvalue;
 }
}

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

(2)使用上页幻灯片中定义的类,以下代码输出结果是什么?

程序源代码:

public class Test2 {
/**
* @param args
*/
 public static void main(String[] args) {
// TODO Auto-generated method stub
  InitializeBlockClass obj=new InitializeBlockClass();
  System.out.println(obj.field);//?

  obj=new InitializeBlockClass(300);
  System.out.println(obj.field);
 }
}
class InitializeBlockClass{
 {field=200;}
 public int field=100;
 public InitializeBlockClass(int value){this.field=value;}
 public InitializeBlockClass(){}
}

运行结果截图:

结论:

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

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

(3)请运行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();
  

 }
}

程序运行截图:

结论:

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

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

程序源代码:

class Example

 {  

        public static void display()

        {

             System.out.println("类的方法");

         }

 public void displayOne()

 {

        System.out.println("对象的方法");

 }

  public static void main(String[] args) 

{

           Example.display();

           Example e=new Example();

           e.displayOne();   

           e.display();

 }

}

(5)上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?

结论:因为它们调用的Interger类的方法不同

(6)两对整数明明完全一样,为何一个输出true,一个输出false?

程序源代码:

public class test {
/**
* @param args
*/
 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;
}

结论:

引用代表地址,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

 

转载于:https://www.cnblogs.com/kangy123/p/5983844.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值