Java面试题(基础)-Java概念

  • Java有什么特性?面向对象的特征有哪些?Java的重要特征?

抽象、封装、继承、多态为Java面向对象的最重要的四个特征(其它特征还有诸如多线程、API多、安全性高、跨平台等等)

(1)抽象:Java是面向对象的解释性编程语言,面向对象讲究的万物皆对象,是将一类对象的共同特征总结出来构造类的过程,包括数据抽象(属性)和行为抽象(方法/函数),而不会关注行为的细节是什么样子。

(2)封装:将对象中的数据封闭包装起来,只能通过方法/函数操作数据,使用者只能使用对象的属性和方法/函数,而不知道对象的具体实现。
打个比喻就相当于一台自动贩卖机,这个贩卖机相当于对象,贩卖机中有各种饮料,贩卖机有贩售饮料的方法,你只需要投币,就能拿到等值的饮料,但是你不知道你投币以后你的饮料是怎样从贩卖机中出来的。(说到封装就不得不说Java中的访问限制private、default、protect、public),一个简单常见的例子就是set、get方法访问类中私有属性)。

(3)继承:继承性:继承是有联系的类所构成的层次模型。它可以重用类,并且提供了明确表达共性的方式,即原始类的派生类(子类)可以从基类(父类)那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这样使设计新类的过程大大简化。Object是所有类的超类。

(4)多态:多态性:多态是在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。多态性包括参数多态性和包含多态性。Java编辑器会自动根据所传递的参数进行判断,根据运行时对象的类型不同而执行不同的操作,这样很好地解决了应用程序函数同名问题。多态性丰富了对象的内容,扩大了对象的适应性,改变了对象单一继承的关系。(多态就应该对重载和重写的概念很清楚,重载与重新是实现多态的重要机制)

  • 面向对象的三大特性?

(1)继承:对象的一个新类可以从现有的类中派生,派生类可以从它的基类那继承方法和实例变量,且派生类可以修改或新增新的方法使之更适合特殊的需求。

(2)封装:将客观事物抽象成类,每个类可以把自身数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。

(3)多态:允许不同类的对象对同一消息作出响应。不同对象调用相同方法即使参数也相同,最终表现行为是不一样的。

  • Java和JavaSciprt的区别?
    基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。
    (1)解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率)
    (2)强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。
    扩展:Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民,因此JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure),当然Java 8也开始支持函数式编程,提供了对Lambda表达式以及函数式接口的支持。

  • Java提供的多态机制?

Java提供了两种用于多态的机制,分别是重载(运行时多态)与覆盖(编译时多态)。
(1)重载:重载是指同一个类中有多个同名的方法,但这些方法有不同的参数,在编译期间就可以确定调用哪个方法。
(2)覆盖:覆盖是指派生类重写基类的方法,使用基类指向其子类的实例对象,或接口的引用变量指向其实现类的实例对象,在程序调用的运行期根据引用变量所指的具体实例对象调用正在运行的那个对象的方法,即需要到运行期才能确定调用哪个方法。

  • Java是如何实现“一次编译,随处运行的”?Java能跨平台的原因?

Java实现跨平台的原理是通过Java虚拟机来实现的,Java源文件为后缀.java的文件,经过编译器编译为后缀.class文件。这些.class文件可以在JVM(Java虚拟机)中运行,而JVM底层屏蔽了不同操作系统的差异,这样就使得能够“一次编译,随处运行”。

  • Java属于哪种字节序?

字节序是指多字节数据在计算机内存中存储或网络传输时个字节的存储顺序。通常由小端和大端两组方式。

(1)小端:低位字节存放在内存的低地址端,高位字节存放在内存的高地址。

(2)大端:高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。

Java语言的字节序是大端。

  • JDK与JRE有什么区别?

(1)JDK:Java开发工具包(Java Development Kit),提供了Java的开发环境和运行环境。

(2)JRE:Java运行环境(Java Runtime Environment),提供了Java运行所需的环境。

JDK包含了JRE。如果只运行Java程序,安装JRE即可。要编写Java程序需安装JDK.

  • 值传递和引用传递的区别是什么?
    值传递(按值调用)表示方法接收的是调用者提供的值;
    引用传递(按引用调用)表示方法接收的是调用者提供的地址信息。
    Java总是按值调用。方法得到的是所有参数的一个拷贝,方法不能修改传递给他的任何参数变量的内容。

  • 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

