写在前面:
此文是笔者在学习Java系列课程的过程中,参考相关课件、视频讲解、课程代码,并结合一些文档、思维导图及个人理解,对所学内容做的阶段性梳理与总结。
概述
面向对象
的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性
和行为
。调用对象的行为
来实现功能,而不是自己一步一步的去操作实现。理解
区别
面向过程(强调步骤)
面向对象(强调对象)
程序中的面向对象
public static void main(String[] args) {
int[] array = { 10, 20, 30, 40, 50, 60 };
// 要求打印格式为:[10, 20, 30, 40, 50,60]
// 使用【面向过程】,每一个步骤细节都要亲力亲为。
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1) { // 如果是最后一个元素
System.out.println(array[i] + "]");
} else { // 如果不是最后一个元素
System.out.print(array[i] + ", ");
}
}
}
public static void main(String[] args) {
int[] array = { 10, 20, 30, 40, 50, 60 };
// 使用【面向对象】
// 找一个JDK给我们提供好的Arrays类,(import java.util.Arrays;)
// 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));
}
小贴士:面向对象的语言中,包含了三大基本特征,即封装、继承和多态
环顾周围,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢?
事物与类的对比
类的定义格式
public class ClassName {
//成员变量
//成员方法
}
举例:
/*
注意事项:
1. 成员变量是直接定义在类当中的,在方法外边。
2. 成员方法不要写static关键字。
*/
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("学习!");}
}
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
import 包名称.类名称;
import cn.itcast.day06.demo01.Student;
//对于和当前类属于同一个包的情况,可以省略导包语句不写
类名称 对象名 = new 类名称();
Student stu = new Student();
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
//也就是,想用谁,就用对象名点谁
举例:
public class Demo02Student {
public static void main(String[] args) {
// 1. 导包
// 我需要使用的Student类,和我自己Demo02Student位于同一个包下,所以省略导包语句不写
// 2. 创建:类名称 对象名 = new 类名称();
Student stu = new Student(); // 根据Student类,创建了一个名为stu的对象
// 3. 使用其中的成员变量:对象名.成员变量名
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("=============");
// 4. 使用对象的成员方法:对象名.成员方法名()
stu.eat();
stu.sleep();
stu.study();
}
}
小贴士: 如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样
成员变量的默认值
数据类型 | 默认值 | |
---|---|---|
基本类型 | 整数(byte、short、int、long) | 0 |
浮点数(float、double) | 0.0 | |
字符(char) | ‘\u0000’ | |
布尔(boolean) | false | |
引用类型 | 数组、类、接口 | null |
1-① 一个对象,调用一个方法内存图
1-② 两个对象,调用同一方法内存图
1-③ 两个引用,指向同一个对象内存图
2-① 使用对象类型,作为方法的参数
2-② 使用对象类型,作为方法的返回值
面向对象三大特征:封装、继承、多态
概述
隐藏在对象内部
的,外界无法直接操作和修改保护屏障
,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式原则
小贴士:封装就是将一些细节信息隐藏起来,对于外界不可见。
优点
封装性在Java当中的体现
封装的步骤
小贴士:对于Getter来说,不能有参数,返回值类型和成员变量对应; 对于Setter来说,不能有返回值,参数类型和成员变量对应。
private的使用
private 数据类型 变量名 ;
private
进行修饰,那么本类当中仍可随意访问。但是!超出了本类范围之外就不能再直接访问了间接
访问private成员变量 —— 定义一对Getter/Setter方法
(以setXxx或getXxx命名)public class Person {
String name; // 姓名
private int age; // 年龄(将age属性设置为私有的)
public void show() {
// 本类中可随意访问被 private 修饰的成员变量age
System.out.println("我叫:" + name + ",年龄:" + age);
}
// 这个setXxx成员方法,专门用于向age设置数据
public void setAge(int num) {
if (num < 100 && num >= 9) { // 如果是合理情况
age = num;
} else {
System.out.println("数据不合理!");
}
}
// 这个getXxx成员方法,专门用于获取age的数据
public int getAge() {
return age;
}
}
public class Demo03Person {
public static void main(String[] args) {
Person person = new Person();
person.show();// 我叫:null,年龄:0
person.name = "赵丽颖";
// person.age = -20; // 直接访问private内容,错误写法!
person.setAge(20);// 使用setAge方法设置年龄
person.show();// 我叫:赵丽颖,年龄:20
}
}
private的含义
注意事项
private boolean male; // 是不是爷们儿
public void setMale(boolean b) {
male = b;
}
public boolean isMale() { // isXxx的形式
return male;
}
this的使用
this.成员变量名
图例-理解this的含义:
封装优化 - this
public class Person{
private String name;
private int age;
public void setName(String name){
// 赋值失败!由于形参变量名与成员变量名重名,导致成员变量名被隐藏
// name = name;
//使用this修饰方法中的变量,解决成员变量被隐藏的问题
this.name = name;
}
public String getName(){
return name;
// 也可写成return this.name (this可省略)
// 理由:方法中只有一个变量名时,默认也是使用 this 修饰
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
小贴士:采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突
概念
格式
public 类名称(参数类型 参数名称) {
方法体
}
示例:
public class Student {
// 成员变量
private String name;
private int age;
// 无参数的构造方法
public Student() {
System.out.println("无参构造方法执行啦!");
}
// 全参数的构造方法
public Student(String name, int age) {
System.out.println("全参构造方法执行啦!");
this.name = name;
this.age = age;
}
}
注意事项
构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
构造方法不要写返回值类型,连void都不写
构造方法不能return一个具体的返回值
如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做 public Student() {}
一旦编写了至少一个构造方法,那么编译器将不再赠送
构造方法也是可以进行重载的(重载:方法名称相同,参数列表不同)
一个标准的类(也叫JavaBean)通常要拥有下面四个组成部分:
下面来编写一个完整的程序:
Alt + Insert
:Alt + Insert
→ 选择Constructor
→ 点击Select None
→ 自动生成无参构造方法Alt + Insert
→ 选择Constructor
→ 选择成员变量→ OK
→ 自动生产有参构造方法Alt + Insert
→ 选择Getter and Setter
→ 选择所有成员变量 → OK
→ 自动生成Getter/Setter 方法public class Student {
// 成员变量
private String name; // 姓名
private int age; // 年龄
//无参构造方法【必须】
public Student() {}
//有参构造方法【建议】
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成员方法:getXxx()、setXxx()
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo04Student {
public static void main(String[] args) {
Student stu1 = new Student();
stu1.setName("小黑");
stu1.setAge(20);
System.out.println("姓名:" + stu1.getName() + ",年龄:" + stu1.getAge());
System.out.println("=================");
Student stu2 = new Student("小白", 21);
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
stu2.setAge(22);
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
}
}
姓名:小黑,年龄:20
=================
姓名:小白,年龄:21
姓名:小白,年龄:22