Java之面向对象相关问题集


面向对象的特征有哪些方面 

1.抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解所有问题,而仅仅是选择当中的一部分,临时不用部分细节。

抽象包含两个方面,一是过程抽象。二是数据抽象。

2.封装:

封装是把过程和数据包围起来,对数据的訪问仅仅能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界能够被描绘成一系列全然自治、封装的对象,这些对象通过一个受保护的接口訪问其它对象。

3.继承:

继承是一种联结类的层次模型。而且同意和鼓舞类的重用,它提供了一种明白表述共性的方法。

对象的一个新类能够从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类)。而原始类称为新类的基类(父类)。派生类能够从它的基类那里继承方法和实例变量,而且类能够改动或添加新的方法使之更适合特殊的须要。

4. 多态性:

多态性是指同意不同类的对象对同一消息作出响应。多态性包括參数化多态性和包括多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,非常好的攻克了应用程序函数同名问题。

5、Overload和Override的差别。Overloaded的方法能否够改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。假设在子类中定义某方法与其父类有同样的名称和參数,我们说该方法被重写(Overriding)。子类的对象使用这种方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。假设在一个类中定义了多个同名的方法。它们或有不同的參数个数或有不同的參数类型,则称为方法的重载(Overloading)。Overloaded的方法是能够改变返回值的类型。

6、abstract class和interface有什么差别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class)。它用于要创建一个体现某些基本行为的类。并为该类声明方法。但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而能够创建一个变量,其类型是一个抽象类,并让它指向详细子类的一个实例。

不能有抽象构造函数或抽象静态方法。

Abstract 类的子类为它们父类中的全部抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其他类能够在类中实现这些方法。


接口(interface)是抽象类的变体。在接口中。全部方法都是抽象的。

多继承性可通过实现这种接口而获得。接口中的全部方法都是抽象的。没有一个有程序体。

接口仅仅能够定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。

当类实现特殊接口时,它定义(即将程序体给予)全部这种接口的方法。然后,它能够在实现了该接口的类的不论什么对象上调用接口的方法。

因为有抽象类,它同意使用接口名作为引用变量的类型。通常的动态联编将生效。引用能够转换到接口类型或从接口类型转换,instanceof 运算符能够用来决定某对象的类是否实现了接口。

7、Static Nested Class 和 Inner Class的不同。

 
Static Nested Class是被声明为静态(static)的内部类,它能够不依赖于外部类实例被实例化。而通常的内部类须要在外部类实例化后才干实例化。

8、GC是什么? 为什么要有GC? 
  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员easy出现故障的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能能够自己主动监測对象是否超过作用域从而达到自己主动回收内存的目的。Java语言没有提供释放已分配内存的显示操作方法。 

9、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口能够继承接口。抽象类能够实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明白的构造函数。

10、构造器Constructor是否可被override?


构造器Constructor不能被继承,因此不能重写Overriding,但能够被重载Overloading。


11、能否够继承String类?
String类是final类故不能够继承

12、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被运行,什么时候被运行。在return前还是后?
会运行,在return前运行。

13、当一个对象被当作參数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果。那么这里究竟是值传递还是引用传递? 
是值传递。

Java 编程语言仅仅有值传递參数。当一个对象实例作为一个參数被传递到方法中时,參数的值就是对该对象的引用。对象的内容能够在被调用的方法中改变,但对象的引用是永远不会改变的。

14、Java的接口和C++的虚类的同样和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性。现有的单继承机制就不能满足要求。

与继承相比,接口有更高的灵活性,由于接口中没有不论什么实现代码。

当一个类实现了接口以后,该类要实现接口里面全部的方法和属性,而且接口里面的属性在默认状态以下都是public static,全部方法默认情况下是public.一个类能够实现多个接口

15、Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时。JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包含2种情况。一种是JAVA类库内置的语义检查。

比如数组下标越界,会引发IndexOutOfBoundsException;訪问null的对象时会引发NullPointerException。还有一种情况就是JAVA同意程序猿扩展这样的语义检查,程序猿能够创建自己的异常,并自由选择在何时用throwkeyword引发异常。全部的异常都是java.lang.Thowable的子类。

16、垃圾回收的长处和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制。使c++程序猿最头疼的内存管理的问题迎刃而解。它使得Java程序猿在编敲代码的时候不再须要考虑内存管理。因为有个垃圾回收机制,Java中的对象不再有“作用域”的概念,仅仅有对象的引用才有“作用域”。垃圾回收能够有效的防止内存泄露。有效的使用能够使用的内存。垃圾回收器一般是作为一个单独的低级别的线程执行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收。程序猿不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。

回收机制有分代复制垃圾回收和标记垃圾回收。增量垃圾回收。

17、描写叙述一下JVM载入class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,JavaClassLoader 是一个重要的Java执行时系统组件。它负责在执行时查找和装入类文件的类。

18、一个“.java”源文件里能否够包含多个类(不是内部类)?有什么限制?
能够。必须仅仅有一个类名与文件名称同样。

19、JAVA语言怎样进行异常处理,keyword:throws,throw,try,catch,finally分别代表什么意义?在try块中能够抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。

在Java中,每一个异常都是一个对象,它是Throwable类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象。该对象中包括有异常信息,调用这个对象的方法能够捕获到这个异常并进行处理。

Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。普通情况下是用try来运行一段程序,假设出现异常,系统会抛出(throws)一个异常,这时候你能够通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防全部“异常”的程序。紧跟在try程序后面,应包括一个catch子句来指定你想要捕捉的“异常”的类型。
throw语句用来明白地抛出一个“异常”。
throws用来标明一个成员函数可能抛出的各种“异常”。
Finally为确保一段代码无论发生什么“异常”都被运行一段代码。
能够在一个成员函数调用的外面写一个try语句,在这个成员函数内部写还有一个try语句保护其它代码。

