java 类及对象的课后作业_JAVA类和对象课后作业

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

代码:

//显示类

//YiMingLai 2016.10.19

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+"个对象!");

}

}

ceb3b6f206e5e2f5c6ee4031b9a2037d.png

2.请输入并运行以下代码,得到什么结果?

public class test {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Foo obj1=new Foo();

Foo onj2=new Foo();

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

}

}

class Foo{

int value=100;

}

结果错误,输出不出来。

原因:

当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

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

3

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

public class test {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Foo obj1=new Foo();

}

}

class Foo{

int value;

public Foo(int intvalue){

value=intvalue;

}

}

结论:

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

2d70398e4e3f1e12923aa0a659f76816.png

4.运行代码

public class test {

/**

* @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(){}

}

a33f509748ba596d950e49454e16e8b6.png

结论:

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

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

5.运行代码

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();

}

}

9aae4166f9873dba13da76ed3695972c.png

结论:

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

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

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

7.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加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();

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值