javase简答题

一、OOP

   1.什么是面向对象

 首先,我们先说一下面向过程,面向过程就是将解决问题的方法一步一步的写出来,然后从上到下顺序的执行。

面向对象的基本思想就是通过使用 类 对象 封装 继承等进行程序设计,尽可能的用人类的思维模式去解决问题

面向对象是将解决问题的方法,抽象出一个类,类里面有一些属性和方法,通过方法操作这些属性去解决问题。这些方法我们可以重复的调用,而面向过程呢,因为是顺序执行的,所以如果有相同的代码,也需要重新写一遍。

面向对象就是抽象出现实世界的

    2. 面向对象中的类

   是面向对象中最小的程序设计单元,类表示具有某种特征的一类事物,如果开发者想定义一个类,那么就需要这些事物有哪些数据,有哪些方法来操作这些数据。

    3. 对象

类是一个模板, 对象是类的一个具体实例,简单理解就是人类是一个类,小明就是这个类的一个具体对象。对象一般都是通过new关键字创建出来的,这个过程通常称为实例化过程。

如果想要访问实例化过程的对象,我们需要用一个变量去接收它,这个变量我们称为引用变量,通过引用地址去指向对象。它相当于面向过程里面的指针。

     4. this关键字和super关键字

this

是隐藏在成员变量前的关键字,当形参和实参一样的时候,this不能省略必须显示的写出来。this的作用就是区分局部变量和当前类的属性。如果没有写this就代表的是局部变量也就是形参。

this关键字来表示当前对象,哪个对象调用,this就代表哪个对象

调用本来的构造器时候必须写在第一行,

super

(1) 表示调用父类的成员,子类不能继承父类的构造器,但是可以用super调用父类的构造器同样,也必须放在首行,所以super和this调用构造器时候不能共存。

(2)在子类的构造器中,必须显示或者隐式的调用父类的构造器,因为子类需要初始化,如果父类中有无参构造器,子类的构造器中系统会默认的调用super()无参构造器,如果父类中没有无参构造器子类必须显示的调用父类的构造器super(有形参传实参)

    5.构造方法

人有一生,从出生到死亡,同样 对象也有它的一生,使用new关键字创建出来的对象就是调用了构造器,开辟一个空间,然后到这个空间被销毁,就是对象的一生。构造方法一般是用来初始化的。

(1)构造方法的方法名和类明相同,没有返回值的那个位置,因此也没有返回值,不能使用static修饰

(2)可以重载,但是不能重写,什么是重载呢?就是方法名相同形参列表不同(个数,顺序,或者类型) 重写是方法名相同形参列表相同但是方法体不同,而每个类的类名都不一样,所以肯定满足不了方法名相同,所以构造器不能被重写。


    6. 如何理解封装继承和多态

封装就是将属性和方法封装到一起,因为我们可能有时候不想让外界直接访问属性,有可能修改成了我们不想要的值,这时我们可以将属性私有化,提供修改属性的方法来限制一下。

继承:

举个例子,小狗有自己的名字、年龄、颜色,有吃饭睡觉的行为;小猫也有自己的名字、年龄、颜色,吃饭睡觉的行为。但是小狗会汪汪叫 小猫会喵喵叫。这时候我们就可以提供一个父类 写它们的共同特征 名字 年龄 颜色 和吃饭睡觉,可以在定义一个子类去继承他,子类可以拥有父类的成员和方法,也可以有自己独特的成员。小狗的汪汪叫 小猫的喵喵。

多态

顾名思义:一个对象的多种形态。一个对象可以从一种形态转换成另外一种形态

向上转型:父类的引用指向子类的对象。隐式转换肯定会成功。

向上转型访问时只能访问父类中的成员,运行时如果调用的是重写的方法那么调用的是子类中的成员或者方法。因为编译看编译类型,运行看对象。简单来说就是编译看左边,运行看右边。

在定义方法时候,如果形参列表是父类型的变量,那么我们可以传子类型的对象。

向下转型:父类型的变量需要赋值给子类型的变量,需要进行强转。如果二者没有继承关系可能会失败报ClassCastException异常,所以一般我们用instanceOf来判断一下,如果是它的子类型在强转,不是就不转。

      7.继承的特点

(1)一个子类只能继承一个父类,一个父类可以被多个子类去继承。

(2)子类可以继承父类的所有成员变量和方法除了构造器,私有的也可以但是不能访问,但是子类可以调用父类的构造器。

(3)如果父类的方法满足不了子类的需求,子类可以重写父类的方法,返回值类型是父类的子类型或者和父类一样,访问修饰符要比父类的权限大或者和父类一样。

(4)支持多重继承也就是A有个子类B,B也可以有子类C。

8.Object类型

      9.final修饰词和static修饰词

final

(1)final修饰成员变量,变量只能初始化一次且不能被修改。要么直接初始化要么构造器初始化

(2)final修饰成员方法,方法不能重写

(3)final修饰类该类不能被继承

(4)final修饰局部变量只能赋值一次不能第二次赋值

static

作用域为整个类。可以定义在任何地方,但是不能定义在方法里面。

(1)修饰属性时候,使用类名.变量名调用  可以使用对象名.变量名调用,但不合理。

(2)修饰方法不能被重写,使用类名调用

(3)修饰代码块,在类加载期间就执行了

(4)修饰类只能是内部类。

     10.抽象类

当我们用到继承的时候,父类中的方法无法满足子类的需求,我们需要重写父类的方法,而我们在使用时候就用不到父类的方法体,所以我们可以将不能满足子类需求的父类方法设置为抽象方法,也就是没有方法体需要以分号结尾,含有抽象方法必须定义为抽象类。

(1)子类继承抽象父类时候必须重写父类里面的方法,或者将子类也定义为抽象类。

(2)抽象类里面可以没有抽象方法可以提供构造器,但是不能被实例化,没有意义

    11. 接口

java只支持单继承 不支持多继承,但是当我们想从几个类中抽象出共同的方法和属性构成一个子类,我们就可以使用接口。接口是一种规范,而抽象类是模棱两可的

(1)接口里的方法默认被public abstract 修饰

(2)属性默认被public static final修饰

(3)接口不能存在构造器不能实例化 ,因为构造器的作用是初始化。,接口里面的属性默认被static final修饰,所以只能初始化一次,有构造器也没有作用

(3)接口支持多继承,一个类可以实现多个接口,

12.接口与抽象类的区别

接口里面没有方法的实现,而抽象类里面可以有方法的实现。

    12.常用接口

序列化接口

comparaible 

Comparator

     13.重写和重载的区别

       方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型和访问修饰词没有特殊的要求,不能根据返回类型进行区分。

13. 枚举

14. 内部类

(1) 成员内部类

(2)局部内部类

(3)静态内部类

(4)匿名内部类

12.  JVM

栈 堆 方法区 程序计数器,

栈 每个方法调用之后都会产生一个栈帧,调用结束后栈帧消失。遵循先入后出原则

二、锁

      1. sleep()  和 wait()  的区别

   (1) sleep 超过了设置的时间会自动唤醒,而wait 只有通过notify() 和 notifyAll() 方法才能被唤醒

(2)sleep()进入阻塞态不会释放自己的锁,而wait() 会自动释放自己持有的锁标记进入阻塞态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值