一、随堂复习
1. 关键字:static
-
static:静态的,随着类的加载而加载、执行。
-
static用来修饰:属性、方法、代码块、内部类
-
熟悉:static修饰的类变量、类方法与不使用static修饰的区别。
-
类变量:类的生命周期内,只有一个。被类的多个实例共享。
-
-
掌握:我们遇到属性或方法时,需要考虑是否声明为static的。
2. 单例模式(或单子模式)
-
经典的设计模式有23种
-
解决的问题:在整个软件系统中,只存在当前类的唯一实例。
-
实现方式:饿汉式、懒汉式、枚举类等
-
对比饿汉式和懒汉式
-
饿汉式:“立即加载”,线程安全的。
-
懒汉式:"延迟加载",线程不安全。
-
-
需要会手写饿汉式和懒汉式
3. 理解main()方法
-
public static void main(String[] args){}
-
理解1:作为程序的入口;普通的静态方法
-
理解2:如何使用main()与控制台进行数据的交互。
-
命令行:java 类名 "Tom" "Jerry" "123"
-
4. 类的成员之四:代码块
-
分类:静态代码块、非静态代码块
-
使用频率上来讲:用的比较少。
-
静态代码块:随着类的加载而执行
-
非静态代码块:随着对象的创建而执行
总结:对象的实例变量可以赋值的位置及先后顺序
① 默认初始化 ② 显式初始化 或 ⑤ 代码块中初始化 ③ 构造器中初始化
④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值
执行的先后顺序: ① - ②/⑤ - ③ - ④
5. 关键字:final
-
最终的
-
用来修饰:类、方法、变量(成员变量、局部变量)
-
类:不能被继承
-
方法:不能被重写
-
变量:是一个“常量”,一旦赋值不能修改。
-
6. 关键字:abstract
-
抽象的
-
用来修饰:类、方法
-
类:抽象类:不能实例化。
-
方法:抽象方法:没有方法体,必须由子类实现此方法。
-
7. 关键字:interface
-
interface:接口,用来定义一组规范、一种标准。
-
掌握:接口中可以声明的结构。
-
属性:使用public static final修饰
-
方法:jdk8之前:只能声明抽象方法,使用public abstract修饰
jdk8中:声明static方法、default方法。
jdk9中:声明private方法。
-
-
笔试题:抽象类、接口的对比。
8. 类的成员之五:内部类
> 成员内部类的理解 > 如何创建成员内部类的实例 > 如何在成员内部类中调用外部类的结构 > 局部内部类的基本使用(关注:如何在方法内创建匿名局部内部类的对象)
9. 枚举类:enum
-
掌握:使用enum关键字定义枚举类即可。
10. 注解:Annotation
-
框架 = 注解 + 反射 + 设计模式
-
Java基础阶段:简单。@Override 、 @Deprecated、@SuppressWarnings
-
元注解:对现有的注解进行解释说明。
-
@Target:表明可以用来修饰的结构
-
@Retation:表明生命周期
-
-
如何自定义注解。
11. 包装类的使用
-
掌握:基本数据类型对应的包装类都有哪些?
-
掌握:基本数据类型、包装类、String三者之间的转换
-
基本数据类型 <-> 包装类:自动装箱、自动拆箱
-
基本数据类型、包装类 <-> String
-
String的valueOf(xxx)
-
包装类的parseXxx(String str)
-
-
12. IDEA:快捷键和debug
二、企业真题
2.1 static关键字
1. 静态变量和实例变量的区别?(保*丰、*软国际、*软华*、北京明**信)
类似问题: > 说明静态变量和实例变量之间的区别和使用场景(上海*动)
对比静态变量与实例变量:
① 个数
>静态变量:在内存空间中只有一份,被类的多个对象所共享。
>实例变量:类的每一个实例(或对象)都保存着一份实例变量。
② 内存位置
>静态变量:jdk6及之前:存放在方法区。 jdk7及之后:存放在堆空间
>实例变量:存放在堆空间的对象实体中。
③ 加载时机
>静态变量:随着类的加载而加载,由于类只会加载一次,所以静态变量也只有一份。
>实例变量:随着对象的创建而加载。每个对象拥有一份实例变量。
④ 调用者
>静态变量:可以被类直接调用,也可以使用对象调用。
>实例变量:只能使用对象进行调用。
⑤ 判断是否可以调用 ---> 从生命周期的角度解释
类变量 实例变量
类 yes no
对象 yes yes
⑥ 消亡时机
>静态变量:随着类的卸载而消亡
>实例变量:随着对象的消亡而消亡
2. 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?(*度)
类似问题: > 在java中,可以重载一个static方法吗?可以覆盖一个static方法吗?(Vi*o)
静态方法不能被重写。不存在多态性。
3. 是否可以从一个static方法内部发出对非static方法的调用?(同*顺)
只能通过对象来对非静态方法的调用。
4. 被static修饰的成员(类、方法、成员变量)能否再使用private进行修饰?(联*优势)
完全可以。除了代码块。
2.2 设计模式
1. 知道哪些设计模式?(*通快递、蚂**服)
单例模式、模板方法、享元设计模式
2. 开发中都用到了那些设计模式?用在什么场合? (久*国际物流)
略(后面补充)
2.3 main()
1. main()方法的public能不能换成private,为什么(凡*科技、顺*)
可以改。但是改完以后就不是程序入口了。
2. main()方法中是否可以调用非静态方法?(浩*科技)
只能通过对象来对非静态方法的调用。
2.4 代码块
1. 类的组成和属性赋值执行顺序?(航*拓普)
类似问题: > Java中类的变量初始化的顺序?(*壳)
① 默认初始化
② 显式初始化 或 ⑤ 代码块中初始化
③ 构造器中初始化
***********************
④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值
2. 执行的先后顺序:
① - ②/⑤ - ③ - ④
2. 静态代码块,普通代码块,构造方法,从类加载开始的执行顺序?(恒*电子)
类似问题: > 类加载成员变量、静态代码块、构造器的加载顺序(*科软、软**力、同*顺) > static代码块(静态代码块)是否在类的构造函数之前被执行(联*优势)
静态代码块 --> 普通代码块 --> 构造器
2.5 final关键字
1. 描述一下对final理解(华**博普)
1. final的理解:最终的
2. final可以用来修饰的结构:类、方法、变量
3. 具体说明:
3.1 final修饰类:表示此类不能被继承。
比如:String、StringBuffer、StringBuilder类
3.2 final修饰方法:表示此方法不能被重写
比如:Object类中的getClass()
3.3 final修饰变量:既可以修饰成员变量,也可以修饰局部变量。
此时的"变量"其实就变成了"常量",意味着一旦赋值,就不可更改。
3.3.1 final修饰成员变量: 有哪些位置可以给成员变量赋值?
> 显式赋值
> 代码块中赋值
> 构造器中赋值
3.3.2 final修饰局部变量:一旦赋值就不能修改
> 方法内声明的局部变量:在调用局部变量前,一定需要赋值。而且一旦赋值,就不可更改
> 方法的形参:在调用此方法时,给形参进行赋值。而且一旦赋值,就不可更改
4. final与static搭配:修饰成员变量时,此成员变量称为:全局常量。
比如:Math的PI
2. 判断题:使用final修饰一个变量时,是引用不能改变,引用指向的对象可以改变?(*米)
引用不能改变。
引用指向的对象实体中的属性,如果没有使用final修饰,则可以改变。
3. 判断题:final不能用于修饰构造方法?(联*优势)
是的。
4. final或static final 修饰成员变量,能不能进行++操作?(佳*贸易)
不能。
2.6 抽象类与接口
1. 什么是抽象类?如何识别一个抽象类?(易*支付)
使用abstract修饰。
2. 为什么不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法?(止**善)
不能用abstract修饰私有方法、静态方法、final的方法、final的类。
> 私有方法不能重写
> 避免静态方法使用类进行调用
> final的方法不能被重写
> final修饰的类不能有子类
3. 接口与抽象类的区别?(字*跳动、阿*校招、*度校招、**计算机技术及应用研究所、航*拓普、纬*、招**晟、汇*云通、数信**科技、北京永*鼎力、上海*连科技)
> 共性:都可以声明抽象方法
都不能实例化
> 不同:① 抽象类一定有构造器。接口没有构造器
② 类与类之间继承关系,类与接口之间是实现关系,接口与接口之间是多继承关系
4. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?(航*拓普、*蝶、深圳德*科技)
类似问题: > 接口A可以继承接口B吗?接口A可以实现接口B吗?(久*国际物流)
是;是;是;
5. 接口可以有自己属性吗?(华*中盛)
可以。必须是public static final的
6. 访问接口的默认方法如何使用(上海*思)
使用实现类的对象进行调用。而且实现还可以重写此默认方法。
2.7 内部类
1. 内部类有哪几种?(华油**普、来*科技)
> 成员内部类:直接声明在外部类的里面。
> 使用static修饰的:静态的成员内部类
> 不使用static修饰的:非静态的成员内部类
> 局部内部类:声明在方法内、构造器内、代码块内的内部类
> 匿名的局部内部类
> 非匿名的局部内部类
> 从类的角度看:
- 内部可以声明属性、方法、构造器、代码块、内部类等结构
- 此内部类可以声明父类,可以实现接口
- 可以使用final修饰
- 可以使用abstract修饰
> 从外部类的成员的角度看:
- 在内部可以调用外部类的结构。比如:属性、方法等
- 除了使用public、缺省权限修饰之外,还可以使用private、protected修饰
- 可以使用static修饰
2. 内部类的特点说一下(招通**)
类似问题: > 说一下内部类的好处(北京楚*龙) > 使用过内部类编程吗,有什么作用(软**力)
8.匿名类说一下(阿*校招、上海立*网络)
略(后面补充)
2.8 枚举类
1. 枚举可以继承吗?(顺*)
使用enum定义的,其父类就是Enum类,就不要再继承其他的类了。
2.9 包装类
1. Java基本类型与包装类的区别(凡*科技)
包装类的使用
1. 为什么要使用包装类?
为了使得基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性),我们给各个基本数据
类型的变量都提供了对应的包装类。
2. 掌握基本数据类型对应的包装类类型
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double ->Double
char -> Character
boolean -> Boolean
3. 掌握基本数据类型 与 包装类之间的转换。
3.1 为什么需要转换
> 一方面,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要将基本数据类型的变量转换为
包装类的对象。比如:ArrayList的add(Object obj);Object类的equals(Object obj)
> 对于包装类来讲,既然我们使用的是对象,那么对象是不能进行+ - * /等运算的。为了能够进行这些运算,就
需要将包装类的对象转换为基本数据类型的变量。
3.2 如何转换:
基本数据类型 ---> 包装类:① 使用包装类的构造器 ② (建议)调用包装类的valueOf(xxx xx)
包装类 ---> 基本数据类型:调用包装类的xxxValue()
注意:原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了!
jdk5.0新特性:自动装箱、自动拆箱。
4. String 与 基本数据类型、包装类之间的转换。
基本数据类型、包装类 ---> String类型:① 调用String的重载的静态方法valueOf(xxx xx) ; ② 基本数据类型的变量 + ""
String类型 ---> 基本数据类型、包装类:parseXxx()
2.10 综合
1. 谈谈你对面向对象的理解(君*科技、航*拓普、...)
-
面向对象的两个要素:类、对象 ---> 面向对象编程。“万事万物皆对象”。
-
面向对象的三大特征
-
接口,与类并列的结构,作为一个补充:类可以实现多个接口。
2. 面向对象的特征有哪些方面? (北京楚*龙、深圳德*科技、直*科技、米*奇网络、航*拓普)
类似问题: > 面向对象核心是什么?(平**服)