文章目录
- 1.面向对象的特征有哪些方面?
- 2.访问修饰符public,private,protected,以及默认时的区别?
- 3.类型转换
- 4.int 与 Integer 有什么区别?
- 5.是否可以继承String 类?
- 6.两个对象值相同(x.equals(y) == true),但却有不同的hash code,这句话对不对?
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的比较
- 两个通过new生成的Integer变量,结果为false
//内存中的地址不同
Integer a = new Integer(3);
Integer aa = new Integer(3);
System.out.println(a == aa);
- int 和Integer的值相等,结果为true
//a自动拆箱成int类型再和c比较
Integer a = new Integer(3);
int c = 3;
System.out.println(a == c);
- new生成的Integer变量与非Integer变量比较,结果为false
Integer a = new Integer(3);
Integer b = 3; // 将3自动装箱成Integer类型
System.out.println(a == b); // false 两个引用没有引用同一对象
new生成的Integer变量的值在堆空间中;
非new生成的Integer变量的值在常量池中
- 两个非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方法的规定:
- 如果两个对象相同(equals 方法返回true),那么他们的hash code 值也一定相同
- 如果两个对象的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)应该得到同样的返回值