java p57第四章课后习题

1.名词解释:构造方法、抽象。

构造方法:构造方法是一个与类名相同的类方法。每当使用new关键字创建一个对象,为新建对象开辟了内存空间之后,java系统将自动调用构造方法初始化这个新建对象

关键与类名相同

   构造方法没有返回类型,可重载

   作用:对数据成员进行初始化

抽象(abstraction):是从被研究对象中舍弃个别的、非本质的或与研究主旨无关的次要特征,而抽取与研究有关的共性内容加以考察,形成对研究问题正确、简明扼要的认识。

 

2.对象位于内存何处?声明能引用对象的实质是什么?

所有对象都在上,而对象引用可能在上也可能在上。

内存空间分为堆和栈(堆在应用程序生命周期内一直存在,而栈在方法调用完之后就释放,类和对象被分配到堆中,而方法执行时用的局部变量和形式参数则放到栈空间当中。

对象的引用就是对象的声明,有点类似对象的名片,或者说遥控对象这个电视机的遥控器,他储存着对象的实际地址,因此可以指向对象。

 

3.对象和基本数据类型作为参数传递时,有什么不同?

 1 public class BaiduTest01 {
 2     private String str = "sam" ; //str是引用类型,但是String是final的
 3     private int num = 2 ;//num是基本类型
 4     private Float floatNum = Float.valueOf(3.2f) ;//floatNum是引用类型,但是Float是final的
 5     private char[] ch = {'a','b','c'} ; //常见的引用类型
 6     public void changeString(String str) {
 7         str = "tom" ;
 8     }
 9     public void changeFloat(Float floatNum) {
10         floatNum = Float.valueOf(6.4f) ;
11     }
12     public void changeInt(int num) {
13         num = 20 ;
14     }
15     public void changeCharArray(char[] ch) {
16         ch[1] = 'd' ;
17     }
18 
19     public static void main(String[] args) {
20         BaiduTest01 test = new BaiduTest01() ;
21         test.changeString(test.str) ;
22         test.changeInt(test.num) ;
23         test.changeFloat(test.floatNum) ;
24         test.changeCharArray(test.ch) ;
25         System.out.println(test.str) ; //输出结果不变
26         System.out.println(test.num) ;//输出结果不变
27         System.out.println(test.floatNum) ;//输出结果不变
28         System.out.println(test.ch) ;//输出结果改变
29     }
30 }     
例子

也就是说传递基本数据类型就只是传数据,按值修改;

而对象作为参数传递引用,也就是地址

需要注意的是当引用类型是final时是修改不了的

 

4.在自定义对象中写finalize方法,看看什么情况下finalize被调用。

 1 class Book{
 2     private String bname;
 3     public Book(String name){
 4         bname=name;
 5     }
 6     protected void finalize(){
 7         System.out.println("finalize被调用,释放对象Release Object");
 8     }
 9 }
10 public class SthAboutGcFinalize {
11     public static void main(String args[]){
12         Book novel=new Book("123");
13         novel=null;
14         System.gc();
15     }
16 }

最后结果会出现:finalize被调用,释放对象Release Object

可调用System.gc()方法或者Runtime.getRuntime().gc()提醒系统进行一次垃圾释放,但是System.gc()只是提醒,并不能保证一定释放,因为进行垃圾回收的系统县城级别很低,当系统很忙时,有可能忽略这项工作,只有不忙时才进行相应的释放垃圾的工作,此时垃圾对象的finalize方法才被调用。

 

5.对象在什么条件下成为垃圾?什么情况下释放垃圾对象,如何证明一个对象被释放了?

1.什么是垃圾对象? 
        对象没有任何引用

2.垃圾对象何时回收?
       虚拟机在系统资源不够的情况下才会回收垃圾对象

3.垃圾对象回收时调用finalize方法
       垃圾回收不能保证一定会发生

 还是刚才那个例子变成这样

 1 class Book{
 2     private String bname;
 3     public Book(String name){
 4         bname=name;
 5     }
 6     protected void finalize(){
 7         System.out.println("finalize被调用,释放对象Release Object");
 8     }
 9 }
10 public class SthAboutGcFinalize {
11     public static void main(String args[]){
12         Book novel=new Book("123");
13         novel=null;
14         System.gc();
15         if(novel==null)
16             System.out.println("novel对象被释放");
17     }
18 }
例子

加了一句

 if(novel==null)
            System.out.println("novel对象被释放");
    }

最后结果:

novel对象被释放
finalize被调用,释放对象Release Object

 

6.final修饰符都有什么作用?

1.修饰类属性--->常量,不能被修改

2.修饰方法--->最终方法,不能被覆盖

3.修饰--->终态类,类不能被继承

 

7.static修饰的属性和方法有什么特点?

静态对象为类所有,而不是为对象所有。

静态字段最先被初始化,static修饰的域变量被共享,他只有一个。(类似于班级的班费,为所有学生所共享,只需要一个学费,而不是在所有学生的属性中都加一个学费,这样可以节省空间,而且修改方便)

static修饰的属性的特点:它被保存在类的内存区(堆)中的公公存储单元中,而不是保存在某个对象的内存区中。因此,一个类的任何对象访问他时,存取到的都是相同的数值。访问方式:类名.域名

 

static修饰的方法的特点:称作静态方法,属于类方法,不属于类的任何对象。

1.static方法是类方法,但可以被所有对象所访问。调用这个方法时,可采用:"对象引用.方法名"或者"类名.方法名"

2.static方法内部的代码,只能访问类中的static属性或方法,不能访问类中的非static属性或方法

3.main方法是特殊的静态方法

 

8.Application程序执行时,为什么不能带后缀名?

java命令是执行一个类。

若写 java x.y是代表要运行package x中的class y里面的main(String[]),所以当你写java x.class时, 它会以为要找一个叫x的package里面的一个叫class的class

 

9.下面代码中,vector是java.util包中的一个类,关于此类哪个叙述是正确的
1)public void create(){
2)  vector myvect;
3)  myvect=new vector();
4)}
A第二行的声明不会为变量myvect分配内存空间
B第二行的声明分配一个到vector对象的引用的内存空间
C第二行语句创建一个vector类对象
D第三行语句创建一个vector类对象
E第三行语句为一个vector类对象分配内存空间

答案:ADE

解析:声明不分配内存空间的,创建对象时才分配对应的内存空间

第二行声明了一个对象引用,第三行创建了一个对象,为对象分配了内存,并且将对象引用与对象关联。

posted @ 2019-09-22 23:34  Liiiiiiiiiiinnnnnnnn  阅读(238)  评论(0编辑  收藏  举报