java 题目汇总

来源:互联网 发布:wwwtaoyitu淘宝号查询 编辑:程序博客网 时间:2024/06/05 06:21

持续更新......

1

byte a=3,b=4,c;

c=a+b;

c=3+4;

上面两句哪一句会编译失败呢?


分析:byte类型的变量在进行运算时,会先提升类型为int,而两个常量进行计算时,先算出结果,然看结果是否在要赋值的数据类型范围内。因此c=a+b编译失败


2

short s = 1; s = s + 1;

short s = 1; s += 1;

上面两行代码哪个可以通过编译?


分析:扩展的赋值运算符隐含了一个强制类型转换,故第二个可以通过编译。


3 成员变量和局部变量区别?

(1) 在类中的位置不同

         成员变量 在类中方法外

         局部变量 在方法定义中或者方法声明上

(2) 在内存中位置不一样

         成员变量 在堆内存

         局部变量 在栈内存

(3) 生命周期不同

         成员变量 随着对象的创建而存在 随着对象的消失而消失

         局部变量 随着方法的调用而存在 随着方法的调用完毕而消失

(4) 初始化值不同

         成员变量 有默认初始值

         局部变量 没有默认初始值 必须定义 赋值 然后才能使用



4 什么是封装?好处是什么?

隐藏对象的属性和实现细节,仅对外提供公共访问的方式。

好处:隐藏了实现细节,提供了公共的访问方式。 提高了代码的复用性。 提高了代码的安全性。


5 Student s = new Student();在内存中做了哪些事?

将Student.class文件加载到内存中

在栈内存上为s开辟空间

在堆内存上为学生对象开辟空间

对学生对象的成员变量进行默认初始化

对学生对象的成员变量进行显示初始化

通过构造方法对学生对象的成员变量赋值

学生对象初始化完毕,把对象的地址赋值给s变量


6 静态变量和成员变量有什么不同?

所属不同

         静态变量属于类 故也称为类变量

         成员变量属于对象 故也称为实例变量(对象变量)

内存中位置不同

         静态变量存储在方法区中的静态区中

         成员变量存储在堆内存

内存出现时间不同

         静态变量随着类的加载而加载 随着类的消失而消失

         成员变量随着对象的创建而存在 随着对象的消失而消失

调用不同

         静态变量可以通过类名调用 也可以通过对象名调用

         成员变量只能通过对象名调用


7 构造代码块静态代码块 构造方法的执行顺序?

静态代码块——构造代码块——构造方法

静态代码块只会执行一次,随着类的加载而加载(在main方法之前执行)。构造代码块在每次调用构造方法前都会执行


8 什么是继承?继承的好处?

多个类存在相同的属性和行为时,将这些内容抽取到一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
好处:提高了代码的复用性和可维护性。让类与类之间产生了关系,是多态的前提。
弊端:使类之间的耦合性增强


9 子类和父类初始化顺序的问题
要严格遵循先进行父类初始化再进行子类初始化,有静态代码块的要先执行。

父类静态代码块
子类静态代码快
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法

jvm会首先加载class文件,在遇见new指令时,会进行初始化操作:(先完成父类初始化)成员变量默认初始化——成员变量显示初始化——构造方法初始化


10 final变量初始化时机?

在对象构造完毕之前完成初始化即可。(在定义的时候或者在构造方法中)


11 多态的好处?弊端?

提高了代码的可维护性和可扩展性。

不能使用子类特有的功能。编译看左边即看父类,运行看右边。(可以通过向下转型使用子类特有功能)


12 重写的注意点

父类的非私有方法可以被子类重写
属性不会重写,仍然使用的是父类的属性
静态方法可以被重写,但是不会有多态的效果,调用的时候仍然调用的是父类的静态方法,因为静态方法属于类
final修饰的父类方法不可以被子类重写


13 abstract关键字与哪些关键字冲突?

private 被private修饰的方法只能在当前类中使用,但是abstract修饰的方法必须要被重写
final 不允许被重写
static 抽象方法没有方法体,static方法可以直接被类调用,类去调用一个没有方法体的方法毫无意义


14 接口成员的特点?

接口成员的特点
成员变量
只能是常量
默认修饰符public static final
构造方法
没有 因为接口主要是扩展功能的 而没有具体存在
成员方法
只能是抽象方法
默认修饰符是public abstract


15 抽象类与接口的区别
成员区别
抽象类:成员变量可以是变量也可以是常量 有构造方法 成员方法可以是抽象也可以非抽象
接口:成员变量只能是常量 成员方法只可以是抽象 没有构造方法
关系区别
类与类 继承 单继承 多层继承
类与接口 实现 单实现 多实现
接口与接口 单继承 多继承
设计理念区别
抽象类 定义的是该继承体系的共性功能 is a 关系
接口 定义的是该继承体系的扩展功能 like a 关系


