java基础面试_Java基础面试题,满满干货

面向对象的三大特性是

答案:继承,封装,多态,

1)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承,新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类),派生类可以从它的基类那里继承和实例变量,并且子类可以修改或增加新的方法使之更适合特殊的需要。

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

3)多态:多态是指允许不同类的对象对同一消息作出响应。多态包括参数化多态和包含多态,多态性语言具有灵活、抽象、行为共享和代码共享的优势,很好地解决了应用程序方法同名问题。

下列关于构造方法的描述中,错识的是()

A. Java语言规定构造方法没有返回值,但不用void声明

B. Java语言规定构造方法名与类名必须相同

C. Java 语言规定构造方法不可以重载

D. Java语言规定构造方法不能直接被调用

答案: C.

构造方法是一种特殊的方法,用来在对象实例化时初始化对象的成员变量,在Java语言中,构造方法具有以下特点:

1.构造方法必须与类的名字相同,并且不能有返回值(返回值也不能为void)。

2.每个类可以有多个构造方法,当开发人员没有提供构造方法时,编译器在把源代码编译成字节码的过程中会提供一个没有参数的默认构造方法。但该构造方法不会执行任何代码。如果开发人员提供了构造方法那么编译器就不会再创建默认的构造方法。

3.构造方法可以有0个、1个或1个以上的参数。

4.构造方法总是伴随着new操作一起调用不能由程序的编写者直接调用,必须要由系统调用,构造方法在对象实例化时会被自动调用,且只运行一次,而普通的方法是在程序执行到它时才被调用,可以被该对象调用多次

5.构造方法的主要作用是完成对象的初始化工作。

6.构造方法不能被继承,因此,它不能被覆盖,但是构造方法能够被重载,可以使用不同的参数个数或参数类型来定义多个构造方法。

7.子类可以通过关键字 super来显式地调用父类的构造方法。当父类没有提供无参数的构造方法时,子类的构造方法中必须显式地调用父类的构造方法。如果父类中提供了无参数的构造方法,此时子类的构造方法就可以不显式地调用父类的构造方法,在这种情况下,编译器会默认调用父类的无参数的构造方法。当有父类时,在实例化对象时,会首先执行父类的构造方法,然后才执行子类的构造方法。

8.当父类和子类都没有定义构造方法时,编译器会为父类生成一个默认的无参数的构造方法,给子类也生成一个默认的无参数的构造方法。此外,默认构造器的修饰符只与当前类的修饰符有关(例如,如果一个类被定义为public,那么它的构造方法也是public)。

对于选项D,在Java语言中,当类在实例化时,会自动调用构造方法,且不能显式地调用构造方法。因此,选项D正确。

9cbf5c24adfd2258c8033096c221452c.png

构造方法调用的时间是( )。

A. 定义类时

B.创建对象时

C.使用对象的变量时

D.调用对象方法时

答案: B.

对于选项A,类在定义时只是定义了一个引用类型,并不会调用构造方法。因此,选项A错误。

对于造项B,一般情况下构造方法只在对象被创建时才被调用,例如通过new创建一个新对象时会调用构造方法。因此,选项B正确。

对于选项C,由于在使用对象变量时对象已经存在,因此,也不会去调用构造方法创建新的对象,因此,选项C错误。

对于选项D,由于调用对象方法的前提是这个对象已经存在,因此,在调用方法时不会去调用构造方法。因此,选项D错误。

下列有关继承的描述中,正确的是( )。A.子类能继承父类的非私有方法和属性

B.子类能继承父类的所有方法和属性

C.子类只能继承父类的公有方法和属性

D.子类能继承父类的方法,而不是属性

答案: A.本题中,继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,子类能继承父类的公有和受保护的方法和属性,但是不能继承私有方法和属性。所以,选项A正确,选项B、选项C与选项D错误。

以下关于继承的描述中,正确的是( )。

A.在Java语言中类只允许单一继承。B.在Java语言中一个类只能实现一个接口C.在Java语言中,一个类不能同时继承一个类和实现一个接口

D.在Java语言中接口只允许单一实现

答案: A。继承指的是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在Java语言中,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以使用父类的功能,但不能选择性地继承父类。类只允许单继承,但是为了实现类似于C++语言中多继承的特性,Java语言引入了接口的概念,虽然Java语言只允许继承一个类,但是却可以同时实现多个接口,因此,也就间接地实现了多继承。从以上分析可知,选项A正确,选项B和选项D错误。对于选项C,一个类只能继承一个类,在继承的同时,还可以实现多个接口,因此,选项C错误。

