系列文章目录
Java基础01:JAVA概述、基础语法
Java基础02:运算符、流程控制语句、Random随机数
Java基础03:IDEA、快捷键
Java基础04:数组、二维数组
Java基础05:方法
Java基础06:Debug、进制
Java基础07:面向对象基础
Java基础08:API、字符串String、StringBuilder
Java基础09:ArrayList集合
Java基础作业
文章目录
面向对象和面向过程的思想对比
面向对象三(四)大特征:封装、继承、多态、(抽象)
⚫ 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
⚫ 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的功能
对象:指客观存在的事物,万物皆对象
⚫ 面向对象的好处:
A:将复杂的事情简单化了
B:更符合人们思想习惯的思想(懒人思想)
C:将程序员由执行者变成了指挥者
类和对象
1.什么是类
是对现实世界 同一类 具有 共同属性和 行为 的 事物的模拟。
例如:学生类
2.什么是对象
就是某一类事物的具体体现,是类的具体体现。
例如:张三、李四、王五
通过类创建对象,一个类可以创建多个对象。
3.属性和行为
- 属性:事物的基本特征。例如:学生类:都有姓名,都有年龄。
- 行为:事物可以做什么事情。例如:学生类:都会学习,都会吃饭。
类的定义
类的组成:属性和行为
⚫ 属性:在类中通过成员变量来体现(类中方法外的变量)
⚫ 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
示例代码:
public class Phone {
// 成员变量
String brand; // 品牌
double price; // 价格
String color; // 颜色
// 成员方法
public void call(String who) {
System.out.println("给" + who + "打电话");
}
public void sendMessage() {
System.out.println("群发短信");
}
}
一个类就是一个数据类型。如:
public class String{
.......
}
public class Student{
}
创建对象并使用
创建对象
⚫ 格式:类名 对象名 = new 类名();
⚫ 范例:Student s = new Student();
使用对象
1:使用成员变量
⚫ 格式:对象名.变量名
⚫ 范例:p.name
2:使用成员方法
⚫ 格式:对象名.方法名()
⚫ 范例:p.study();
示例代码:
public class Demo01PhoneOne {
public static void main(String[] args) {
// 根据Phone类,创建一个名为one的对象
// 格式:类名称 对象名 = new 类名称();
Phone one = new Phone();
System.out.println(one.brand); // null
System.out.println(one.price); // 0.0
System.out.println(one.color); // null
System.out.println("=========");
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
System.out.println(one.brand); // 苹果
System.out.println(one.price); // 8388.0
System.out.println(one.color); // 黑色
System.out.println("=========");
one.call("乔布斯"); // 给乔布斯打电话
one.sendMessage(); // 群发短信
}
}
对象内存图
1.对象的实体保存在哪里?答:堆中,因为是new出来的。
2.对象名保存的是什么?答:对象实体在堆中的地址值。
单个对象内存图
new的对象中存在堆内存中,堆内存中的数据都有默认初始值,成员方法不会放进堆内存,堆内存中存放的是成员方法的地址
study方法执行完成后,study方法从栈内存弹出,随后main方法弹出,程序结束。
两个对象内存图
问:这一次,.class字节码文件是否要再加载一次?
答:不用,一个类(设计图),可以创建很多对象。
s1.study();和 s2.study();用的是同一个方法。
s1.study()弹出栈内存后,加载了s2.study();s2.study()弹出后,main()弹出程序结束。
两个引用指向同一对象内存图
两个引用指向同一对象内存图,stu1和stu2都指向001;
stu1=null后再使用报空指针异常,但并不影响stu2的指向。
当stu1=null;stu2=null;后,001这个对象就成了垃圾对象,没人使用。
垃圾回收
注意:当堆内存中,对象或数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的“垃圾”,垃圾会被Java垃圾回收器,空闲的时候自动进行清理。
成员变量和局部变量
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中方法外 | 方法内或者方法声明上(形参) |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义,赋值,才能使用 |
封装
封装:
⚫ 面向对象三大特征之一(封装,继承,多态)
⚫ 隐藏实现细节,仅对外暴露公共的访问方式
⚫ 封装常见的体现:
1、私有成员变量,提供setXxx和getXxx方法,私有仅仅是封装的一种体现
2、将代码抽取到方法中,这是对代码的一种封装
3、将属性抽取到类当中,这是对数据的一种封装
⚫ 封装的好处:
1、提高了代码的安全性
2、提高了代码的复用性
private
private关键字:
⚫ 是一个权限修饰符
⚫ 可以修饰成员(成员变量和成员方法)
⚫ 被private修饰的成员只能在本类中才能访问
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作:
⚫ 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
⚫ 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
this
局部变量和成员变量如果重名,Java使用的是就近原则。
public class Demo1 {
int a=111;
public static void main(String[] args) {
int a=222;
System.out.println(a);//结果:222
}
}
this作用:this可以用来区分局部变量和成员变量同名的问题
this代表什么:代表当前对象的引用。方法被哪个对象调用,this就代表哪个对象。
this内存原理
构造方法
概述
⚫构造方法就是 构建、创造对象的时候,所调用的方法
⚫ 格式:
- 方法名与类名相同,大小写也要一致
- 没有返回值类型,连void都没有
- 没有具体的返回值(不能由retrun带回结果数据)
⚫ 执行时机:
- 创建对象的时候调用,每创建一次对象,就会执行一次构造方法
- 不能手动调用构造方法
⚫ 作用:用于给对象的数据(属性)进行初始化
构造方法的注意事项
⚫ 构造方法的创建
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
⚫ 构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
⚫推荐的使用方式
无论是否使用,都手动书写无参数构造方法,和带参数构造方法
构造方法进行成员变量的赋值和set方法的区别
1.如果在创建对象的时候已经知道了所有成员变量的值可以使用有参构造进行设置,因为这样子需要调用一次即可.
2.但是如果对象已经创建完了,还想要修改成员变量的值就必须用setXxx方法.
一个标准的类(JavaBean)
① 成员变量
使用private修饰
② 构造方法
1.提供一个无参构造方法
2.提供一个带多个参数的构造方法
③ 成员方法
1.提供每一个成员变量对应的setXxx()/getXxx()
2.提供一个显示对象信息的toString()
④ 创建对象并为其成员变量赋值的两种方式
1.无参构造方法创建对象后使用setXxx()赋值
2.使用带参构造方法直接创建带有属性值的对象
package com.zhy.day7;
public class Student {
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
IDEA快速创建JavaBean
鼠标右键→Generate
ctrl+A全选成员变量。