核心目的:隐藏内部实现细节,提供公共接口以便使用者进行交互,增加代码的可维护性和安全性。
相关概念:类、对象、成员变量、方法、访问修饰符(public、private、protected、默认)。
生活举例:暗箱抽奖。将所有的票券(表示成1、2、3等数字,约定1是一等奖,大于5是不中奖)都放入盒子,留一个口,只允许一只手进去,且只允许拿一张票出来,在这个例子中,暗箱的作用就是随机出一个结果,且只提供了一个输入输出接口(窗口),进去的手相当于传入参数,拿出来的票代表的数字结果相当于输出参数。这种暗箱除了可以用于抽奖,也可以用于工作排班、团队分组等不同的场景,我们只需要为每个数字赋予不同的含义即可,这就是复用。同理,java自身提供的众多类就是基于此,它提供若干个接口,且规定了输入输出的数据规范。
封装体现了面向对象的设计原则,即我不关心你怎么达到某个要求,不关心过程,我只关心我需要付出什么,可以得到什么。面向对象与面向过程相对,他们的区别有点像中药和西药的区别,有句广告叫作“中药好,西药快”,某种重度也适用于面向对象与面向过程,前者只要好用有效就成,你什么药物作用原理我不关心,后者则需要根据物理等逻辑进行验证,强调代码的高效。
又比如出行线路选择,老王从A站乘高铁线路1到C,在 Java 中,A、C是输入输出,线路、交通工具就是方法内容,面向对象中我们只需要考虑AC,面向过程则是要考虑用哪种交通工具,A和C中间过了哪些站点,是否换乘,每阶段用了多少分钟等具体的过程。
PS:封装以类作为核心概念对象,可以应用于包、类(API)、方法(主要体现在只需注意输入输出)和属性(主要体现在访问私有)。
核心目的:实现代码复用,提高代码的可扩展性和可维护性。
相关概念:父类(超类、基类)、子类(派生类)、super 关键字。
生活举例:对公共部分,继承则拥有。有点类似于高中生物中 DNA 基因遗传特性,“龙生龙,凤生凤,老鼠的孩子会打洞”。比如影视小说中的师徒,只要拜入某某师傅门下成为其弟子,就可以被传授某某(基本)功法,某某(基本)武功等等,这种师徒关系就可以类比为继承,而一旦拜师就可以拥有的技能,就类比于一旦继承就可以有的属性或方法(非私有),一般来说,越是基本的东西越具有广泛型和适用性,越具有被继承的基础。
PS:继承关系主要用于描述的类与类之间的关系,方法一般直接调用,以实现代码复用。
核心目的:提高代码的灵活性和可扩展性,增加代码的可读性和可维护性,继承是多态的基础之一。
相关概念:父类引用指向子类对象、方法重载、方法重写、接口和抽象类。
生活举例:可以理解为方法在继承的基础上的发展或创新。与继承做对比举例,似于高中生物中 DNA 基因变异特性(一个人两只手,每只手五根手指就是继承遗传,指纹不同,大小肤色指纹等细微的差异就是变异多态),“龙生九子,子子不同”。以师徒来说,徒弟继承了师傅的技能,如讲笑话技能,那么实现讲笑话效果的过程、效果等就是多态,比如师傅喜欢讲动物笑话,徒弟喜欢历史笑话,师傅喜欢对儿童讲,徒弟喜欢对中学生、大学生讲,受众就相当于方法的输入。
PS:多态更倾向于描述方法的多种实现形式,构造方法的重载和普通方法的重写是多态的主要表现形式。
类的概述:类是面向对象编程的核心概念之一。类是用于创建对象的模板或蓝图,它定义了对象的属性(成员变量)和行为(方法)。Java中的类根据逻辑功能等特征可以分为:普通类、接口类、抽象类、枚举类、内部类等。
定义格式:访问修饰符 种类修饰符 class 类名{ ...... }
PS:1、访问修饰符包括 public、private、protected 或默认(无修饰符);
2、种类修饰符包括 interface、abstract、默认(无修饰符)(不包括枚举类、内部内)。
3、最少有一个抽象方法的类就是抽象类。
/* 普通类 */
public class MyClass {
}
/* 接口类 */
public interface MyInterface {
}
/* 抽象类 */
public abstract class MyAbstractClass {
// 成员变量
// 构造函数
// 抽象方法声明
public abstract void abstractMethod();
// 普通方法定义
public void abstractMethod(){
LocalClass localClass = new LocalClass(){
@Override
public void reMethod() {
System.out.println("内部类方法重写");
}
}
}
}
/* 枚举类 */
public enum MyEnum {
// 枚举常量列表
CONSTANT1,
CONSTANT2,
CONSTANT3;
// 可以添加成员变量、构造函数和方法
}
// PS:每一个 public 类都是一个单独的类class文件
对象概述:是类的实例化结果,它具有状态和行为,并且能够通过调用方法来执行特定的操作,使用 new 关键字和构造函数来创建。
创建格式:MyClass obj = new MyClass( );
PS:1、对象具有生命周期,指对象从创建到销毁的整个过程;
2、多个对象可以同时存在,它们具有相同的属性和行为,但可能具有不同的状态;
3、对象在不再被使用(没有任何引用指向)时,会被垃圾回收机制自动销毁。
概述:Java 中的访问权限共有四个等级,开放程度由高到低分别为:public > 默认/无修饰符 > protected > private。
PS:1、类只能使用 public 或默认/无修饰符;
2、构造方法可以使用 public、private 或默认/无修饰符;
3、成员变量和方法:可以使用 public、private、protected 或默认/无修饰符。
public 公共 |
protected 受保护 |
默认(无) |
private 私有 |
|
同一个类 |
✔ |
✔ |
✔ |
✔ |
同包子类 |
✔ |
✔ |
✔ |
✘ |
异包子类 |
✔ |
✔ |
✘ |
✘ |
不同包类 |
✔ |
✘ |
✘ |
✘ |
概述:包括属性和行为。属性即类的成员变量,行为即类的方法。
概述:类中的变量可以分为实例变量(普通变量,成员变量)、静态变量(全局变量)、局部变量、参数变量等。
实例变量:也称为对象变量,每个类的实例都拥有自己的一组实例变量,在类的内部定义,在对象创建时分配内存。
静态变量:也称类变量,用 static 修饰,与类本身关联,与类一起加载并分配内存,而不是与类的实例(对象)关联,被所有对象共享相同。
局部变量:在方法、构造方法或代码块中声明的变量,只在定义的范围中可见,超出范围后被销毁,一般无默认值,必须显式初始化后才能使用
参数变量:指方法或构造方法定义中的传入参数,在被调用时被赋予实际的值,作用范围仅限于方法或构造方法内部。
public class MyClass {
private int instanceVar; // 实例变量
private static int staticVar; // 静态变量
public void setInstanceVar(int value) { // value为参数变量
int localVar = 100; // localVar为局部变量,需初始化
instanceVar = value;
}
}
概述:完成某一个特定功能的代码块,从 Java 8 版本开始,类中的方法有普通方法、构造方法、抽象方法、默认方法、静态方法等种类。
定义格式:访问修饰符 返回值类型 方法名( 参数列表 ){ ......方法体......; return 返回值; }
内容组成:一般包括方法声明关键字、方法名、传入参数、方法体、返回值等内容。
PS:1、方法必须先定义,再使用;
2、不能在return后面写代码,return意味着方法结束;
3、函数可以不接收返回的值,但必须给出参数(可以为空列表)。
静态 |
普通 |
构造 |
抽象 |
默认 |
|
抽象类 |
✔ |
✔ |
✔ |
✔ |
✔ |
枚举类 |
✔ |
✔ |
✔ |
✔ |
|
接口类 |
✔ |
✔ |
✔ |
||
普通类 |
✔ |
✔ |
✔ |
public interface MyInterface {
// 抽象方法
void abstractMethod();
// 默认方法
default void defaultMethod() {
// 方法体
}
}
class MyClass{
public static void main(String[] args){ // 静态方法
String str = new MyClass().intToString(1996);
System.out.println(str);
}
public String intToString(int num){ // 普通方法
return num + ""; // 返回值
}
}