每当遇到一个try语句,“异常”的框架就放到堆栈上面。直到全部的try语句都完毕。假设下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这样的“异常”的try语句。

20、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承。请说出他们各自是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream。字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有更多的流。主要是为了提高性能和使用方便。
21、java中会存在内存泄漏吗。请简单描写叙述。
会。如:int i,i2; return (i-i2); //when i为足够大的正数,i2为足够大的负数。

结果会造成溢位,导致错误。

22、java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现。重载Overloading是一个类中多态性的一种表现。
23、垃圾回收器的基本原理是什么?垃圾回收器能够立即回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说。当程序猿创建对象时,GC就開始监控这个对象的地址、大小以及使用情况。通常,GC採用有向图的方式记录和管理堆(heap)中的全部对象。通过这样的方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

能够。程序猿能够手动运行System.gc(),通知GC运行,可是Java语言规范并不保证GC一定会运行。

24、什么是java序列化,怎样实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。能够对流化后的对象进行读写操作。也可将流化后的对象传输于网络之间。

序列化是为了解决在对对象流进行读写操作时所引发的问题。


序列化的实现:将须要被序列化的类实现Serializable接口,该接口没有须要实现的方法。implements Serializable仅仅是为了标注该对象是可被序列化的。然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就能够将參数为obj的对象写出(即保存其状态)。要恢复的话则用输入流。

25、说出一些经常使用的类,包,接口,请各举5
经常使用的类:BufferedReader BufferedWriter FileReaderFileWirter String Integer
经常使用的包:java.lang java.awt java.io java.util java.sql
经常使用的接口:Remote List Map Document NodeList 

26:对象与实例有什么差别?

 

解析:在Java的内存分配中,对象和实例是不同的,前者分配在内存堆里,后者分配在堆栈里,至于为什么要这样分。參考一下其它的资料。对象是不变的东西,它是对客观事物的抽象。实例是对操作对象的引用。你不能直接操作对象。



答案:对象和实例从宏观的角度看,差别是:对象是同类事物的一种抽象表现形式,而实例是对象的详细化,一个对象能够实例化非常多实例,对象就是一个模型。实例是照着这个模型生产的终于产品。实际上就是这样,一个对象能够实例化N个实例。

就像依据一个模型能够制造多个实际的产品一样。

从内存分配的角度来看,对象是保存在堆中的。而实例是存储在栈中的。实例事实上仅仅是对象的一个引用。也就是指向对象的指针。



27:Java中全部的类都继承了java.lang.Object类,而在C++中没有像java.lang.Object这种类,这是为什么呢?都是面向对象。Java这样做有什么优点呢?

解析:Java採用的是单根结构,全部的类都继承了java.lang.Object类。对于Java这样的纯面向对象的语言来说,这样的设计具有非常好的灵活性,比方对垃圾收集来说非常有利。全部的类都具有java.lang.Object类具有的方法等。C++没有很多其它这样的方法,大概是为了向后兼容。

向C兼容。满足它设计上最大的灵活性。



答案:C++的特点是指针,一个指针能够指向不论什么的对象、结构、基本类型、函数。



Java没有指针类型,所以Java用Object基础类的共同特征来实现全部对象类型之间的转换。

28:声明与定义之间的差别是什么?在Java里声明和定义是否能分开?

解析:

声明:一种把一个名称引入或者又一次引入到某个作用域的构造。

定义:它也是一种声明。但该声明必须给出被声明实体的细节。

对于变量而言,这里的细节是指:为被声明实体保留存储空间。

对于class类型和函数定义而言,指的是包括有一对花括号内容的声明。

对于外部变量而言,指的是前面没有keywordextern或者在声明时就进行初始化。

变量的声明有下面两种情况。

一种是须要建立存储空间的。比如,int a 在声明的时候就已经建立了存储空间。

还有一种是不须要建立存储空间的。比如。extern int a。当中。变量a是在别的文件里定义的。前者是“定义性声明(defining declaration)”。或者称为“定义(definition)”。而后者是“引用性声明(referencingdeclaration)”。

从广义的角度来讲,声明中包括着定义,可是并不是全部的声明都是定义。比如int a,它既是声明,同一时候又是定义。

然而对于 extern a来讲,它仅仅是声明不是定义。在一般的情况下我们经常这样叙述,把建立空间的声明称为“定义”,而把不须要建立存储空间的声明称为“声明”。非常明显在这里指的声明的范围是比較窄的。也就是说非定义性质的声明。

答案:

变量的定义和声明的差别在于是否分配内存,假设分配内存就是定义,否则就是声明。

类中的变量仅仅是声明而不是定义,由于它仅仅是类声明的一部分。不同于变量的定义。类的定义是一种新的类型的定义。仅仅有实例化后才会分配内存。所以类成员变量仅仅是声明而不是定义。

在Java中,利用Interface,也能够将声明和实现分开。例如以下所看到的。

 //MyInterface.java  
  public  interface   MyInterface 
 {  
       void   method();  
  }  
 //MyImpl.java  
  public  class   implements   MyInterface 
 {  
       public   void   method()
       {  
             //……
       }  
 }  



原文地址:https://www.cnblogs.com/bhlsheji/p/5321967.html