16 内部类特点
内部类可以直接访问外部类的成员,包括私有
外部类要想访问内部类的成员,必须创建对象


匿名内部类实际上就是继承该类或者实现接口的子类匿名对象。
格式:new 类名或接口名(){
重写方法;
}
这里的类可以是抽象类也可以是具体类。


局部内部类:
可以直接访问外部类的成员
在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
局部内部类访问局部变量必须用final修饰。因为局部变量是随着方法的调用而调用,随着调用完毕而消失,而堆内存的内容不会立即消失。所以加final修饰,这样就变成了常量。对象仍然可以使用这个数据了。


成员内部类
内部类和外部类是没有继承关系的
通过外部类名限定this对象 Outer.this
可以使用private(保证安全性)和static修饰
外部类名.内部类名 对象名=外部类对象.内部类对象

17 ==和equals()方法区别
== 
  基本类型:比较的是值是否相同
  引用类型:比较的是地址值是否相同
equals()
  只能比较引用类型,默认时是比较地址值是否相同,但是我们可以重写该方法


直接输出一个对象名称默认是调用了该对象的toString()方法


18 字符串相关知识点

String是不可变的。

字符串如果是变量相加,要先开空间再相加

    如果是常量相加,则先相加然后在字符串常量池里面查找,如果有则返回,否则创建后再返回


19 分派的相关知识点

Human man = new Man();
Human woman = new Woman();
这里的man和woman是静态类型,也是外观类型,等式右边的称为实际类型。
静态类型在编译期可知,实际类型在运行期才能知道。


静态分派:方法重载时,是根据参数静态类型而不是实际类型作为判断依据的。静态类型在编译期间可知,因此在编译阶段,javac编译器就会根据参数的静态类型决定使用哪个重载版本。所有依赖静态类型来定位方法执行版本的分派称为静态分派。


动态分派:在运行期根据实际类型确定方法执行版本的分派过程称为静态分派。方法重写属于动态分派。


方法的参数和方法的接收者称为方法的宗量。
单分派:根据一个宗量对目标方法进行选择。
多分派:根据多于一个宗量对目标方法进行选择。


java语言的静态分派属于多分派 动态分派属于单分派


20 String,StringBuffer和StringBuilder区别?
  1    String是不可以改变的对象,StringBuffer和StringBuilder都是内容可以改变的。
   2    StringBuffer是线程安全的,同步的,效率低
        StringBuilder是线程不安全,非同步,效率高


21 数组和集合区别
    数组的长度是固定的,集合长度可变
    数组中存储的是用一种类型的元素,集合可以存储不同类型的元素
    数组可以存储基本数据类型,也可以存储引用数据类型。集合中只能存储引用数据类型


22 迭代器为什么定义成一个接口而不是一个类?  
    假设迭代器是一个类,这样我们就可以创建该类的对象,调用该类的方法实现集合的遍历。但是,在java中有很多集合类,各个集合类的数据结构是不同的,所以存储方式和遍历方式也是不同的。最终没有定义迭代器类。
无论你是哪种集合,你都应该具备获取元素的操作,并且最好辅助判断操作,这样,在获取前先进行判断就不容易出错,也就是说,判断和获取功能是一个集合遍历所具备的,所以我们把这两个功能提取出来,并不提供具体实现,这种方式就是接口。
那么,真正的具体实现在哪里呢?在真正的具体子类中,以内部类的方式体现。
源码如下:
public interface Iterator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();
}
public interface Collection extends Iterable {
Iterator iterator();
}
public interface  List extends Collection {
Iterator iterator();
}

public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext(){}
public Object next(){}
}
}


23 迭代器中的并发修改异常
    迭代器是依赖于集合存在的,在判断成功之后,集合中添加了新的元素,但是迭代器却不知道,因此报了ConcurrentModificationException
如何解决?
    1 迭代器迭代元素,使用迭代器修改元素
使用iterator的子接口ListIterator,有添加功能。是在刚才迭代元素的后面加入元素
    2 集合遍历元素,集合修改元素(普通for)
是在集合的尾部加入元素。


24 List子类的特点
     ArrayList:底层结构是数组,查询快,增删慢
线程不安全,效率高
     Vector:底层数据结构是数据,查询快,增删慢
线程安全,效率低
     LinkedList:底层数据结构是链表,查询慢,增删快
线程不安全,效率高


0 0
原创粉丝点击