目录
一、面向对象
1.面向对象的概念
面向对象是相对于面向过程来说的,面向过程是一种以“过程”为中心的编程思想,分析出解决问题所需的步骤,然后用函数把这些步骤一步步的实现,使用的时候一个个依次调用就好。而面向对象,是一种以“对象”为中心的编程思想,把问题看成一个个对象,通过对象的属性和行为,将问题解决的。面向过程强调的是模块化,而面向对象强调的是把事物对象化。
2.面向对象和类的关系
- 类是指一组相关的属性和行为的集合,可以看成一类事物的模板。例:人有身高,体重等属性,有说话,打球等行为
- 属性: 对应类中的成员变量
- 行为: 对应类中的成员函数
- 对象是指该类事务的具体体现
3.面向对象和面向过程的区别
- 类是对象的模板,对象是类的实体。类描述了一类事物的共性特征,而对象则表示了一类事物中的个体差异;
- 类是抽象的,对象是具体的。类只是一个概念,它不能直接使用,而对象是真实存在的,它可以被创建、操作和销毁;
- 类是静态的,对象是动态的。类在编译时就已经确定了,它不会随着程序的运行而改变,而对象在运行时才被创建,它可以根据不同的情况而改变自己的状态和行为;
- 类和对象之间存在一对多的关系。一个类可以创建多个对象,每个对象都属于该类,但是每个对象都有自己独特的属性值和方法实现。
面向过程:面向过程以过程为核心,强调事情的流程、顺序
-
特点:流程化、顺序化
-
优点:性能比面向对象高
-
缺点:没有面向对象那么易扩展、易维护、易复用
面向对象:面向对象以对象为核心,强调事情的主体,角色
-
特点:抽象、封装、继承、多态
-
优点:易维护、易复用、易扩展、低耦合
-
缺点:性能低、开销大
-
例:
小明起床上班
面向过程:
-
起床
-
刷牙洗脸
-
开车上班
面向对象:
-
主人公:小明
-
拥有的财产:床、牙刷、车
-
小明可以做什么:起床、刷牙洗脸、开车
-
二、封装
隐藏对象的属性和实现细节,仅对外提供公共的访问方式
例:买车只需要会开即可,不用关心汽车零件之间是如何配合工作的
-
好处:
-
隐藏实现的细节,提供公共的访问方式
-
提高代码的复用性
-
提高安全性
-
-
原则:
-
将不需要对外提供的内容隐藏
-
将属性隐藏,提供公共的方法进行访问
-
三、继承
Java的继承是一种实现代码复用和多态的机制,当两个类具有相同的属性和方法时,可以将相同的部分提取出来,放到一个类中当做父类,再通过继承这个父类,子类可以拥有父类的非private的所有成员变量和方法,并可以添加新的属性和方法或者重写父类的方法以提高代码的可读性和可维护性,避免了不必要的代码重复和冗余。
Java中实现继承的主要方式是通过extends关键字。Java只支持单继承,即一个类只能有一个直接父类,但可以有多个间接父类。
好处:
重复使用代码,降低冗余,为多态做铺垫
语法:
// 定义一个父类
class Parent {
// 父类的属性和方法
}
// 定义一个子类,使用 extends 关键字继承父类
class Child extends Parent {
// 子类的属性和方法
}
示例:
// 定义一个 Animal 类,作为父类
class Animal {
// 定义一个 name 属性
protected String name;
// 定义一个构造方法,用于初始化 name 属性
public Animal(String name) {
this.name = name;
}
// 定义一个 eat 方法,用于表示动物吃东西的行为
public void eat() {
System.out.println(name + " is eating.");
}}
// 定义一个 Dog 类,使用 extends 关键字继承 Animal 类
class Dog extends Animal {
// 定义一个 breed 属性
private String breed;
// 定义一个构造方法,用于初始化 name 和 breed 属性
public Dog(String name, String breed) {
// 使用 super 关键字调用父类的构造方法
super(name);
this.breed = breed;
}
// 重写父类的 eat 方法,用于表示狗吃东西的行为
@Override
public void eat() {
System.out.println(name + " is eating dog food.");
}
// 定义一个 bark 方法,用于表示狗叫的行为
public void bark() {
System.out.println(name + " is barking.");
}
}
// 创建一个 TestAnimal 类,用于测试 Animal 和 Dog 类
public class TestAnimal {
public static void main(String[] args) {
// 创建一个 Animal 类的对象 a1,并初始化其 name 属性为 "Tom"
Animal a1 = new Animal("Tom");
// 调用 a1 对象的 eat 方法
a1.eat(); // Tom is eating.
// 创建一个 Dog 类的对象 d1,并初始化其 name 和 breed 属性为 "Jack" 和 "Husky"
Dog d1 = new Dog("Jack", "Husky");
// 调用 d1 对象的 eat 方法
d1.eat(); // Jack is eating dog food.
// 调用 d1 对象的 bark 方法
d1.bark(); // Jack is barking.
}
}
四、多态
Java的多态是一种实现不同对象对同一消息的不同响应的机制,它可以让一个方法或者一个对象具有多种形态。
多态的目的是为了实现类之间的解耦,使得子类可以替换父类,而不影响原有的代码逻辑。多态也可以提高代码的可扩展性和可维护性,避免了使用大量的if-else或switch-case语句。
-
概念
多态可以说是同一接口,多种实现
同一行为具有多个不同表现形式或形态的能力
即父类引用指向子类对象,被引用对象的类型决定调用谁的方法
-
特点
消除类型之间的耦合关系,实现低耦合
具有灵活性、可扩充性、可替换性
-
使用条件
-
继承
-
重写
-
父类引用指向子类对象
-
示例:
// 定义一个 Toilet 类,作为父类
public class Toilet{
// 定义一个 toilet方法,用于表示上厕所的行为
public void toilet(){
System.out.print("厕所");
}
}
// 定义一个 Man 类,使用 extends 关键字继承 Toilet类
public class Man extends Toilet{
@Override
public void toilet(){
System.out.println("男厕");
}
}
// 定义一个 Woman 类,使用 extends 关键字继承 Toilet类
public class Woman extends Toilet{
@Override
public void toilet(){
System.out.println("女厕");
}
}
public static void main(String[] args) {
Toilet man = new Man();
Toilet woman = new Woman();
man.toilet(); // 输出男厕
woman.toilet(); // 输出女厕
}
五、接口与抽象类
1.接口
-
接口相当于对外提供的一种约定和标准(例如:Type-C、安卓、苹果充电口)
-
通俗的讲,接口就是某个事物对外提供的一些功能的声明,其定义和类相似,只不过用interface关键字修饰
-
接口中所有属性默认为public static final
-
接口中所有方法默认为public abstract
-
接口可以说是一个极端的抽象类
-
接口不能实例化
-
一个类可以实现多个接口,但只能继承一个父类
2.抽象类
-
含有abstract修饰符的class类
-
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体
-
抽象类不能实例化
-
抽象类只能单继承
-
抽象类的方法必须在子类中重写,若子类没有重写所有抽象方法,那么子类也要定义为抽象类
3.接口和抽象类的区别
接口 | 抽象类 | |
---|---|---|
构造方法 | 没有 | 有 |
静态方法 | 没有 | 有 |
普通成员变量 | 没有 | 有 |
静态成员变量 | 必须声明为public final static | 可随意 |
方法 | 抽象方法必须为public | 抽象方法可以为public或protected |
实现 | 一个类可以实现多个接口 | 只能继承一个抽象类 |
六、关键字
1.Java关键字
-
Java关键字:
abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while,
以下仅介绍相对比较常用的关键字,感兴趣可自行了解其他关键字。
2.abstract
抽象关键字,用于修饰类和方法。当修饰类时,表示该类是抽象类,不能被实例化;当修饰方法时,表示该方法是抽象方法,只有方法的声明,没有方法的实现,需要在子类中重写。
3.break
跳出循环或switch语句的关键字
4.continue
跳过当前循环的剩余代码,继续下一次循环。
5.extends
子类通过extends关键字继承父类的属性和方法,并可以重写或新增方法。
6.final
用于修饰类、方法和变量。当修饰类时,表示该类不能被继承;当修饰方法时,表示该方法不能被子类重写;当修饰变量时,表示该变量的值不能被修改。
7.finally
异常处理中的关键字,用于定义无论是否发生异常都会执行的代码块。
try {
// 代码块
} catch (Exception e) {
// 异常处理
} finally {
// 无论是否发生异常都会执行的代码块
}
8.static
静态关键字,用于修饰成员变量和方法。当修饰成员变量时,表示该变量属于类,而不是对象,所有对象共享同一个静态变量;当修饰方法时,表示该方法属于类,可以直接通过类名调用,无需创建对象。
9.this
通过this关键字访问当前对象的属性和方法。this()需放在方法的第一行
10.super
通过super关键字调用父类的构造方法和方法。super()需放在方法的第一行
11.synchronized
同步关键字,用于实现线程的同步,保证多个线程对共享资源的互斥访问。通过使用synchronized关键字修饰方法或代码块,可以确保同一时间只有一个线程执行该方法或代码块,其他线程需要等待。
七、package包
Java包简单来讲就类似于windows系统的文件夹,用来分类文件用的,从而能够更加方便、快捷的管理文件。
Java package包命名规则:
包名全部由小写字母;
如果包名包含多个层次,每个层次用“.”分割;
包名一般由倒置的域名开头,比如 com.baidu;
自定义包不能 java 开头。