Java基础面试题附带答案(四)

本文详细探讨了Java中的核心概念,包括构造器、super关键字、this与super的区别、重写与重载的差异、接口与抽象类、值传递与引用传递的原理、==与equals的用法、hashCode()与equals的关系,以及final和static的关键字用法。通过这些深入讲解,帮助Java开发者更好地理解和应用这些基础概念。
摘要由CSDN通过智能技术生成

046构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

047super关键字的用法

super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一 个父类。

super也有三种用法:

1.普通的直接引用

与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分

class Person{ 
    protected String name; 
    public Person(String name){ 
        this.name = name; 
    } 
} 
class StudentextendsPerson{ 
    private String name; 
    publicStudent(String name, String name1){ 
        super(name); 
        this.name = name1; 
    } 
    public void getInfo(){ 
        System.out.println(this.name); 
        System.out.println(super.name); 
    } 
} 
public class Test{ 
    public static void main(String[] args){ 
        Student s1 = new Student("Father", "Child"); 
        s1.getInfo(); 
    } 
}

3.引用父类构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

048this与super的区别?

super:它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员

数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名 (实参)

this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

super()和this()区别是

[1]super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。

[2]super()和this()均需放在构造方法内第一行。尽管可以用this调用一个构造器,但却不能调用两个。

[3]this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语 句,就失去了语句的意义,编译器也不会通过。

[4]this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变

量,static方法,static语句块。从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

049Java中重写和重载有哪些区别?

方法的重载和重写本质都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态。

方法重载的规则:

1)方法名一致,

2)参数列表不同(参数顺序不同或者参数类型不同或者参数个数不同)。

3)重载与方法的返回值无关,这个很关键。

方法重写的规则:

1)参数列表和返回值类型必须完全与父类的方法一致

2)构造方法不能被重写,声明为 final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。

3)访问权限不能比父类中被重写的方法的访问权限更低。

4)重写的方法能够抛出任何检查异常(编译时异常),但是重写的方法不能抛出比被重写方法声明的更广泛的运行时异常。

050接口和抽象类有哪些区别?

1)接口中的所有方法都是抽象的,而抽象类可以有抽象方法,也可以有实例方法。

2)类需要继承,接口需要实现。一个类可以实现多个接口,但只能继承一个父类但接口却可以继承多接口。

3)接口与实现它的类不构成继承体系,即接口不是类体系的一部分。因此,不相关的类也可以实现相同的接口,而抽象类是属于类的继承体系,并且一般位于类体系的顶层。

051接口是否可继承(extends)接口? 抽象类是否可实现(implements) 接口? 抽象类是否可继承具体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类,但前提是具体类必须有明确的构造函数。

052描述一下值传递和引用传递的区别?

值传递是指在调用函数时将实际参数复制一份到函数中,这样的话如果函数对其传递过来的形式参数进行修改,将不会影响到实际参数。

引用传递是指在调用函数时将对象的地址直接传递到函数中,如果在对形式参数进行修改,将影响到实际参数的值。

053Java中==和equals有哪些区别?

equals 和== 最大的区别是一个是方法一个是运算符。

1)基本类型中,==比较的是数值是否相等。equals方法是不能用于基本数据类型数据比较的,因为基本数据类型压根就没有方法。

2)引用类型中,==比较的是对象的地址值是否相等。equals方法比较的是引用类型的变量所指向的对象的地址是否相等。应为String这个类重写了equals方法,比较的是字符串的内容。

054hashCode()方法的作用?

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码 的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就 意味着Java中的任何类都包含有hashCode()函数。

055hashcode方法和equals方法区别?

在Java中,每个对象都可以调用自己的hashCode方法得到自己的哈希值(hashCode),相当于对象的指纹信息,通常说世界上没有完全一样的指纹,但是在Java中没有这么绝对,我们依然可以用hashCode值来做一些提前的判断。

1)如果两个对象的hashCode值不一样,那么他们肯定是不同的两个对象;

2)如果两个对象的hashCode值一样,也不代表就是同一个对象;

3)如果两个对象的equals方法相等,那么他们的hashCode值一定相等。

在Java的一些集合类的实现中,在比较两个对象的值是否相等的时候,会根据上面的基本原则,先调用对象的hashCode值来进行比较,如果hashCode值不一样,就可以认定这是两个不一样的数据,如果hashCode值相同,我们会进一步调用equals()方法进行内容的比较。

056为什么重写 equals 方法必须重写 hashcode 方法?

equals 方法是用来比较对象大小是否相等的方法,hashcode 方法是用来判断每个对象 hash 值的一种方法。如果只重写 equals 方法而不重写 hashcode 方法,很可能会造成两个不同的对象,它们的 hashcode 也相等,造成冲突。

例如:String str1 = "通话"; String str2 = "重地";

它们两个的 hashcode 相等,但是 equals 可不相等。

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

不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。

Java对于eqauls方法和hashCode方法是这样规定的:

(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;

(2)如果两个对象的hashCode相同,它们并不一定相同。

当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对 象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如 果哈希码频繁的冲突将会造成存取性能急剧下降)。

058抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized?

都不能。

1)抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。

2)本地方法是由本地代码(如 C++ 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。

3)synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

059final关键字的用法?

修饰类:当用final修饰一个类时,表明这个类不能被继承。正如String类是不能被继承的。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

修饰方法:使用final修饰方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。因此,只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final。(注:一个类中的private方法会隐式地被指定为final方法)

修饰变量:对于被final修饰的变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

060final和static的区别?

public class Demo1 {
    public static void main(String[] args)  {
        MyClass myClass1 = new MyClass();
        MyClass myClass2 = new MyClass();
        System.out.println(myClass1.i);
        System.out.println(myClass2.i);
        System.out.println(myClass1.j);
        System.out.println(myClass2.j);  
    }
}
class MyClass {
    public final double i = Math.random();
    public static double j = Math.random();
}

运行结果:

0.3222977275463088
0.2565532218939688
0.36856868882926397
0.36856868882926397

每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。static属于类级别的不可变,而final是对象级别的不可变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值