JAVA_面向对象
1. 面向对象
1.1 面向对象的思想
-
概述
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
-
面向过程:强调步骤。
-
面向对象:强调对象
-
三大特征:
- 继承
- 封装
- 多态
-
特点: 面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态 。
1.2 类和对象
-
什么是类:
- 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。现实中,描述一类事物。
- 属性:就是该事物的状态信息。
- 行为:就是该事物能够做什么。
-
什么是对象:
一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。
-
类与对象的关系 :
- 类是对一类事物的描述,即是对象的模型,是抽象的。
- 对象是一类事物的实例,是具体的。
- 类是对象的模板,对象是类的实体。
1.3 类的定义
- 属性:事物的状态信息。
- 行为:事物能够做什么。
public class ClassName {
//成员变量
//成员方法
}
- 定义类:就是定义类的成员,包括成员变量和成员方法。
- 成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
- 成员方法:访问修饰符 返回值类型 方法名(参数列表){方法体}
public class Student {
// 成员变量
String name; // 姓名
int age; // 姓名
// 成员方法
public void eat() {
System.out.println("吃饭饭!");
}
public void sleep() {
System.out.println("睡觉觉!");
}
public void study() {
System.out.println("学习!");
}
}
成员变量(属性):
String name; // 姓名
int age; // 年龄
成员方法(行为):
public void eat() {} // 吃饭
public void sleep() {} // 睡觉
public void study() {} // 学习注意事项:
- 成员变量是直接定义在类当中的,在方法外边。
- 成员方法不要写
static
关键字。
1.4 类的对象的创建和使用
- 创建的一个Student的对象
// 导包。
import XXX.XXX.Student;
public class Student {
public static void main(String[] args) {
// 类名称 对象名 = new 类名称();
Student stu = new Student(); // 根据Student类,创建了一个名为stu的对象
// 使用其中的成员变量,格式:
// 对象名.成员变量名
System.out.println(stu.name); // null
System.out.println(stu.age); // 0
System.out.println("=============");
// 改变对象当中的成员变量数值内容
// 将右侧的字符串,赋值交给stu对象当中的name成员变量
stu.name = "小明";
stu.age = 18;
System.out.println(stu.name); // 小明
System.out.println(stu.age); // 18
System.out.println("=============");
// 使用对象的成员方法,格式:
// 对象名.成员方法名()
stu.eat();
stu.sleep();
stu.study();
}
}
- 导包:也就是指出需要使用的类,在什么位置。
import 包名称.类名称;
对于和当前类属于同一个包的情况,可以省略导包语句不写。- 创建格式:
类名称 对象名 = new 类名称();
Student stu = new Student();- 使用,分为两种情况:
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
1.5成员变量和局部变量的区别
- 在类中的位置不一样
- 成员变量:类中,方法外
- 局部变量:方法中或者方法声明上(形式参数)
- 作用的范围不一样
- 成员变量:类中
- 局部变量:方法中
- **初始化值的不同 **
- 成员变量:有默认值
- 局部变量:没有默认值。必须先定义,赋值,最后使用
- **在内存中的位置不同 **
- 成员变量:堆内存,成员变量属于对象,对象进堆内存
- 局部变量:栈内存,局部变量属于方法,方法进栈内存
- **生命周期不同 **
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
1.6 内部类
内部类就是一个类里面还包含另一个类
分类:
- 成员内部类
- 局部内部类(包含匿名内部类)
1.6.1 内部类的格式
-
成员内部类
格式:
修饰符 class 外部类名称 { 修饰符 class 内部类名称 { // ... } // ... }
注意:内用外,随意访问;外用内,需要内部类对象。
-
局部内部类
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
格式:
修饰符 class 外部类名称 { 修饰符 返回值类型 外部类方法名称(参数列表) { class 局部内部类名称 { // ... } } }
-
类的权限修饰符(能否使用)
修饰符 外部类 成员内部类 局部内部类 public Y Y N protected Y Y N default N Y N private N Y N
1.6.2 内部类使用
成员内部类的使用
-
两种方法
-
间接方式:
在外部类的方法当中,使用内部类;然后main只是调用外部类的方法。
-
直接方法:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称(); //或 如果内部类使用Static修饰则可使用这种方式去创建内部类的对象 外部类名称.内部类名称 对象名 = new 外部类名称.内部类名称();
例如:
public class Car { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public void methodCar() { System.out.println("外部Car的方法"); // 调用内部类的方法 Engine engine = new Engine(); engine.methodEngine(); } // 定义一个内部类(成员内部类) public static class Engine { // 内部类的方法 public void methodEngine() { System.out.println("发动机点火"); } } }
-
局部内部类的使用
局部内部类,只有当前所属的方法才能使用它。
注意:
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效
final
的】。备注:从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
原因:
- new出来的对象在堆内存当中。
- 局部变量是跟着方法走的,在栈内存当中。
- 方法运行结束之后,立刻出栈,局部变量就会立刻消失。
- 但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。
1.6.3 * 匿名内部类
匿名内部类是为了省略接口的实现类,直接使用new
来重写接口的抽象方法。
格式:
接口名称 对象名 = new 接口名称() {
// 覆盖重写所有抽象方法
};
public class Demo03AnonymityClass {
public static void main(String[] args) {
MyInterface myInterface = new MyInterface() {
@Override
public void method() {
System.out.println("匿名类重写抽象方法");
}
};
myInterface.method();
}
}
注意事项:
- 匿名内部类,在【创建对象】的时候,只能使用唯一一次。
- 匿名对象,在【调用方法】的时候,只能调用唯一一次。
- 匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】
2. 面向对象特征——封装
2.1封装的概念
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
2.2 封装的关键字——private
private
的含义:
- private是一个权限修饰符,代表最小权限。
- 可以修饰成员变量和成员方法。
- 被private修饰后的成员变量和成员方法,只在本类中才能访问,不可被继承。
-
private
的使用格式private 数据类型 变量名 ;
-
**使用
private
修饰成员变量,代码如下 **public class Student { private String name; private int age; }
注: 使用了
private
本类可以直接访问,但是在类外无法直接进行访问 -
使用
setter
、getter
方法间接访问private
的成员变量public class Student { private String name; private int age; public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } }
注:必须叫setxxx或者是getxxx命名规则。
对于Getter来说,不能有参数,返回值类型和成员变量对应;
对于Setter来说,不能有返回值,参数类型和成员变量对应。 -
对于
boolean
类型的private
成员变量的Getter
方法