1d91072a8977c8f1e7a09e4ee3f399dd.png

接口和抽象类有什么区别?

答案:接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制(注意,该句中前后两个抽象类的意义不一样,前者表示的是一个实体,后者表示的是一个概念)二者具有很大的相似性,甚至有时候是可以互换的。但同时,二者也存在很大的区别。

具体而言,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java语言中,接口是通过关键字interface来实现的。

包含一个或多个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。在抽象类的子类中,实现方法必须含有相同的或者更高的访问级别(pubic>protected>private)。抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中所有的抽象方法提供具体的实现,否则,他们也是抽象类。接口可以被看做是抽象类的变体,接口中所有的方法都是抽象的,可以通过接口来间接地实现多重继承。接口中的成员变量都是static、final类型,由于抽象类可以包含部分方法的实现,所以,在一些场合下抽象类比接口存在更多的优势。

接口与抽象类的相同点如下:

1. 都不能被实例化。2.接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。

接口与抽象类的不同点如下:1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此,使用接口可以间接地达到多重继承的目的。3)接口强调特定功能的实现,其设计理念是"like-a" 关系,而抽象类强调所属关系,其设计理念为“is-a”关系。4)接口中定义的成员变量默认为public.static和final,只能够有静态的不能被修改的数据成员,而且,必须给其赋初值,其所有的成员方法都是public、abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default当然也可以被定义为private protected 和public,这些成员变量可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法(其前有abstract修饰)不能用private static synchronized和native等。访问修饰符修饰,同同时方法必须以分号结尾,并且不带花括号{}。所以,当功能需要积累时,使用抽象类,不需要积累时,使用接口。

5) 接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。

Java语言提供了两种用于多态的机制,分别是( )与( )。

答案:重载,覆盖。多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而会产生不同的结果。在Java语言中,多态主要有以下两种表现方式:(1)重载(Overload)重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此,在编译时就可以确定到底调用的是哪个方法,它是一种编译时多态。重载可以被看作一个类中的方法多态性。(2)覆盖(Override)子类可以覆盖父类的方法,因此,同样的方法会在父类与子类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),即引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用的是哪个方法,因此,通过方法覆盖实现的多态也可以被称为运行时多态。如下例所示:classBase{

publicBase() {g();}

publicvoidf() {System.out.println("Base f()");}

publicvoidg() {System.out.println("Base g()");}

}

classDerived extends Base{

publicvoidf(){System.out.println("Derived f()");}

publicvoidg(){System.out.println("Derived g()");}

}

publicclassTest{

publicstaticvoidmain(String[] args){

Base b = newDerived();

b.f();

b.g();

}

}

程序的运行结果为:

Derived g()

Derived f()

Derived g()

上例中,由于子类Derived的f()方法和g()方法与父类Base的方法同名,因此Derived的方法会覆盖父类Base的方法。在执行Base b=new Derived()语句时,会调用Base类的构造方法,而在Base的构造方法中执行了g()方法,由于Java语言的多态特性,此时会调用子类Derived的g()方法,而非父类Base的g()方法,因此会输出Derived g()。由于实际创建的是Derived类的对象,后面的方法调用都会调用子类Derived的方法。

4ba9230ef635fa62d14c72e70e4f3e58.png

Overload 和Override的区别是什么?Overload的方法是否可以改变返回值的类型?

答案: Overload(重载)和Override(覆盖)是Java多态性的不同表现,其中,重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,他们或有不同的参数个数或有不同的参数类型。

在使用重载时,需要注意以下几点:1)重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或不同的参数顺序。

2) 不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。

3)对于继承来说,如果基类方法的访问权限为private,那么就不能在派生类中对其进行重载,如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。 Override是指派生类函数覆盖基类函数,覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时,需要注意以下几点:1)派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。

2) 派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。3)派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致或是其子类。

4)基类中被覆盖的方法不能为private,否则,其子类只是定义了一个方法,并没有对其覆盖。

重载与覆盖的区别主要有以下几点:1)覆盖是子类和父类之间的关系,是垂直关系:重载是同一个类中方法之间的关系,是水平关系。

2) 覆盖只能由一个方法或一对方法产生关系;方法的重载是多个方法之间的关系

3) 覆盖要求参数列表相同;重载要求参数列表不同

4) 覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。

5) 如果在一个类中定义了多个同名的方法,他们或有不用的参数个数或有不同的参数类型,则称为方法的重载。Overload的方法可以改变返回值的类型,但是Override方法不能改变返回值类型。

源文件私信:源文件

一起成长,共同进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值