吾日三省吾身、温故而知新

题目1:final在Java中的作用?
答案1:final修饰基本数据类型变量和引用数据类型变量
被final修饰的常量在编译阶段会被放入常量池中
在局部或者匿名内部类在使用外部局部变量时只能使用被final修饰的变量。
修饰类:使用final修饰类的目的简单明确: 表明这个类不能被继承.
final可以修饰方法(在方法非常庞大的时候,这样的内嵌手段是几乎看不到任何性能上的提升的,在最近的Java版本中,不需要使用final方法进行这些优化了

题目2:普通类和抽象类有哪些区别?
答案2:抽象类不能被实例化。
抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
含有抽象方法的类必须申明为抽象类
抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。

题目3:Java中操作字符串都有哪些类型?它们之间的有什么区别?
答案3:Java中操作字符串分为String、StringBuilder、StringBuffer三个类,这三个类之间主要的区别在”运行速度“和”线程安全“方面。
(1)运行速度(执行速度):StringBuilder>StringBuffer>String
String最慢的原因:下面的例子表面上看是abc+def组成abcdef的结果,但我们仔细分析一下,首先String先创建一个对象abc然后在abc=abc+def加起来再赋值给一个新的abc,而原来的abc被JVM的GC(回收机制)给回收掉了,所以实际上这两个abc不是同一个abc,所以String操作字符串的过程是一个不断创建对象和回收对象的过程。String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
(2)线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

题目4:面向对象的特征有哪些方面,具体有何含义?
答案4:
面向对象的三大特征:1.继承 2.封装 3.多态性
(1)继承:就是保留父类的属性,开扩新的东西。通过子类可以实现继承,子类继承父类的所有状态和行为,同时添加自身的状态和行为。

(2)封装:就是类的私有化。将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰。

(3)多态:是允许将父对象设置成为和一个和多个它的子对象相等的技术。包括重载和重写。重载为编译时多态,重写是运行时多态

题目5:定义长方形类,含:
属性:宽、高(整型);
方法:求周长、面积;
构造方法3个:
(1)无参——宽、高默认值为1;
(2)1个参数——宽、高均为参数值;
(3)2个参数——宽、高各为参数值。
写出代码并得出打印结果。
答案5:
定义类://定义长宽属性
private int iWidth; private int iHeight;
//构造器1
public Rectangle(){
this.iHeight = 1;this.iWidth = 1;
}
//构造器2
public Rectangle(int iIndex){
this.iWidth = iIndex;
this.iHeight = iIndex;
}
//构造器3
public Rectangle(int iWidth, int iHeight){
this.iHeight = iHeight;this.iWidth = iWidth;
}
//求周长
public int getLength(){
return 2*(this.iHeight+this.iWidth);
}
//求面积
public int getSquare(){
return this.iHeight*this.iWidth;
}

测试类:public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle oRec1 = new Rectangle();
System.out.println(“默认长方形的周长为:”+oRec1.getLength());
System.out.println(“默认长方形的面积为:”+oRec1.getSquare());

Rectangle oRec2 = new Rectangle(2);
System.out.println("一个参数长方形的周长为:"+oRec2.getLength());
System.out.println("一个参数长方形的面积为:"+oRec2.getSquare());

Rectangle oRec3 = new Rectangle(2,3);
System.out.println("两个参数长方形的周长为:"+oRec3.getLength());
System.out.println("两个参数长方形的面积为:"+oRec3.getSquare());

}
打印结果:默认长方形的周长为:4
默认长方形的面积为:1
一个参数长方形的周长为:8
一个参数长方形的面积为:4
两个参数长方形的周长为:10
两个参数长方形的面积为:6

题目6:运行时异常和编译时异常在运行时候的区别,为什么/0这种运行时异常不用写判断语句?那么编译时异 常又怎么实现捕获的?
答案6:运行时异常:都是RuntimeException类及其子类异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。是必须进行处理的异常,如果不处理,程序就不能编译通过。
程序就不能编译通过 /0这种运行是系统自己会处理 编译异常可以自己处理异常,也可以抛出异常不处理

题目7:String类型new对象时总共创建了几次?
答案7:这个创建2个class;2次,常量池一次,堆一次

题目8:启动一个线程用run()还是start()
答案8:启动一个线程用的是start()方法,使线程进入就绪状态,以后可以被调度为运行状态。run(方法是线程的线程执行体,是线程将要完成的事

题目9:Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
答案9:
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,
将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,
请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(
线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)
时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

题目10:请说出与线程同步以及线程调度相关的方法。
答案10:
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程进入休眠状态
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒 某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是 让它们竞争,只有获得锁的线程才能进入就绪状态;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章