Java:面向对象面试题整理

1.面向对象的特征有哪些方面?

抽象:
将一类对象的共同特征总结出来,构造类的过程(数据抽象和行为抽象)
只关注对象有哪些属性和行为,不关注这些的细节。
继承:
从已有类得到继承信息创建新类的过程(父类 & 子类)
封装:
数据&操作的方法,(只能通过接口访问)
隐藏一系列可以隐藏的,只向外界提供最简单的编程接口(智能化)
多态:
允许不同子类的对象对于同一消息做出不同回应(调用了同样的方法,做了不同的事情)
编译时的多态性:静态的,方法的重载
运行时的多态性:动态的,方法的重写
成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。

class Fu {
	intnum = 5;
	
	static void method4() {
		System.out.println("fu method_4");
	}

	void method3() {
		System.out.println("fu method_3");
	}
}

class Zi extends Fu {
	intnum = 8;

	static void method4() {
		System.out.println("zi method_4");
	}

	void method3() {
	 System.out.println("zi method_3");
	}

}

class DuoTai {
 public static void main(String[] args) {
	Fu f = new Zi();
	System.out.println(f.num);//与父类一致
	f.method4();//与父类一致
	f.method3();//编译时与父类一致,运行时与子类一致
	Ziz = new Zi();
	System.out.println(z.num);
	z.method4();
	z.method3();
 }
}

2.访问修饰符public,private,protected,以及默认时的区别?

修饰符当前类同包子类其他包
public
protected×
default××
private×××

Java中外部类的修饰符只能是public或默认,类成员中可以是以上四种

3.类型转换

String 不是基本数据类型

有八个基本数据类型:byte , int , double , float , short , long , boolean , char
除了基本类型和枚举类型,剩下的为引用类型
所以,String是引用类型

short s1 = 1; s1 = s1+1; 错误
short s1 = 1; s1 += 1; 正确

第一个:由于1是int类型,所以s1+1也是int类型,赋值给short类型时,需要进行强制转换
第二个:相当于 s1 = (short) ( s1+ 1 );有隐含的强制转换,可以正确编译

4.int 与 Integer 有什么区别?

int是基本数据类型
Integer继承了Object类,是对象类型,是int的包装类

包装类: 为了将这个基本数据当成对象操作

每个原始类型都有包装类:
原始类型:byte , short , long , int , double , float , char , boolean
包装类型:Byte , Short , Long , Integer , Double , Float , Character , Boolean

区别:
1. 值的存储
int 存储在栈中
integer 对象的引用存储于栈空间中,对象的数据存储在堆空间中
2. 初始化
int:初始化为0
Integer:初始化为null
3. 传参
int 是值传递,栈中的数据不可变
Integer对象是引用传递,引用不可变,但是引用指向的堆空间地址的值是可以改变的
4. 泛型
泛型不支持int,但是支持Integer
5. 运算
int可以直接做运算,是类的特征
Integer的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型int

相同值下int和Integer的比较

  1. 两个通过new生成的Integer变量,结果为false
	//内存中的地址不同
    Integer a = new Integer(3);
    Integer aa = new Integer(3);
    System.out.println(a == aa);
  1. int 和Integer的值相等,结果为true
	 //a自动拆箱成int类型再和c比较
     Integer a = new Integer(3);
     int c = 3;
     System.out.println(a == c); 

  1. new生成的Integer变量与非Integer变量比较,结果为false
     Integer a = new Integer(3);
     Integer b = 3;                  // 将3自动装箱成Integer类型
     System.out.println(a == b); // false 两个引用没有引用同一对象

new生成的Integer变量的值在堆空间中;
非new生成的Integer变量的值在常量池中

  1. 两个非new生成的Integer对象进行比较时,结果为true
    注意:值的范围在[-128,127]
Integer x = 128;
Integer y = 128;
System.out.println(x == y);// false:int的范围为[-128,127]由于超范围,所以不使用缓存,为其重新开辟空间,所以其并不相等

5.是否可以继承String 类?

不可以。

String类的方法头是:`

Public final class String extends Object`

是final类,不能被继承。

6.两个对象值相同(x.equals(y) == true),但却有不同的hash code,这句话对不对?

分情况:
若重写了equals方法:可能会有hash code不同的情况出现;
若没有重写:默认时继承Object的equals的方法,根据源码可知,equals相同Hash code一定相同

public boolean equals (Object obj){
	return(this == obj);
}

Java对于equals方法和hash code方法的规定:

  1. 如果两个对象相同(equals 方法返回true),那么他们的hash code 值也一定相同
  2. 如果两个对象的hash code相同,他们并不一定相同

补充(equals方法特点):

  • 自反性:x.equals(x) --> true
  • 对称性:x.equals(y) --> true时,y.equals(x)也 --> true
  • 传递性:x.equals(y)和y.equals(z)都返回 true时,x.equals(z)也必须返回true
  • 一致性:当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值