Java中只有值传递。Java语言的方法调用只支持参数的值传递(Java中没有指针)。函数调用时,无论值类型变量还是引用类型变量,都是将变量所存储的值copy给了函数的实参,区别在于基本类型变量的值就是类型值本身,而引用类型变量的值是一个地址。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。在这种类型的变量传递给参数的时候:会将变量值(引用地址)copy一份,传递给函数作为实参。也就是说:传递给函数的变量所指向的空间,与函数实参所指向的空间是相同的。因此,在函数中通过实参去改变对象的内容,会影响到函数外部变量所指向的对象的内容,因为它们都指向同一个对象。

  • public,private,protected修饰符的作用域,以及不写修饰符时的区别

1)使用public修饰符的变量和方法,在任何一个类中创建对象后都可以访问到,包括当前类、同包的类、子孙类以及外包的类。
2)使用protected修饰符的变量和方法,不可以访问外包类创建的对象。
3)不写修饰符的变量和方法,为默认类,只可以访问同一个包中类创建的对象。
4)使用private修饰符的变量和方法,只能在当前类中使用。

访问修饰符 同一类中 同一包中 子类中 全局
public 可以 可以 可以 可以
protect 可以 可以 可以 不可以
不写默认下 可以 可以 不可以 不可以
private 可以 不可以 不可以 不可以
  • 重载和重写的区别?为什么不能根据返回类型来区分重载?

重载和重写是Java中实现多态的重要机制。重载(Overload):又称静态多态,编译时多态: 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重载程序示例如下:

public class Overloading {
    
    
   public int test(){
    
    
       System.out.println("test1");
       return 1;
   }
 public void test(int a){
    
    
         System.out.println("test2");
 }
 //以下两个参数类型顺序不同
 public String test(int a, String s){
    
    
        System.out.println("test3");
        return "returntest3";
 }
 public String test(String s,int a){
    
    
        System.out.println("test4");
        return "returntest4";
 }
 public static void main(String[] args){
    
    
        Overloading o = new Overloading();
        System.out.println(o.test()); o.test(1);
        System.out.println(o.test(1,"test3"));
      System.out.println(o.test("test4",1));
 }
}

重写(Override): 又称动态多态,运行时多态:发生在两个类中;方法名、参数、返回类型都与父类一致,不可以修改,但是里面的实现可以与被重写方法不同。(可以使用@Overwrite标签校验),重写示例程序如下:

class Animal{
    
    
   public void move(){
    
    
       System.out.println("动物可以移动");
   }
}
class Dog extends Animal{
    
    
   @Override
   public void move(){
    
    
       System.out.println("狗可以跑和走");
   }
   public void bark(){
    
    
       System.out.println("狗可以吠叫");
   }
}
  • 为什么Java语言不支持多重继承?

(1)为了程序的结构能够更加清晰从而便于维护。假设Java语言支持多重继承,类C继承自类A和类B,如果类A和B都有自定义的成员方法f(),那么当代码中调用类C的f()会产生二义性。Java语言通过实现多个接口间接支持多重继承,接口由于只包含方法定义,不能有方法的实现,类C继承接口A与接口B时即使它们都有方法f(),也不能直接调用方法,需实现具体的f()方法才能调用,不会产生二义性。

(2)多重继承会使类型转换、构造方法的调用顺序变得复杂,会影响到性能。

  • final、finally和finalize的区别是什么?

(1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

(2)finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。

(3)finalize是Object类的一个protected方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。

  • Java语言中关键字static的作用是什么?

static的主要作用有两个:
(1)为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间。

(2)使得某个方法或属性与类而不是对象关联在一起,即在不创建对象的情况下可通过类直接调用方法或使用类的属性。

具体而言static又可分为4种使用方式:

(1)修饰成员变量。用static关键字修饰的静态变量在内存中只有一个副本。只要静态变量所在的类被加载,这个静态变量就会被分配空间,可以使用’‘类.静态变量’‘和’‘对象.静态变量’'的方法使用。

(2)修饰成员方法。static修饰的方法无需创建对象就可以被调用。static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态成员方法。

(3)修饰代码块。JVM在加载类的时候会执行static代码块。static代码块常用于初始化静态变量。static代码块只会被执行一次。

(4)修饰内部类。static内部类可以不依赖外部类实例对象而被实例化。静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。

  • Java中是否有goto?

Java中的关键字有goto,但是Java并没有使用goto,将其作为了保留字,类似的还有const。(带有goto的程序可读性差,程序在运行时的可靠性不高,大部分人都不推荐使用goto)

  • 数组有没有length()方法?String有没有length()方法?

数组没有length()方法,有length 的属性。String中通过length方法获取字符串长度。集合如List通过size()方法获取集合的大小。

  • 简述泛型

泛型,即“参数化类型”,解决不确定对象具体类型的问题。在编译阶段有效。在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中称为泛型方法。

  • 简述泛型擦除

Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程被称为泛型擦除。

猜你喜欢

转载自blog.csdn.net/chen15369337607/article/details/125986578
今日推荐