【第二章:Java核心技术解析】第3节:Java基础 - 必知必会(上)
大家好,很高兴我们可以一起学习交流Java高频面试题。按照前面的专刊大纲,我们从这节开始交流学习Java核心技术。本专刊的Java核心技术解析分为了基础篇,进阶篇和框架篇。
本小节是基础篇的第一小节,我们从最基础的Java知识点开始学习。本节涉及到的知识点包括面向对象的三大特性,即封装,继承与多态,并且对常见且容易混淆的重要概念覆盖和重载进行了比较分析等。本小节主要是帮助大家更好的复习与掌握Java面试中的基础类题目,争取在与面试官的热身题目中占据先机,留下好印象。
(1) 面向对象可以解释下吗?都有哪些特性?
答:面向对象是一种思想,可以将复杂问题简单化,让我们从执行者变为了指挥者。面向对象的三大特性为:封装,继承与多态。
- 封装:将事物封装成一个类,减少耦合,隐藏细节。保留特定的接口与外界联系,当接口内部发生改变时,不会影响外部调用方。
- 继承:从一个已知的类中派生出一个新的类,新类可以拥有已知类的行为和属性,并且可以通过覆盖/重写来增强已知类的能力。
- 多态:多态的本质就是一个程序中存在多个同名的不同方法,主要通过三种方式来实现:
- 通过子类对父类的覆盖来实现
- 通过在一个类中对方法的重载来实现
- 通过将子类对象作为父类对象使用来实现
解析:
这算是一个相当基础的问题,面向对象的思想以及其三大特性我们均需要有较好的理解。接下来,我们对三大特性进行一个详细的阐述与解析吧。
关于封装
封装主要是为了增加程序的可读性,解耦合并且隐藏部分实现细节。让我们来看下边的案例,看看该如何实现封装。
案例:
package com.pak1; public class Test { public static void main(String[] args) { Student student = new Student(); student.name = "小明"; student.age = 16; student.printStudentAge(); Student student2 = new Student(); student2.name = "小白"; student2.age = 120; student2.printStudentAge(); } } class Student { String name; int age; public void printStudentAge() { System.out.println(name + "同学的年龄:" + age); } }
程序输出如下:
我们看到小白同学的年龄120,(假设)不符合业务逻辑需要,所以我们需要做一些内部逻辑的处理。所以需要进行代码封装,将内部逻辑进行一个隐藏。
封装之后的代码如下:
package com.pak1; public class Test { public static void main(String[] args) { Student student = new Student(); student.setName("小明"); student.setAge(16); student.printStudentAge(); Student student2 = new Student(); student.setName("小白"); student.setAge(120); student2.printStudentAge(); } } class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0 || age > 60) throw new RuntimeException("年龄设置不合法"); this.age = age; } public void printStudentAge() { System.out.println(name + "同学的年龄:" + age); } }
程序输出结果如下:
通过将Student这个类的name和age属性私有化,只有通过公共的get/set方法才能进行访问,在get/set方法中我们可以对内部逻辑进行封装处理,外部的调用方不必关心我们的处理逻辑。
关于继承:
我们需要注意Java中不支持多继承,即一个类只可以有一个父类存在。另外Java中的构造函数是不可以继承的,如果构造函数被private修饰,那么就是不明确的构造函数,该类是不可以被其它类继承的,具体原因我们可以先来看下Java中类的初始化顺序:
- 初始化父类中的静态成员变量和静态代码块
- 初始化子类中的静态成员变量和静态代码块
- 初始化父类中的普通成员变量和代码块,再执行父类的构造方法
- 初始化子类中的普通成员变量和代码块,再执行子类的构造方法
如果父类构造函数是的,则初始化子类的时候不可以被执行,所以解释了为什么该类不可以被继承,也就是说其不
在这里需要注意如下面试官的追问问题(高频)。剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>