Java中数据类型面试相关知识点

1.Java中有哪些基本类型,有哪些引用类型?
2.自动类型转换和强制类型转换?
3.自动装箱和自动封箱?
4.final关键字?static关键字?
5.访问控制符private、default、protected、public作用域?
6.this关键字和super关键字?
7.栈内存和堆内存?
8.==和equal()有什么区别?

1.  Java中的基本类型有八种,可以分为三大类:布尔,数字,字符。
八种类型除了boolean,其他按照精度从小到大分别为byte、short、char、int、long、float、double。
不属于基本类型的都是引用类型,例如类、接口、数组、字符串等等。
2.  自动类型转换是精度较低的类型可以转换成精度较高的类型而不损失数据的内容。
(1)待转换的类型的精度一定要比目标转换类型的精度高;(2)两种类型要兼容,比如布尔类型和int类型不兼容,不能进行自动类型转换。

char a = 'a';
//int i = a;
//long i = a;
float i = a;
//类型兼容不报错
System.out.println(i);

//boolean b = false;
//int i = b;
//类型不兼容。编译不通过
强制类型转换可以将待转换类型强制转换成目标类型,但是可能会损失精度。
例如:
long l = 1;
int i = (int) l;

3.  自动装箱就是将基本类型的变量转换成引用类型的变量,例如将int类型转换成Integer;反之,自动封箱就是将引用类型转换成基本类型。
举例,定义一个int基本类型的变量 i ,你可以直接使用Integer引用类型来接收,此时称为自动装箱,自动调用的方法是Integer.valueOf(i);反之,你定义一个Integer类型的变量,可以使用int类型来接收,此时称为自动封箱,自动调用的方法为i.intValue();

int i = 1;
Integer integer = Integer.valueOf(i);
System.out.println(integer.getClass());

Double d = 2.0;
double d2 = d.doubleValue();
System.out.println(d2);

4.  final关键字的意思是不可变,可以用在不同的地方。(1)一个变量用final修饰表明这个是常量,必须给予初始化,且赋值之后不可变;(2)一个方法用final修饰表示这个方法不可以被重写;(3)一个类被final修饰表明这个类是最终类,不可以被继承。
  static可以修饰类中的成员,被static修饰的成员是共享一个存储单元的,推荐使用类名.静态成员来访问。(1)一个变量用static修饰表示这是一个静态变量;
(2)方法被static修饰表示这是一个静态方法;静态方法不能访问非静态成员,即不能访问非静态变量和非静态方法;非静态方法既可以访问静态成员也可以访问非静态成员。(3)用static可以修饰静态代码块,静态代码块在类被加载时被自动执行,且只执行一次。它的主要作用就是为类做一次初始化。(4)修饰内部类
5.  首先记住两个作用域,一个是是否在同一个包下,一个是是否是该类的子类。从严格到宽松排序,作用域分别是private、default、protected、public。
private:只有本类内的成员才能访问private成员;
default:本包下的外部类才可以访问default成员;
protected:本包下的外部类或者是不同包的该类的子类才能访问protected成员;
public:外部类在哪都能访问到public成员;

6.  this关键字指的是当前的对象,类似于一个指针,指向当前对象的地址,最常用的地方是写在类的构造函数中;
  super关键字主要用于在子类构造器中调用父类构造器,并且这个调用语句必须写在子类构造器函数的第一行。
7.  栈内存中存储基本数据类型以及它的值,存储引用数据类型的地址(或者叫引用、指针),引用数据类型的真正的对象地址存储在堆内存中。例如new出来一个String对象 s ,在栈内存中存储这个s对象的名字和s对象的真正的堆内存地址的引用。
栈内存和堆内存详细解释
8.  (1)首先说明“==”,对于基本类型来说,比较的是值是否相同,对于引用类型来说,比较的是引用(地址)是否相同。

int a = 1;
int b = 2;
System.out.println(a==b);//false

Integer i = new Integer(1);
Integer c = new Integer(1);
Integer d = i;

System.out.println(i==c);//false
System.out.println(i==d);//true

String s1 = "a";
String s2 = "a";
String s3 = new String("a");
System.out.println(s1==s2);//true,两者都指向字符串常量池的一个引用
System.out.println(s1==s3);//false,两者的引用一个在常量池,一个在堆内存

  (2)equals 本质上就是 ==,只不过 String 和 Integer 等引用类型重写了 equals 方法,把它变成了值比较。
例如String类型重写的equals方法:
首先判断两个对象的引用是否相同,接着判断另一个对象的类型是否与当前对象类型相同、然后判断另一个对象的长度是否与当前对象长度相同、最后判断每一个字符是否相同。中间只要有一个if语句的条件是false,则返回false,否则就返回true,表明两个对象的值相同。
在这里插入图片描述

String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
  • 33
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值