面向对象(上)

来源:互联网 发布:互联网金融数据平台 编辑:程序博客网 时间:2024/06/05 09:38

1.      名次解释:构造方法,抽象

答:(1)构造方法:具有与类相同的名称;不含返回值;不能在方法中用 return 语句返回一个值;当自定义了构造方法后,编译器将不再自动创建不带参数的构造方法。

构造方法就是与类名相同的类方法。它的作用是可以用来初始化,每当使用new关键字创建一个对象,为新建对象开辟了内存空间后,java系统将自动调用构造方法初始化这个新建的对象。从构造方法的定义可知,构造方法专属于类,而不属于任何对象。

构造方法作用就是对类进行初始化。如果你没有定义任何构造方法的形式,程式会为你取一个不带任何参数的构造函数,那么你产生类的对像时只能用不带参数的方法,

如:class a {}//没有任何构造函数。

也可以自己定义构造方法。

具体的例子如下:
class Person //人类{
public Person(String n,int a) //构造方法

{name = n; age = a;}
 private string name;
 private int age;}
static void main(String[] args){
Person p = new Person("张三",14);//这就是作用

}

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

在java中抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节。抽象是一个概念或者想法不和任何特定的具体实例绑死。简单地说:“抽象只从正确的角度,透露对象的某些相关细节。”抽象在任何编程语言中的许多方面起作用。从创建子程序到定义接口来,生成低级语言调用,例如设计模式。

面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。  在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。

--------------------------------------------------------------------------------------------------------------------------

 

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

答:(1)对象位于堆内存中。

     (2) 声明能够引用对象的实质:在栈中保留了对象的地址。

java中内存主要包含4块,即heap(堆内存)、stack(栈内存)、data segment(静态变量或是常量存放区)、codesegment(方法区). 
堆内存中存放的是new出的对象,new出的对象只包含成员变量。 
栈内存中:存放的是局部成员变量。对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。 
静态、常量区:存放的是静态变量(类变量)或是常量。 
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。 
如 A a = new A(); A中含有一个work方法,2个成员变量a,b。那么对应的内存分配为 
则 a是分配在栈内存中。里面存放了一个指向堆内存中存放的new A()的地址。 
new A()会导致在堆内存中分配一块空间,该内存中的A对象同时会含有a和b。 
work()方法会在codesegment区中分配内存。 
如果此时 A b = a;则表示把a的值复制给b,即b的值为a中保存的地址

例如:Person per = new Person(); per这个new出来的对象是在堆内存中,当引用时是在栈中找到地址,这个栈地址指向堆内存

参见网址:http://blog.csdn.net/qq_30753945/article/details/54974899

--------------------------------------------------------------------------------------------------------------------------

 

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

答:(1)基本数据类型作为参数在方法中传递的是值传递。

(2)对象是引用传递,当对象作为参数传递时,传递的是对象的地址。

基本数据类型在栈中进行分配,而对象类型在堆中进行分配。

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

传值---传递基本数据类型参数

引用传递---对象作为参数
如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

参见网址:http://blog.csdn.net/dreamxiaowei/article/details/57083367

--------------------------------------------------------------------------------------------------------------------------

 

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

答:类的Finalize方法,可以告诉垃圾回收器应该执行的操作,该方法从Object类继承而来。在从堆中永久删除对象之前,垃圾回收器调用该对象的Finalize方法。注意,无法确切地保证垃圾回收器何时调用该方法,也无法保证调用不同对象的方法的顺序。即使一个对象包含另一个对象的引用,或者在释放一个对象很久以前就释放了另一个对象,也可能会以任意的顺序调用这两个对象的Finalize方法。如果必须保证采用特定的顺序,则必须提供自己的特有清理方法。

--------------------------------------------------------------------------------------------------------------------------

 

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

答:当一个对象有多个引用时,若所有引用都变成null时,对象没有任何引用,成为垃圾。成为垃圾后,系统不会自动释放对象所占内存资源,而是在资源不够情况下才进行释放。对象不再占有内存空间时说明对象被释放了。

--------------------------------------------------------------------------------------------------------------------------

 

6.Final修饰符都有什么作用:

答:以final修饰类属性,则该属性为常量;如果修饰方法,则方法称为最终方法,在子类当中不能被覆盖。

--------------------------------------------------------------------------------------------------------------------------

 

7.Static修饰符的属性和方法有什么特点

答:(1)static 修饰的成员方法表示静态方法,可以直接通过类名来访问。

     (2)static 修饰的程序代码块表示静态代码块,当JAVA虚拟机加载类时,就会执行该代码块。

     (3)static 所修饰的成员变量和成员方法标明归某个类所有,它不依赖于类的特定实例,被类的所有实例共享。

--------------------------------------------------------------------------------------------------------------------------

 

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

答:Java application源程序文件的扩展名为java.exe。在执行时,是先编译后执行,执行一个类。

--------------------------------------------------------------------------------------------------------------------------

 

9.如何用eplipse将程序进行打包并导入?

答:(1)Eplipse怎么将程序打包?

百度:Eplipse怎么将程序打包

(2)eplipse如何打开jar包?

步骤如下:
1、右键点击你需要添加jar包的项目。
2、选择“Properties”。
3、然后选择对话框中的“Java Build Path”。
4、选择“Libraries”选项卡,然后点击右边的“Add External JARS“,然后找到你的jar所存放的路径,选择需要添加的jar包。
5、点击“OK”完成。
经过以上步骤即可添加好jar包。
注意:如果是添加系统所带有的jar,在第4步的时候选择“Add JARS”,其他步骤相同。

相关网址:https://zhidao.baidu.com/question/139940987.html

--------------------------------------------------------------------------------------------------------------------------

 

10.请在display函数中用递归方式输出如图形。


答:代码如下:

package 课后习题;import java.util.Scanner;public class di10ti {   static void    display (int n){if (n==1){    System.out.print("1  ");}else{for (int i=1;i<=n;i++){System.out.print(n);System.out.print("  ");}System.out.println("");display(n-1);}}public static void main(String[] args) {int n;Scanner input=new Scanner(System.in);        System.out.print("输入行数n的值:");        n=input.nextInt();display(n);}} 


原创粉丝点击