08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用)
- A:代码块概述
- 在Java中,使用{}括起来的代码被称为代码块。
- B:代码块分类
- 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。
- C:常见代码块的应用
- a:局部代码块
- 在方法中出现;限定变量生命周期,及早释放,提高内存利用率
- b:构造代码块 (初始化块)
- 在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
- c:静态代码块
- 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
- 一般用于加载驱动
- a:局部代码块
08.02_面向对象(代码块的面试题)(掌握)
- A:看程序写结果
-
class Student { static { System.out.println("Student 静态代码块"); } { System.out.println("Student 构造代码块"); } public Student() { System.out.println("Student 构造方法"); } } class Demo2_Student { static { System.out.println("Demo2_Student静态代码块"); } public static void main(String[] args) { System.out.println("我是main方法"); Student s1 = new Student(); Student s2 = new Student(); } }
08.03_面向对象(继承案例演示)(掌握)
- A:继承(extends)
- 让类与类之间产生关系,子父类关系
- B:继承案例演示:
- 动物类,猫类,狗类
- 定义两个属性(颜色,腿的个数)两个功能(吃饭,睡觉)
- C:案例演示
- 使用继承前
- D:案例演示
- 使用继承后
08.04_面向对象(继承的好处和弊端)(掌握)
- A:继承的好处
- a:提高了代码的复用性
- b:提高了代码的维护性
- c:让类与类之间产生了关系,是多态的前提
- B:继承的弊端
-
类的耦合性增强了。
-
开发的原则:高内聚,低耦合。
-
耦合:类与类的关系
-
内聚:就是自己完成某件事情的能力
-
08.05_面向对象(Java中类的继承特点)(掌握)
- A:Java中类的继承特点
- a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
- 有些语言是支持多继承,格式:extends 类1,类2,…
- b:Java支持多层继承(继承体系)
- a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
- B:案例演示
- Java中类的继承特点
- 如果想用这个体系的所有功能用最底层的类创建对象
- 如果想看这个体系的共性功能,看最顶层的类
- Java中类的继承特点
08.06_面向对象(继承的注意事项和什么时候使用继承)(掌握)
-
A:继承的注意事项
- a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
- b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
- c:不要为了部分功能而去继承
- 项目经理 姓名 工号 工资 奖金
- 程序员 姓名 工号 工资
-
B:什么时候使用继承
- 继承其实体现的是一种关系:“is a”。
Person
Student
Teacher
水果
苹果
香蕉
橘子
采用假设法。
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。 - 继承其实体现的是一种关系:“is a”。
08.07_面向对象(继承中成员变量的关系)(掌握)
- A:案例演示
- a:不同名的变量
- b:同名的变量
###08.08_面向对象(this和super的区别和应用)(掌握)
- A:this和super都代表什么
- this:代表当前对象的引用,谁来调用我,我就代表谁
- super:代表当前对象父类的引用
- B:this和super的使用区别
- a:调用成员变量
- this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
- super.成员变量 调用父类的成员变量
- b:调用构造方法
- this(…) 调用本类的构造方法
- super(…) 调用父类的构造方法
- c:调用成员方法
- this.成员方法 调用本类的成员方法,也可以调用父类的方法
- super.成员方法 调用父类的成员方法
- a:调用成员变量
08.09_面向对象(继承中构造方法的关系)(掌握)
- A:案例演示
- 子类中所有的构造方法默认都会访问父类中空参数的构造方法
- B:为什么呢?
-
因为子类会继承父类中的数据,可能还会使用父类的数据。
-
所以,子类初始化之前,一定要先完成父类数据的初始化。
-
其实:
- 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
-
08.10_面向对象(继承中构造方法的注意事项)(掌握)
- A:案例演示
- 父类没有无参构造方法,子类怎么办?
- super解决
- this解决
- B:注意事项
- super(…)或者this(….)必须出现在构造方法的第一条语句上
08.11_面向对象(继承中的面试题)(掌握)
- A:案例演示
-
看程序写结果1 class Fu{ public int num = 10; public Fu(){ System.out.println("fu"); } } class Zi extends Fu{ public int num = 20; public Zi(){ System.out.println("zi"); } public void show(){ int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(super.num); } } class Test1_Extends { public static void main(String[] args) { Zi z = new Zi(); z.show(); } } 看程序写结果2 class Fu { static { System.out.println("静态代码块Fu"); } { System.out.println("构造代码块Fu"); } public Fu() { System.out.println("构造方法Fu"); } } class Zi extends Fu { static { System.out.println("静态代码块Zi"); } { System.out.println("构造代码块Zi"); } public Zi() { System.out.println("构造方法Zi"); } } Zi z = new Zi(); 请执行结果。
08.12_面向对象(继承中成员方法关系)(掌握)
- A:案例演示
- a:不同名的方法
- b:同名的方法
08.13_面向对象(方法重写概述及其应用)(掌握)
- A:什么是方法重写
- 重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类,这个我们学完面向对象讲)
- B:方法重写的应用:
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。
- C:案例演示
- a:定义一个手机类。
08.14_面向对象(方法重写的注意事项)(掌握)
- A:方法重写注意事项
-
a:父类中私有方法不能被重写
- 因为父类私有方法子类根本就无法继承
-
b:子类重写父类方法时,访问权限不能更低
- 最好就一致
-
c:父类静态方法,子类也必须通过静态方法进行重写
- 其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解(静态只能覆盖静态)
-
子类重写父类方法的时候,最好声明一模一样。
-
- B:案例演示
- 方法重写注意事项
08.15_面向对象(方法重写的面试题)(掌握)
- A:方法重写的面试题
-
Override和Overload的区别?Overload能改变返回值类型吗?
-
overload可以改变返回值类型,只看参数列表
-
方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
-
方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
-
子类对象调用方法的时候:
- 先找子类本身,再找父类。
-
08.16_面向对象(使用继承前的学生和老师案例)(掌握)
- A:案例演示
- 使用继承前的学生和老师案例
- 属性:姓名,年龄
- 行为:吃饭
- 老师有特有的方法:讲课
- 学生有特有的方法:学习
08.17_面向对象(使用继承后的学生和老师案例)(掌握)
- A:案例演示
- 使用继承后的学生和老师案例
08.18_面向对象(猫狗案例分析,实现及测试)(掌握)
- A:猫狗案例分析
- B:案例演示
- 猫狗案例继承版
- 属性:毛的颜色,腿的个数
- 行为:吃饭
- 猫特有行为:抓老鼠catchMouse
- 狗特有行为:看家lookHome
08.19_面向对象(final关键字修饰类,方法以及变量的特点)(掌握)
- A:final概述
- B:final修饰特点
- 修饰类,类不能被继承
- 修饰变量,变量就变成了常量,只能被赋值一次
- 修饰方法,方法不能被重写
- C:案例演示
- final修饰特点
08.20_面向对象(final关键字修饰局部变量)(掌握)
- A:案例演示
-
方法内部或者方法声明上都演示一下(了解)
-
基本类型,是值不能被改变
-
引用类型,是地址值不能被改变,对象中的属性可以改变
-
08.21_面向对象(final修饰变量的初始化时机)(掌握)
- A:final修饰变量的初始化时机
- 显示初始化
- 在对象构造完毕前即可
相关面试题:
1:代码块是什么?代码块的分类和各自特点?
2:静态代码块,构造代码块,构造方法的执行流程?
3:继承概述
4:继承的好处
5:Java中继承的特点
6:Java中继承的注意事项?以及我们什么时候使用继承?
7:继承中的成员访问特点
A:成员变量
在子类方法中访问一个变量
B:成员方法
在测试类中通过子类对象去访问一个方法
8:继承中构造方法的执行流程?假如父类没有无参构造方法,子类应该怎么办?
9:final关键字可以干什么?有什么特点?
10:final关键字的面试题?
A:修饰局部变量
B:初始化时机
相关面试题:
- 使用 final 关键字修饰一个变量时, 是引用不能变, 还是引用的对象不能变?
使用 final 关键字修饰一个变量时, 是指引用变量不能变, 引用变量所指向的对象中的内容北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
还是可以改变的。 例如, 对于如下语句:
final StringBuffer a=new StringBuffer(“immutable”);
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是, 执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时, 可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param){
}
实际上, 这是办不到的, 在该方法内部仍然可以增加如下代码来修改参数对象:
param.append(“a”); - ""和 equals 方法究竟有什么区别?
操作符专门用来比较两个变量的值是否相等, 也就是用于比较变量所对应的内存中所存
储的数值是否相同, 要比较两个基本类型的数据或两个引用变量是否相等, 只能用操作
符。
如果一个变量指向的数据是对象类型的, 那么, 这时候涉及了两块内存, 对象本身占用一块
内存(堆内存) , 变量也占用一块内存, 例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存, 此时, 变量 obj 所对应的内存中存储的数值就是对象占用的那块
内存的首地址。 对于指向对象类型的变量, 如果要比较两个变量是否指向同一个对象, 即要
看这两个变量所对应的内存中的数值是否相等, 这时候就需要用操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同, 就好比去比较两个人的长相是否相
同, 它比较的两个对象是独立的。 例如, 对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条 new 语句创建了两个对象, 然后用 a,b 这两个变量分别指向了其中一个对象, 这是两个
不同的对象, 它们的首地址是不同的, 即 a 和 b 中存储的数值是不相同的, 所以, 表达式
ab 将返回 false, 而这两个对象中的内容是相同的, 所以, 表达式 a.equals(b)将返回 true。
在实际开发中, 我们经常要比较传递进行来的字符串内容是否等, 例如, String input
= …;input.equals(“quit”), 许多人稍不注意就使用进行比较了, 这是错误的, 随便从网上
找几个项目实战的教学视频看看, 里面就有大量这样的错误。 记住, 字符串的比较基本上都
是使用 equals 方法。
如果一个类没有自己定义 equals 方法, 那么它将继承 Object 类的 equals 方法, Object 类的
equals 方法的实现代码如下:
boolean equals(Object o){
return thiso;
} 这
说明, 如果一个类没有自己定义 equals 方法, 它默认的 equals 方法(从 Object 类继承的)
就是使用操作符, 也是在比较两个变量指向的对象是否是同一对象, 这时候使用 equals
和使用==会得到同样的结果, 如果比较的是两个独立的对象则总返回 false。 如果你编写的
类希望能够比较该类创建的两个实例对象的内容是否相同, 那么你必须覆盖 equals 方法, 由
你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。 - 静态变量和实例变量的区别?
语法定义上的区别: 静态变量前要加 static 关键字, 而实例变量前则不加。北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
程序运行时的区别: 实例变量属于某个对象的属性, 必须创建了实例对象, 其中的实例变量
才会被分配空间, 才能使用这个实例变量。 静态变量不属于某个实例对象, 而是属于类, 所
以也称为类变量, 只要程序加载了类的字节码, 不用创建任何实例对象, 静态变量就会被分
配空间, 静态变量就可以被使用了。 总之, 实例变量必须创建对象后才可以通过这个对象来
使用, 静态变量则可以直接使用类名来引用。
例如, 对于下面的程序, 无论创建多少个实例对象, 永远都只分配了一个 staticVar 变量, 并
且每创建一个实例对象, 这个 staticVar 就会加 1; 但是, 每创建一个实例对象, 就会分配一
个 instanceVar, 即可能分配多个 instanceVar, 并且每个 instanceVar 的值都只自加了 1 次。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
} 备
注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,
体现了自己有很好的解说问题和设计案例的能力, 思维敏捷, 超过一般程序员, 有写作能力! - 是否可从一个 static 方法内发出对非 static 方法的调用?
不可以。 因为非 static 方法是要与对象关联在一起的, 必须创建一个对象后, 才可以在该对
象上进行方法调用, 而 static 方法调用时不需要创建对象, 可以直接调用。 也就是说, 当一
个 static 方法被调用时, 可能还没有创建任何实例对象, 如果从一个 static 方法中发出对非
static 方法的调用, 那个非 static 方法是关联到哪个对象上的呢? 这个逻辑无法成立, 所以,
一个 static 方法内部发出对非 static 方法的调用。 - Integer 与 int 的区别
int 是 java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装类, Integer 是 java
为 int 提供的封装类。 int 的默认值为 0, 而 Integer 的默认值为 null, 即 Integer 可以区分出
未赋值和值为 0 的区别, int 则无法表达出未赋值的情况, 例如, 要想表达出没有参加考试
和考试成绩为 0 的区别, 则只能使用 Integer。 在 JSP 开发中, Integer 的默认为 null, 所以用
el 表达式在文本框中显示时, 值为空白字符串, 而 int 默认的默认值为 0, 所以用 el 表达式
在文本框中显示时, 结果为 0, 所以, int 不适合作为 web 层的表单数据的类型。
在 Hibernate 中, 如果将 OID 定义为 Integer 类型, 那么 Hibernate 就可以根据其值是否为 null
而判断一个对象是否是临时的, 如果将 OID 定义为了 int 类型, 还需要在 hbm 映射文件中
设置其 unsaved-value 属性为 0。
另外, Integer 提供了多个与整数相关的操作方法, 例如, 将一个字符串转换成整数, Integer
中还定义了表示整数的最大值和最小值的常量。 - Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math 类中提供了三个与取整有关的方法: ceil、 floor、 round, 这些方法的作用与它们的英
文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)
的结果为 12,Math.ceil(-11.3)的结果是-11; floor 的英文意义是地板, 该方法就表示向下取整,
Math.ceil(11.6)的结果为 11,Math.ceil(-11.6)的结果是-12; 最难掌握的是 round 方法, 它表示北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
“四舍五入” , 算法为 Math.floor(x+0.5), 即将原来的数字加上 0.5 后再向下取整, 所以,
Math.round(11.5)的结果为 12, Math.round(-11.5)的结果为-11。 - 下面的代码有什么不妥之处?
- if(username.equals(“zxx”){}
2.int x = 1;
return x==1?true:false; - 请说出作用域 public, private, protected, 以及不写时的区别
说明: 如果在修饰的元素上面没有写任何访问修饰符, 则表示 friendly。
作用域 当前类 同一 package 子孙类 其他 package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
备注: 只要记住了有 4 种访问权限, 4 个访问范围, 然后将全选和范围在水平和垂直方向上
分别按排从小到大或从大到小的顺序排列, 就很容易画出上面的图了。 - Overload 和 Override 的区别。 Overloaded 的方法是否可以改变返回值的类型?
Overload 是重载的意思, Override 是覆盖的意思, 也就是重写。
重载 Overload 表示同一个类中可以有多个名称相同的方法, 但这些方法的参数列表各不相
同(即参数个数或类型不同) 。
重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类
创建的实例对象调用这个方法时, 将调用子类中的定义方法, 这相当于把父类中定义的那个
完全相同的方法给覆盖了, 这也是面向对象编程的多态性的一种表现。 子类覆盖父类的方法
时, 只能比父类抛出更少的异常, 或者是抛出父类抛出的异常的子异常, 因为子类可以解决
父类的一些问题, 不能比父类有更多的问题。 子类方法的访问权限只能比父类的更大, 不能
更小。 如果父类的方法是 private 类型, 那么, 子类则不存在覆盖的限制, 相当于子类中增
加了一个全新的方法。
至于 Overloaded 的方法是否可以改变返回值的类型这个问题, 要看你倒底想问什么呢? 这
个题目很模糊。 如果几个 Overloaded 的方法的参数列表不一样, 它们的返回者类型当然也
可以不一样。 但我估计你想问的问题是: 如果两个方法的参数列表完全一样, 是否可以让它
们的返回值不同来实现重载 Overload。 这是不行的, 我们可以用反证法来说明这个问题, 因
为我们有时候调用一个方法时也可以不定义返回结果变量, 即不要关心其返回结果, 例如,
我们调用 map.remove(key)方法时, 虽然 remove 方法有返回值, 但是我们通常都不会定义接
收返回结果的变量, 这时候假设该类中有两个名称和参数列表完全相同的方法, 仅仅是返回
类型不同, java 就无法确定编程者倒底是想调用哪个方法了, 因为它无法通过返回结果类型
来判断。
override 可以翻译为覆盖, 从字面就可以知道, 它是覆盖了一个方法并且对其重写, 以求达
到不同的作用。 对我们来说最熟悉的覆盖就是对接口方法的实现, 在接口中一般只是对方法
进行了声明, 而我们在实现时, 就需要实现接口声明的所有方法。除了这个典型的用法以外,
我们在继承中也可能会在子类覆盖父类中的方法。 在覆盖要注意以下的几点:
1、 覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配, 才能达到覆盖的效果;
2、 覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、 覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致, 或者是其子类;北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
4、 被覆盖的方法不能为 private, 否则在其子类中只是新定义了一个方法, 并没有对其进行
覆盖。
overload 对我们来说可能比较熟悉, 可以翻译为重载, 它是指我们可以定义一些名称相同的
方法, 通过定义不同的输入参数来区分这些方法, 然后再调用时, VM 就会根据不同的参数
样式, 来选择合适的方法执行。 在使用重载要注意以下的几点:
1、 在使用重载时只能通过不同的参数样式。 例如, 不同的参数类型, 不同的参数个数, 不
同的参数顺序(当然, 同一方法内的几个参数类型必须不一样, 例如可以是 fun(int,float),
但是不能为 fun(int,int)) ;
2、 不能通过访问权限、 返回类型、 抛出的异常进行重载;
3、 方法的异常类型和数目不会对重载造成影响;
4、 对于继承来说, 如果某一方法在父类中是访问权限是 priavte, 那么就不能在子类对其进
行重载, 如果定义的话, 也只是定义了一个新方法, 而不会达到重载的效果。