Java面试题库:Java基础(二)

发布时间: 5年前 (2019-11-28)浏览: 1062评论: 0
31.谈谈Java的多态


实现多态的三个条件(前提条件,向上转型、向下转型)
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Student person = new Student()
将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。
向下转型 Student stu = (Student)person;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常---ClassCastException
32.简述Java的垃圾回收机制
传统的C/C++语言,需要程序员负责回收已经分配内存。
显式回收垃圾回收的缺点:
1)程序忘记及时回收,从而导致内存泄露,降低系统性能。
2)程序错误回收程序核心类库的内存,导致系统崩溃。
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制,简称GC;
1)可以提高编程效率。
2)保护程序的完整性。
3)其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
垃圾回收机制的 特点
1)垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据。
2)对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。
3)垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
4)可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
现在的JVM有多种垃圾回收 实现算法,表现各异。
垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
33.基本数据类型和包装类
1) 八个基本数据类型的包装类


基本数据类型
包装类
byte
Byte
boolean
Boolean
short
Short
char
Character
int
Integer
long
Long
float
Float
double
Double


2)为什么为基本类型引入包装类
2.1基本数据类型有方便之处,简单、高效。
2.2但是Java中的基本数据类型却是不面向对象的(没有属性、方法),这在实际使用时存在很多的不便(比如集合的元素只能是Object)。
为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行包装,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
3) 包装类和基本数据类型之间的转换
3.1包装类------ wrapperInstance.xxxValue() ------>基本数据类型
3.2包装类-------new WrapperClass(primitive)
3.2包装类-------new WrapperClass(primitive)
4) 自动装箱和自动拆箱
JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 从而实现了包装类和基本数据类型之间的自动转换
5) 包装类还可以实现基本类型变量和字符串之间的转换
基本类型变量--->String.valueof()--->字符串 基本类型变量<---WrapperClass.parseXxx(string)---字符串
34.Integer与int的区别
int是java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
int是java提供的8种原始数据类型之一,Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
35.java.sql.Date和java.util.Date的联系和区别
1) java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。
2)JAVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含2002/05/22 5:00:57 PM的字段,读取日期时得到的是2002/05/22,而读取时间时得到的是5:00:57 PM. 你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。从数据库里读取日期 试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。.sql.Timestamp类比java.util.Date类精确度要高。这个类包了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用...
总之,java.util.Date 就是Java的日期对象,而java.sql.Date 是针对SQL语句使用的,只包含日期而没有时间部分。
36.使用递归算法输出某个目录下所有文件和子目录列表


  • package com.geekshow;import java.io.File;
  • public class $ {public static void main(String[] args) { 
           String path = "D:/301SXT";        test(path);    }    private static void test(String path) {        File f = new File(path);        File[] fs = f.listFiles();        if (fs == null) {            return;        }        for (File file : fs) {            if (file.isFile()) {                System.out.println(file.getPath());            } else {                test(file.getPath());            }        }    }
37.关于Java编译,下面哪一个正确()(选择一项)


A
Java程序经编译后产生machine code
B.
Java程序经编译后会生产byte code
C.
Java程序经编译后会产生DLL
D.
以上都不正确
答案:B
分析:Java是解释型语言,编译出来的是字节码;因此A不正确,C是C/C++语言编译动态链接库的文件为.DLL;正确答案为B


38.下列说法正确的有()(选择一项)


A
class中的construtor不可省略
B.
construtor与class同名,但方法不能与class同名
C.
construtor在一个对象被new时执行
D.
一个class只能定义一个construtor
答案:C
分析:A:如果class中的construtor省略不写,系统会默认提供一个无参构造
B:方法名可以与类名同名,只是不符合命名规范
D:一个class中可以定义N多个construtor,这些construtor构成构造方法的重载


39.Java中接口的修饰符可以为()(选择一项)


A
private
B.
protected
C.
final
D.
abstract
答案:D
分析:接口中的访问权限修饰符只可以是public或default
接口中的所有的方法必须要实现类实现,所以不能使用final
接口中所有的方法默认都是abstract的,所以接口可以使用abstract修饰,但通常abstract可以省略不写


40.给定以下代码,程序将输出 ()(选择一项)



  • class A {    public A() {      System.out.println("A");    }  }  class B extends A {    public B() {      System.out.println("B");    }    public static void main(String[] args) {      B b = new B();    }  }

A
不能通过编译
B.
通过编译,输出AB
C.
通过编译,输出B
D.
通过编译,输出A
答案:B
分析:在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法。


41.下列关于关键字的使用说法错误的是()(选择一项)


A
abstract不能与final并列修饰同一个类
B.
abstract类中可以有private的成员
C.
abstract方法必须在abstract类中
D.
static方法能处理非static的属性
答案:D
分析:因为static得方法在装载class得时候首先完成,比 构造方法早,此时非static得属性和方法还没有完成初始化所以不能调用。


42.下列哪些语句关于内存回收的说法是正确的()(选择一项)


A
程序员必须创建一个线程来释放内存
B.
内存回收程序负责释放无用内存
C.
内存回收程序允许程序员直接释放内存
D.
内存回收程序可以在指定的时间释放内存对象
答案:B
分析:A. 程序员不需要创建线程来释放内存.
C. 也不允许程序员直接释放内存.
D. 不一定在什么时刻执行垃圾回收.


43.选出合理的标识符()(选择两项)


A
_sysl_111
B.
2 mail
C.
$change
D.
class
答案:AC
分析:标识符的命令规范,可以包含字母、数字、下划线、$,不能以数字开头,不能是Java关键字


44.下列说法正确的是()(选择多项)


A
java.lang.Cloneable是类
B.
java.langRunnable是接口
C.
Double对象在java.lang包中
D.
Double a=1.0是正确的java语句
Double a=1.0是正确的java语句
分析:java.lang.Cloneable是接口


45.定义一个类名为”MyClass.java”的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明为()(选择两项)


A
45.定义一个类名为”MyClass.java”的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明为()(选择两项)
B.
class MyClass extends Object
C.
public class MyClass
D.
public class MyClass extends Object
答案:CD
分析:A 类的访问权限只能是public或default
B使用默认访问权限的类,只能在本包中访问


46.面向对象的特征有哪些方面?请用生活中的例子来描述。
答: 面向对象的三大特征:封装、继承、多态。
举例:(比如设计一个游戏)我现在创建了一个对象,名叫战士。
战士的属性是—性别,年龄,职业,等级,战斗力,血量。
它的方法—战斗,逃跑,吃饭,睡觉,死。
后来,我又建了一个对象,叫人。
属性:性别,年龄,职业,等级,血量
方法:逃跑,吃饭,睡觉,死。
我让人,成为战士的父类,战士可以直接继承人的属性和方法。
战士修改成—
属性:战斗力。
方法:战斗。
看上去战士的资料变少了,实际上没有,我们仍然可以调用方法—战士.死。
而且我们还可以重载战士.死的方法,简称重载死法。
我还建了一个对象—法师,父类也是人。
属性:法力值
方法:施法,泡妞。
你看,用了继承,创建对象变得更方便了。
再后来,我又建立了一个对象,叫怪物。
属性:等级,战力,血量。
方法:战斗,死。
建了个对象,叫白兔怪,父类怪物,可继承怪物所有的属性和方法。
属性:毛色。
方法:卖萌,吃胡萝卜。
47.说明内存泄漏和内存溢出的区别和联系,结合项目经验描述Java程序中如何检测?如何解决?
答:
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
memory leak会最终会导致out of memory!
48.什么是Java的序列化,如何实现Java的序列化?列举在哪些程序中见过Java序列化?
答:Java中的序列化机制能够将一个实例对象(只序列化对象的属性值,而不会去序列化什么所谓的方法。)的状态信息写入到一个字节流中使其可以通过socket进行传输、或者持久化到存储数据库或文件系统中;然后在需要的时候通过字节流中的信息来重构一个相同的对象。一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
49.不通过构造函数也能创建对象吗?
答:Java创建对象的几种方式(重要):
1、 用new语句创建对象,这是最常见的创建对象的方法。
2、 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3、 调用对象的clone()方法。
4、运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。
50.匿名内部类可不可以继承或实现接口。为什么?
答:匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.
1、由于匿名内部类没有名字,所以它没有构造函数。因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,换言之:匿名内部类完全把创建对象的任务交给了父类去完成。
2、在匿名内部类里创建新的方法没有太大意义,但它可以通过覆盖父类的方法达到神奇效果,如上例所示。这是多态性的体现。
3、因为匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。



标签:

上一篇: Java面试题库:Java基础(三)
下一篇: Java面试题库:Java基础(一)

相关文章暂无相关
评论列表暂无评论
发表评论
验证码

«   2024年4月   »
1234567
891011121314
15161718192021
22232425262728
2930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接
    • RainbowSoft Studio Z-Blog
    • 订阅本站的 RSS 2.0 新闻聚合
    ︿
    Top