Java基础面试笔记

1.面向对象三大特征

封装:也称为信息的隐藏,将一类具有相同特征和功能的事务包装在一起,对外只提供调用的接口.优点:减少耦合,实现代码的专业分工
继承:继承时从已有的类派生出新类,被继承的类称为父类,继承的类称为子类,使用extends关键字,子类可以使用父类的所有非构造方法,
可以对父类方法进行扩充或者覆盖重写,也可以定义新的方法,继承时是单继承,但可以多级继承
多态:多种形态,是同一个行为具有多个不同的表现形式,继承和封装都是为多态服务的。
体现在:父类引用指向子类对象,左父右子就是多态。
在多态环境下:
成员变量:编译看父类,运行看父类
静态方法:编译看父类,运行看父类
非静态变量:编译看父类,运行看父类
特点:
优点:提高代码可扩展性
缺点:不能调用子类独有方法
解决弊端:引用类型转换【向下转型,需要使用Instenceof判断】

2.多态存在的三个前提:

(1)有继承或实现关系
(2)子类重写父类方法
(3)父类引用指向子类对象
在多态中,静态方法可以被继承,但不能被修改,因为静态方法属于类

3.继承

父类的构造方法不能被继承,也不能直接使用;
父类的私有成员变量可以被继承,但是不能访问
方法重写时子类的权限要大于父类
在方法重写时增加一部分功能:super().method();
父类非私有变量方法可以被继承,也可以直接使用,在调用时,优先查找子类的方法和属性,没有则去父类查找

4.实现

多接口有相同的抽象方法,实现类必须重写
多接口有相同静态方法,不影响,调用接口的直接调用
多接口有相同常量:不能调用
多接口的相同默认方法:子接口需要重写
【注:实现类不能继承接口中静态方法,可用接口名.静态方法调用】

5.内部类:

(1)成员内部类
定义在类中,方法外,创建对象格式:外部类名.内部类名 name=new 外部类名.内部类名();
当外部类调用内部类需创建对象,内部类可直接使用外部类所有成员变量和方法;
当外部类和内部类有同名变量,调用外部类变量要使用this关键字【this.name】
(2)匿名内部类
一个继承了类的匿名子类对象或者实现了借口的匿名实现类对象。new 类名/方法名(){//重写方法}
作用是简化代码

6.JDK,JRE,JVM的区别

JDK:Java Development Kit,java的开发工具包,用来开发java程序的。
JRE:Java Runtime Environment,Java的运行环境
JVM:Java Virtual machine,java虚拟机,用来执行字节码文件(.class)
JDK包括JRE,java基础类库,Java开发工具,而JRE又包括JVM,java运行在JVM上。
JDK是给开发人员使用的,而JRE和JVM是给普通用户使用

7.Java基本操作类型

java有三种基本操作类型,分别是整型,浮点型和布尔型
整型可以分为byte,short,int,long
浮点型可以分为float和double
其中,bool和byte占一字节,short和char占两字节,int和float占四字节,long和double占八字节
8.final的作用
final表示最终,final修饰的变量称之为常量,一经赋值,不能更改;
final修饰的方法为最终方法,当final所在的类被继承,final方法不能覆盖重写
final修饰的类称为最终类,该类不能被继承

9.String,StringBuffer,StringBuilder的区别

String类含有final关键字,声明的是不可变对象,每次操作都会返回一个新的对象;
StringBuffer和StringBudder创建的是可变的字符串对象,StringBuffer是线程安全的,StringBuilder是非线程安全的,
但是StringBuilder性能比较高,所以,在多线程时推荐使用StringBuffer
String和StringBuffer转化
String–>StringBuffer:StringBuffer sb=new StringBuffer(str);
StringBuffer->String:sb.toString

10.在try-catch-finally语句中,若try中含有return语句,先执行try-catch还是finally语句

在try-catch-finally中,先执行try-catch语句,在执行catch语句。在try-catch中含有return时,执行完try-catch语句先
将reuturn存储,执行完finally语句后返回return

11.创建线程的几种方法

1.继承Thread类,重写run()方法
2.实现Runnable接口,重写run()方法,然后调用Thread();
3.实现Callable接口,重写call方法,需要使用FutureTask();
【补充:run()和call()的区别:run()无返回值,run()有返回值

12.线程六种状态

New(新建) :线程刚创建还未调用start方法;
Runnable(可运行):调用start方法时,此时线程可运行可不运行
Blocked(锁阻塞):当线程试图获取一个线程锁,但是线程锁被其他线程使用,线程进入锁阻塞状态,当线程获取线程锁,回到可运行状态
Waiting(无线等待):一个线程等待另一个线程执行,进入无线等待状态,进入无线等待状态的线程需要其他线程调用notify()或notifyAll()唤醒
TimedWaiting(计时等待):计时结束后唤醒线程,通过sleep()或wait(int time)实现
Teminated(被终止):running()方法正常退出或出现异常

13.线程锁 synchronized和lock

区别:

synchronized是一个关键字,而lock则是一个类;
synchronized是一个隐式锁,而lock是一个显式锁,lock需要手动的获取锁和释放锁,而synchronized是自动释放锁;
synchronized除了运行结束和抛出异常外是不可中断的,而lock锁可以中断【通过设置超时方法tryLock()】

14.死锁

多个线程由于等待某个资源,进入堵塞状态,线程进入无限阻塞,就是死锁。当一个线程一只占用其他线程等待的资源的时候会发生死锁,当两个线程互相等待对方释放资源的时候也会发生死锁
互斥产生的四个条件:
互斥使用:当一个线程使用一个资源时,其他线程不能使用
不可抢占:资源请求者不能从使用者手中抢夺资源
循环等待;形成一个等待资源例如P1占有 p2资源,P2占有P3资源,P3占有P1资源
请求和保持:资源使用者在请求其他资源时保持对原有资源的使用

15.计算2*8的有效方法

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,

16.并行和并发

并行是指两个或者多个事件在同一时刻发生;
并发是指两个或多个事件在同一时间间隔发生。

17.&和&&的区别

& 既是位运算符又是逻辑运算符,&的两侧可以是int,也可以是boolean表达式,当&两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算,而短路与(&&)的两侧要求必须是布尔表达式。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值