17道Java基础面试题!收藏吃灰!( 二 )


实现原理: 多态的实现原理主要依赖于Java的动态方法分派机制 。当一个子类重写了父类的方法时 , Java运行时系统会根据对象的实际类型来决定调用哪个方法 。这个过程是在运行时(Runtime)进行的 , 而不是在编译时(Compile-time) 。这使得我们可以通过父类引用来调用子类的方法 , 实现多态的特性 。
示例: 下面的示例展示了如何在Java中实现多态:
// 定义一个基类(父类)Animalclass Animal {public void makeSound() {System.out.println("The animal makes a sound");}}// 定义一个子类(派生类)Dog , 继承自Animalclass Dog extends Animal {// 重写父类的makeSound方法@Overridepublic void makeSound() {System.out.println("The dog barks");}}// 定义一个子类(派生类)Cat , 继承自Animalclass Cat extends Animal {// 重写父类的makeSound方法@Overridepublic void makeSound() {System.out.println("The cat meows");}}public class PolymorphismDemo {public static void main(String[] args) {// 使用父类引用来创建子类对象Animal myAnimal = new Dog();myAnimal.makeSound(); // 输出: The dog barksmyAnimal = new Cat();myAnimal.makeSound(); // 输出: The cat meowsmyAnimal = new Animal();myAnimal.makeSound(); // 输出: The animal makes a sound}}在这个示例中 , Dog和Cat都是Animal的子类 , 它们分别重写了父类的makeSound方法 。在main方法中 , 我们使用父类引用Animal来创建子类对象 , 然后调用makeSound方法 。根据对象的实际类型 , Java运行时系统会自动调用相应的方法 , 实现多态的特性 。
int 和 Integer 有什么区别 , 还有 Integer 缓存的实现在Java中 , int和Integer的主要区别在于它们分别是基本数据类型和引用数据类型 。
1、 int: int是Java中的一种基本数据类型(primitive data type) , 它表示整数 。int类型占用4个字节(32位) , 取值范围为-2^31到2^31-1 。由于int是基本数据类型 , 它的操作速度通常比引用类型更快 。但是 , int类型不能用于泛型编程 , 也不能表示空值(null) 。
2、 Integer: Integer是Java中的一种引用数据类型 , 它是int类型的包装类(wrApper class) 。Integer类为int类型提供了一些有用的方法和常量 , 例如将int类型转换为字符串 , 将字符串转换为int类型等 。由于Integer是引用类型 , 它可以用于泛型编程 , 也可以表示空值(null) 。
Integer缓存的实现: 为了提高性能和减少内存占用 , Java对Integer对象进行了缓存 。当我们使用Integer.valueOf方法或自动装箱(autoboxing)时 , Java会尝试从缓存中获取Integer对象 , 而不是每次都创建一个新的对象 。这个缓存的范围是从-128到127 , 这些值是在Integer类初始化时创建的 。
以下是一个简单的示例 , 说明了Integer缓存的效果:
Integer a = 127;Integer b = 127;System.out.println(a == b); // 输出: trueInteger c = 128;Integer d = 128;System.out.println(c == d); // 输出: false在这个示例中 , 我们创建了两对Integer对象 。对于第一对 , 它们的值在缓存范围内(-128到127) , 所以a和b实际上是指向同一个Integer对象 , 因此a == b的结果为true 。而对于第二对 , 它们的值超出了缓存范围 , 所以c和d是指向两个不同的Integer对象 , 因此c == d的结果为false 。
总结一下 , int和Integer在Java中具有不同的特点和用途 。int是基本数据类型 , 操作速度快 , 但不能用于泛型编程和表示空值;Integer是引用数据类型 , 可以用于泛型编程和表示空值 , 但操作速度相对较慢 。此外 , Java对Integer对象进行了缓存 , 以提高性能和减少内存占用 。在实际编程中 , 我们应根据需要选择使用int或Integer 。
为什么说java里面只有值传递?在Java中 , 方法参数传递是按值传递的 。这意味着当我们将一个变量传递给方法时 , 实际上传递的是变量的值 , 而不是变量本身 。这里需要区分基本数据类型和引用数据类型的值传递 。
1、 基本数据类型: 对于基本数据类型(如int , double , char等) , 值传递意味着传递的是变量的实际值 。当我们将基本数据类型作为参数传递给方法时 , 方法内部的操作不会影响原始变量的值 。


推荐阅读