1. 什么是多态性?什么是虚拟方法调用?
对象的多态性:父类的引用指向子类的对象。
Person p = new Man(); // 左父右子
p.eat();
调用方法时,编译时看左边,运行时看右边。
虚拟方法调用与普通调用:
正常的方法调用:
V1 e = new V1();
e.setz();
Test3 e = new Test3();
e.setz();
虚拟方法调用(多态情况下):
V1 e = new Test3();
e.setz(); //调用Test3类的getInfo()方法
2. 一个类可以有几个直接父类?一个父类可有多少个子类?子类能获取直接父类的父类中的结构吗?子类能否获取父类中private权限的属性或方法?
一个类只能有一个父类
一个父类可以被任意数量的子类继承
并不能直接获取,如果父类的一些成员被private修饰,那么子类是无法访问的
默认default权限修饰的情况,子类必须和父类同一包下才可访问
如果要异包访问,父类的成员必须声明protected
3. 方法的重写(override/overwrite)的具体规则有哪些?
方法名、形参列表相同
权限修饰符
返回值
抛出的异常
4. super调用构造器,有哪些具体的注意点
this() 调用本类构造器
super() 向上访问父类构造器
super()和this()均需放在构造方法内第一行。
5. 在下面的代码结构中:使用关键字:this,super;方法的重写;继承;
// 圆类
publicclass Circle {
// 半径
private double radius;
// 初始化1
public Circle(){
this.radius = 1;
}
// getter
public double getRadius() {
return radius;
}
// setter
public void setRadius(double radius) {
this.radius = radius;
}
// 求面积
public double getRoundArea(){
return Math.PI * Math.pow(radius,2);
}
}
// 圆柱体类
classCylinder extends Circle{
// 柱长
private double length;
// 初始化1
public Cylinder(){
super();
length = 1;
}
// GETTER
public double getLength() {
return length;
}
//SETTER
public void setLength(double length) {
this.length = length;
}
// 圆柱体积
public double getVolume(){
return getRoundArea() * length;
}
// 圆柱表面积
public double getSurfaceArea(){
// 柱面
final double RECTANGLE_AREA = 2 *Math.PI * getRadius();
// 上底 + 下底
final double UP_AND_DOWN = 2 *getRoundArea();
// 上底下底 + 柱面
return RECTANGLE_AREA + UP_AND_DOWN;
}
}
6. 如何实现向下转型?需要注意什么问题?如何解决此问题?
Person p = new Man();
//使用强转符:()
Man m = (Man)p;
//可能ClassCastException异常。
//使用instanceof在进行向下转型前判断。
if(p instanceof Man){
Manm = (Man)p;
}
7. == 和equals()有何区别?
==用于基本数据类型用比较,比较的是值是否相等
==用于引用类型对象,比较的是在内存中的地址是否相等
Equals表示引用所指内容是否相等。
8. classUser{
String name;
int age;
//重写其equals()方法
public boolean equals(Object object){
if (this == object) return true;
else if (object instanceof User){
User user = (User) object;
if (this.age == user .age && this.name.equals(user .name))
return true;
}
return false;
}
}
9. 写出8种基本数据类型及其对应的包装类
boolean Boolean
char Chracter
byte Byte
short Short
int Integer
long Long
float Float
double Double
10.基本数据类型、包装类与String三者之间如何转换
基本数据类型 和 包装类 自动装箱和拆箱
包装类 和 String
包装类数值 转 字符串 String.valueOf( 包装类对象 )
字符串 转 包装类数值 Integer.parseInt(字符串)
11、static修饰的属性,相较于实例变量,有哪些特别之处(>=3点)
静态属性 优先 成员属性 加载
静态属性在内存空间是唯一的 多个实例访问静态变量都是同一个静态变量,存在在方法区的静态域
对象可以this.static修饰的属性进行访问
12.final 可以用来修饰哪些结构,分别表示什么意思
可修饰 类、方法、属性、局部变量
- 修饰局部变量表示,这个变量有且只能有唯一的一次赋值
- 修饰属性,同局部一样,但是可以使用显示声明、构造器注入、代码块注入
- 修饰方法, 表示此方法不能被重写,但是可以被重载
- 修饰类,表示类不能被继承,也表示默认隐式的表示方法不能被重写
13. 代码实现单例模式的饿汉式
class Singleton{
private Singleton(){}
private static final Singleton INSTANCE =new Singleton();
public static Singleton getInstance(){
return INSTANCE;
}
}
14、代码实现单例模式的懒汉式 -目前还是线程不安全的。
class Singleton{
private Singleton(){}
private static volatile Singleton instance;
public static Singleton getInstance(){
if (instance == null) synchronized(Singleton.class) {
if (instance == null) instance =new Singleton();
}
return instance;
}
}
15、类的属性赋值的位置有哪些?先后顺序为何?
隐式默认 - 显示初始化 - 代码块初始化 - 构造器注入 -setter注入/对象.属性注入
16.abstract 能修饰哪些结构?修饰以后,有什么特点?
修饰类 该类即为抽象类,不能实例化
修饰方法 该方法即为抽象方法 ,不能有方法体存在
17.接口是否能继承接口? 抽象类是否能实现(implements)接口? 抽象类是否能继承非抽象的类?
接口可以基础接口,还允许继承多接口
- 抽象类可以实现接口,可以不完全实现接口中的抽象方法
- 抽象类可以继承普通类
18、抽象类和接口有哪些共同点和区别?
都不能实例化,可以被继承
- 抽象类有构造器,但是接口没有
- 抽象类只能单继承,接口可以多接口继承
19.遍历一个List有哪些不同的方式?
遍历方式有以下几种:
1、for循环遍历:基于计数器,在集合的外部维护一个计数器,然后依次读取每一个位置的元素,当读到最后一个元素时停止。
2、迭代器遍历:iterator是面向对象的一个设计模式,目前是屏蔽不同数据集和的特点,统一遍历集合的接口。java在Collections中支持了iterator模式。
3、foreach循环遍历:foreach内部也是采用了iterator的方式实现,使用时不需要显示声明iterator或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程操作数据集合,如删除、替换等。
20.Array和ArrayList有何区别?什么时候更适合用Array?
Array:它是数组,申明数组的时候就要初始化并确定长度,长度不可变,而且它只能存储同一类型的数据,比如申明为String类型的数组,那么它只能存储S听类型数据
ArrayList:它是一个集合,需要先申明,然后再添加数据,长度是根据内容的多少而改变的,ArrayList可以存放不同类型的数据,在存储基本类型数据的时候要使用基本数据类型的包装类
当能确定长度并且数据类型一致的时候就可以用数组,其他时候使用ArrayList
21.List和 Map区别?
list和map是两种不同的数据结构,list是列表,map是键值对。 list是存储单列数据的集合,map是存储键和值这样的双列数据的集合, List中存储的数据是有顺序,并且允许重复; Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
22.List,Set, Map是否继承自Collection接口?
List,Set是继承自Collection接口
Map是Map的顶层接口
23.List、Map、Set三个接口,存取元素时,各有什么特点?
List
特有方法get(int index):因为List集合是有索引且存储有序的,可以按照存储顺序取元素
也可以使用迭代器和增强型for循环进行获取值
Set
Set集合因无序存储且无索引,只能够使用迭代器(Iterator)和增强型for循环进行取元素
迭代器:使用hasNext作为where条件,使用next()取元素
增强型for循环:根据格式取出值
Map
Map是双列集合,所以存在取键和值
获取键
使用keySet()方法:获取key的Set集合
获取值
get( Object key):根据键获取值
entrySet();获取entry的Set集合,而entry是键值对的封装
24.你所知道的集合类都有哪些?主要方法?
最常用的集合类接口是List 和 Map。 List的具体实现包括ArrayList、Vector、LinkedList,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。 Set的具体实现包括HashSet和TreeSet,它们也是可变大小集合,但不适合用索引取值。 Map 提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。 ArrayList/Vector、LinkedList HashSet/TreeSetàSet Properties/HashTable/TreeMap/HashMap List的主要方法有: add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty Set的主要方法有: add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty Map的主要方法有: put、get、keySet、values、entrySet、clear、remove、isEmpty
25.string和int如何实现互相转换
int -> String
int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf(i);
第三种:String s = Integer.toString(i);
String -> int
s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue();