欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JAVA面试-java基础篇,

来源: javaer 分享于  点击 14486 次 点评:182

JAVA面试-java基础篇,


1.面向对象的特征有哪些方面?
答:面向对象的特征主要有以下几个方面:
1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段
3)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;
 4)多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情(多态就是同一个接口,使用不同的实例而执行不同操作)。
多态性分为编译时的多态性和运行时的多态性。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
多态的条件:继承、重写、父类引用指向子类对象Parentp = new Child();
 
重载和重写的区别
重载(overloading):在一个类中,方法名相同,参数类型或个数不同,返回值可以相同,也可以不同
重写(overiding):在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样
 
2.Java中的基本数据类型只有8个:boolean,byte, char, short,  int(-2^31-2^31-1), long, float, double
封装类:Boolean, Byte, Character, Short,Integer, Long, Float, Double,
基本类型 转换原则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换
引用类型 转换原则:是自动装箱和折箱
byte,short,char—> int —> long—> float —> double
 
3. 访问修饰符的权限
default (即缺省,什么也不写): 在同一包内可见(包中的所有类)
private : 在同一类内可见(当前类)
public : 对所有类可见(全部)
protected : 对同一包内的类和所有子类可见
 
4. a++ 的含义是先赋值后相加,如 b=a++; 先将a的值赋给b,然后a再加上1;
++a的含义是先相加后赋值,如 b=++a 先将a加上1,然后再把加上1的a赋给b.
 
5. .String、StringBuffer和StringBuilder的总结
1).  String和StringBuffer、StringBuilder相比,String是不可变的,String的每次修改操作都是在内存中重新new一个对象出来,而StringBuffer、StringBuilder则不用,并且提供了一定的缓存功能,
2).  StringBuffer和StringBuilder相比,StringBuffer是synchronized的,是线程安全的,而StringBuilder是非线程安全的,单线程情况下性能更好一点;使用StringBuffer和StringBuilder时,可以适当考虑下初始化大小,较少扩容的次数,提高代码的高效性三者在执行速度方面的比较:StringBuilder>  StringBuffer  >  String
1.如果要操作少量的数据用 String
 2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
 3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer
抽象类
抽象类的定义:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类;实际上抽象类除了被继承之外没有任何意义。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用
Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体
设计目的,是代码复用
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
接口
接口(interface),接口被用来建立类与类之间关联的标准。
设计目的,是对类的行为进行约束
接口类描述的是行为 抽象类描述的是根源; 
接口是对动作的抽象,而抽象类是对根源的抽象
什么时候使用抽象类和接口
使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
抽象类和接口的区别:
一:语法
1.一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法
3.类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,类也必须得声明成是抽象的
4.Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量
5.抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public staticfinal类型的
二:设计层次
1.抽象层次不同:抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2.跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为
3.设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可
内部类
一.定义:放在一个类的内部的类我们就叫内部类。
二.作用
1.内部类可以很好的实现隐藏,也就是封装性。一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承(这个特点非常重要,个人认为它是内部类存在的最大理由之一)
4.可以避免修改接口而实现同一个类中两种同名方法的调用
JAVA数据结构
枚举(Enumeration):接口定义了一种从数据结构中取回连续元素的方式。
位集合(BitSet):类,实现了一组可以单独设置和清除的位或标志。该类在处理一组布尔值的时候非常有用
向量(Vector):类,Vector对象的元素也能通过索引访问,Vector的大小能根据需要动态的变化
栈(Stack):实现了一个后进先出(LIFO)的数据结构
字典(Dictionary): 类,是一个抽象类,它定义了键映射到值的数据结构,通过特定的键而不是整数索引来访问数据
哈希表(Hashtable):类,提供了一种在用户定义键结构的基础上来组织数据的手段
属性(Properties):继承于 Hashtable.Properties 类表示了一个持久的属性集.属性列表中每个键及其对应值都是一个字符串
 
非访问修饰符
static 修饰符,用来修饰类、方法和类变量。
final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承修饰的方法不能被继承类重写修饰的变量为常量,是不可修改的。
abstract 修饰符,用来创建抽象类和抽象方法。
synchronized 和 volatile 修饰符,主要用于线程的编程
synchronized:关键字声明的方法同一时间只能被一个线程访问
volatile :修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值
transient :序列化的对象包含被 transient 修饰的实例变量时,不会被序列化
 
final, finally, finalize 的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
 
equals 与 == 的区别
public boolean equals(Objectobj) {
    return (this ==obj);
}
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断
==是操作符、等于,equals()是Object()类里的方法、相等
1. 基本数据类型比较(基本类型int、float、double、char等),只能用“==”来判断值相等性。
2. String类中比较(重写equals方法/integer、Double、Math等封装类也重写了)
1)不new String类对象时的比较:
==判断字符串地址是否相等(true),用“equals()”来判断字符串内容是否相等(true)。
2)比较new String类,用“==”来判断字符串地址是否相等(false),用“equals()”来判断字符串内容是否相等(true)。
4. 比较对象,用“==”来判断对象地址是否相等(false),"equals"比较的也是地址(false),没有重写equals方法的类都是调用的Object的equals的方法
equals和hashCode的比较
Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,对比两个对象是否相等一致
重写的equal()复杂,效率低;利用hashCode()进行对比,则只要生成一个hash值进行比较,效率高
Hashcode: 计算出对象实例的哈希码,并返回哈希码,hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时
对比规则:
先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高。
equals()相等的两个对象,hashcode()一定相等;反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。 
 
Throwable: 定义一个基类java.lang.Throwable作为所有异常的超类
1.一个分支是错误Error,程序无法处理的错误。Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
2.一个分支是异常Exception,它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常。
其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常。这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生
ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)等异常
异常处理机制:
Java的异常处理本质上是抛出异常和捕获异常
1.try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
2.catch:用于捕获异常。catch用来捕获try语句块中发生的异常。
3.finally:finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
4.throw:用于抛出异常。
5.throws:用在方法签名中,用于声明该方法可能抛出的异常。
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
 
length()方法,length属性和size()的方法的区别:
 1.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
 2.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性;
 3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看
Obiect类
Object是所有java类的祖宗
1.hashCode: 该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保相等的两个对象拥有相等的hashCode。
2.equale: 该方法用于比较对象是否相等,而且此方法必须被重写。
3.wait(),wait(long),wait(long,int),notify(),notifyAll() 
这几个函数体现的是Java的多线程机制,在使用的时候要求在synchronize语句中使用
wait()用于让当前线程失去操作权限,当前线程进入等待序列
notify():唤醒在对象上等待的某个线程
notifyAll():唤醒在该对象上等待的所有线程
wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔
4.toString():返回一个String对象,用来标识自己 (输出的是对象的地址,重写该方法能数据具体属性)
5.getClass: 返回一个Class对象
6.clone() : 用来另存一个当前存在的对象。
7.finalize():用于在垃圾回收
 

相关文章

    暂无相关文章
相关栏目:

用户点评