Java-基础面试题

2 篇文章 0 订阅

目录

一、Java数据类型

二、i+1小于i   Java溢出问题

三、int 与 Integer

四、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

五、float 与 double

六、Java中switch都可以支持哪些数据类型

七、Java中,length属性,length()方法,size()方法的区别

八、final

九、static

十、abstract

十一、抽象类真的不能实例化么

十二、接口

十三、抽象类和接口的区别

十四、Comparable 和 Comparator



一、Java数据类型

基本数据类型包装类型
intInteger
shortShort
longLong
byte

Byte

float

Float

doubleDouble
charCharactor
booleanBoolean

二、i+1小于i   Java溢出问题

解释:https://www.pianshen.com/article/5573987976/

原、反、补:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

是否存在数i  ,使得 i + 1 < i?是否存在数i  ,使得 i -  1 > i?

是否存在数i  ,使得 i + 1 = i   或则   i + 1 < i ?存在使i > j || i <= j不成立的数吗?

都存在

二进制:0111是7;-7是0111取反->1000(反码)+1->1001(补码)

计算机不会自己报溢出,他会默默的计算完之后,把超出的高位舍去,余下的值代表结果值。

i 如果等于int的最大值,i+1就等于-1。

PS:补一个会高位会舍去的例子,当0111+0111的时候 ,他的结果值是多少呢?

11110,结果是1110,因为它已经你超出了4位了,所以高位的1被舍去了,所以结果就是1110,因为高位是1所以他是负数,具体是多少。

三、int 与 Integer

  1. 很多方法参数只接受对象类型(Object)
  2. 数据库操作中某数值列允许为null,只能使用 Integer
  3. Integer 必须实例化才能使用,int 不需要
  4. Integer 是对象引用,指向new的对象,int 是直接存储数据值
  5. Integer 默认值 null,int 默认值 0
  6. 两个非new的Integer,在-128~127范围内为true,否则为false

装箱:to=Integer.valueOf(1)

拆箱:to.intValue()

四、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。

而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。

五、float 与 double

当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f

1、Java中3*0.1==0.3将会返回什么?true还是false?

false,因为浮点数不能完全精确的表示出来,一般会损失精度。

2、Java中float f = 3.4;是否正确?

不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型会造成精度损失,因此需要强制类型转换float f = (float)3.4;或者写成 float f = 3.4f;才可以。

3、float a=1.23456789;第7位将四舍五入。

六、Java中switch都可以支持哪些数据类型

  1. 在JDK1.5之前,switch循环只支持byte short char int四种数据类型
  2. JDK1.5 在switch循环中增加了枚举类与byte short char int的包装类,对四个包装类的支持是因为java编译器在底层手动进行拆箱,而对枚举类的支持是因为枚举类有一个ordinal方法,该方法实际上是一个int类型的数值
  3. jdk1.7开始支持String类型,但实际上String类型有一个hashCode算法,结果也是int类型.而byte short char类型可以在不损失精度的情况下向上转型成int类型.所以总的来说,可以认为switch中只支持int

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的

七、Java中,length属性,length()方法,size()方法的区别

  1. 在java语言中,数组提供了length属性来获取数组的长度;
  2. length()方法是针对字符串而言的,String提供length()方法来计算字符串的长度;
  3. size方法是针对泛型集合而言的,用于查看泛型中有多少元素。

八、final

用于修饰类、属性和方法;

  1. 被final修饰的类不可以被继承
  2. 被final修饰的方法不可以被重写
  3. 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

九、static

  • static是类初始化的时候加载,而非静态资源是类new的时候加载
  • 静态方法不能引用非静态资源,静态方法可以引用静态资源,非静态方法可以用静态资源

1、static关键字修饰类:java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以

2、static关键字修饰方法:修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用

3、static关键字修饰变量:被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的

十、abstract

普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。

抽象类和普通类的主要有三点区别:

  1. 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
  2. 抽象类不能用来创建对象;
  3. 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

十一、抽象类真的不能实例化么

抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用来指向子类的实例来间接地实现父类的实例化(因为子类要实例化前,一定会先实例化他的父类。这样创建了继承抽象类的子类的对象,也就把其父类(抽象类)给实例化了

但是:接口是不能被实例化的(接口压根就没有构造函数

另外:

Calendar中的getInstance()
Calendar Cal =  Calendar.getInstance();  
Calendar是抽象类不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。过父类的引用来指向子类的实例来间接地实现父类的实例化。
同时,使用getInstance()有诸多好处:
1、new 一定要生成一个新对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
2、new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。

十二、接口

  1. 接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)
  2. 方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)
  3. 接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

十三、抽象类和接口的区别

  1. 接口中的所有方法必须都是抽象的,不能有非抽象的普通方法(所有方法在接口中不能有实现);而抽象类中可以包含非抽象的普通方法。
  2. 接口中不能有构造方法,抽象类可以有构造方法。
  3. 接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。
  4. 一个类可以实现多个接口,但只能继承一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。
  5. 接口中的抽象方法只能是public类型的,并且默认修饰符是public;抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
  6. 接口中不能包含静态方法;抽象类中可以包含静态方法。
  7. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

接口和抽象类的相同点:

  1. 都可以被继承
  2. 都不能被实例化
  3. 都可以包含方法声明
  4. 派生类必须实现未实现的方法

十四、Comparable 和 Comparator

Comparable 简介

Comparable 是排序接口。
若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。


Comparator 简介

Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

int compare(T o1, T o2)和上面的x.compareTo(y)类似,定义排序规则后返回正数,零和负数分别代表大于,等于和小于。
两者的联系

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值