1.java语言中的字符char可以存储一个中文汉字吗?为什么?
可以,因为java语言中的字符占用两个字节,汉字也占用两个字节,java语言采用的是Unicode编码。
2. float数据在内存中怎么存储的?
float类型数据在计算机中4个字节存储,遵循IEEE - 754格式标准:一个浮点数有两部分组成:底数m和指数e
底数部分:使用二进制数来表示此浮点数的实际值
指数部分:占用8bit的二进制,可表示数值范围为:0~255(指数范围为:-126 ~ 128)
如:17.625 ---> 1.001101 *2^4
3. a. short s= 1; s = s+1;
b. short s = 1;s +=1;
上面两个代码有没有问题?如果有,哪里有问题?
第一个有问题,因为扩展的赋值运算符其实隐含了一个强制类型转换。
因为 s = s+1;将s类型转换为int类型
而s+=1;不是等价于s = s+1;而是等价于 s= (s的数据类型)(s+1);
4.请实现两个整数变量的变换
public class OperatorTest{
public static void main(String[] args){
int a=10;
int b = 20;
// 方式一:使用第三方变量(开发中用)
int c = a;
a=b;
b =c;
//方式二:用位异或实现(面试用)。 左边:aba,右边:a^b
a = a^b;
b = a^b;
a = a^b;
//方式三:用变量相加的做法
a = a+b;
b = a-b;
a = a-b;
//方式四:一句话搞定
b = (a+b) - (a=b);
syso("a:"+a+",b:"+b);
}
}
5. 请用最有效的方式写出计算2乘以3的结果。
2<<3;
6.三个数比较大小一步搞定
int max = (a>b)?((a>c)?a:c):((b>c)?b:c);
7.Math.round(11.5)等于多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,
这些方法的作用与它们的英文名称的含义相对应,
例如,ceil的英文意义是天花板,该方法就表示向上取整,
所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;
floor的英文意义是地板,该方法就表示向下取整,
所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;
最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),
即将原来的数字加上0.5后再向下取整,
所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
8.是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,
才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。
也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,
如果从一个static方法中发出对非static方法的调用,
那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,
所以,一个static方法内部发出对非static方法的调用。
9.成员变量和局部变量的区别(理解)
(1)在类中的位置不同
成员变量:类中方法外
局部变量:方法定义中或者方法声明上
(2)在内存中的位置不同
成员变量:在堆中
局部变量:在栈中
(3)生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用
10.静态变量和非静态变量的区别?
* 语法定义上:
静态变量前要加static关键字
而非静态变量前则不加
* 内存中位置:
非静态变量:堆中
静态变量:静态方法区
* 生命期:
非静态变量:随着对象的创建而存在,随着对象的消失而消失
静态变量:随着类的加载而存在,
* 程序运行时的区别:
非静态变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,
只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了
11.Overload和Override的区别
override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。
对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,
就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。(抽象类)
在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,
通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行
。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,
不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,
例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
12.说说has a、like a与is a的区别。
答:is-a表示的是属于得关系。比如兔子属于一种动物(继承关系)。
like a:接口中定义的是该继承体系的扩展功能。
has-a表示组合,包含关系。比如兔子包含有腿,头等组件;
13. 线程如何同步和通讯。???????????????
14.抽象类的作用和特点
可以定义抽象方法
作用:定义了一种规则,要求子类必须实现
可以定义非抽象方法
作用:提高代码的复用性
特点:
抽象类和抽象方法必须用abstract关键字修饰。
格式:abstract class 类名{};
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能被实例化,因为它不是具体的
如何实例化呢? ---> 按照多态的方式,有具体的子类实例化
抽象类的子类:a.抽象类;b.重写抽象类中的所有抽象方法
抽象类有构造方法:是由子类的super语句来调用,用于给抽象类中的成员初始化
15.一个类如果没有抽象方法,可不可以定义为抽象类?
可以,其目的是不能让创建对象
16.final关键字:
final是修饰符,可以修饰类,成员变量,成员方法
修饰类:不能被继承
修饰成员方法:不能被重写
修饰变量:变成常量(是一种自定义常量),只能赋值一次。 --->常量可分为:自定义常量、字面值常量
成员变量:
赋值时机:
显示初始化
构造方法结束之前(代码块中也可以)
构造方法结束之前(代码块中也可以)
局部变量:
赋值时机:
定义时赋值
17.常见的修饰符
public、protected、默认的和private是访问修饰符,可以修饰类,成员方法,成员变量,构造方法
static:可以修饰成员变量,成员方法
final:可以修饰类,方法,成员变量,局部变量
abstract:可以修饰类,成员方法
18.abstract不能可哪些关键字共存?
private(冲突)--->私有不能被继承,就不能被重写,而抽象类要求重写
final(冲突)--->抽象类不能和final共存,因为抽象类自身无法创建对象,
我们需要通过子类创建对象,一旦抽象类使用final关键字,那么抽象类就没有子类
static(无意义)--->一旦加static我们就可以通过类名直接访问抽象方法,
由于抽象方法没有方法体,没有任何意义,也不允许这样做
19.
//获取20-50之间的值
int num = r.nextInt(30)+20;//小公式:int num = r.nextInt(50-20)+20;