- 面向对象和面向过程的思想对比
-
面向过程编程(Procedure Oriented Programming)
- 是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
-
面向对象编程(Object Oriented Programming)
- 是一种以对象为中心的编程思想,通过指挥对象实现具体的功能
-
对象:指客观存在的事物(万物皆对象)
小结:
- 客观存在的任何一种事物,都可以看做程序中的对象
- 使用面向对象思想可以将复杂的问题简单化
- 将我们从执行者的位置,变成了指挥者
2、什么是类
- 类是对现实生活中一类具有共同属性和行为的事物的抽象
类是对事物,也就是对象的一种描述,可以将类理解为一张设计图,根据设计图,可以创建出具体存在的事物。即根据类去创建对象
-
类的组成
- 属性:该事物的各种特征
- 行为:该事物存在的功能(能够做的事情)
-
小结:类和对象的关系
- 类是现实生活中一类具有共同属性和行为的事物的抽象
- 对象是能够看得到模的着的真实存在的实体
- 类是对象的描述,对象是类的实体
3、类的定义
-
属性:在代码中通过成员变量来体现(类中方法外的变量)
-
行为:在代码中通过成员方法来体现(和前一章的方法相比去掉static关键字即可,原因参看下一篇博客中的static)
-
类的定义步骤:
- 定义类
- 编写类的成员变量
- 编写类的成员方法
/*
public class 类名{
// 成员变量
变量1的数据类型 变量1;
变量2的数据类型 变量2;
...
// 成员方法
方法一;
方法二;
...
}
*/
4、对象的使用
- 创建对象
- 格式:
类名 对象名 = new 类名();
- 格式:
- 使用对象
- 使用成员变量格式:
对象名.变量名
- 使用成员方法格式:
对象名.方法名()
- 使用成员变量格式:
例:
// 定义了一个学生类
public class Student {
String name;
int age;
public void study(){
System.out.println("学习");
}
}
public class StudentTest {
public static void main(String[] args) {
Student stu = new Student();
// 默认初始值
System.out.println(stu.age); // 0
System.out.println(stu.name); // null
// 调用方法
stu.study();
// 对属性赋值
stu.name = "张三";
stu.age = 20;
System.out.println(stu.age); // 20
System.out.println(stu.name); // 张三
System.out.println(stu);
// com.xu.oop.Student@1540e19d
// com.xu.oop.Student:全类目(包名 + 类名)
// @1540e19d : @分隔符 + 16进制内存地址
}
}
二、对象内存图
1、栈和堆的介绍
- 这里我们主要观察栈(虚拟机栈)和堆
栈:所有局部变量都会在栈内存中创建
- 局部变量:定义在方法中的变量或方法声明上的变量
- 方法执行都会加载到栈中进行
- 局部变量的特点:随着方法的调用而存在,随着方法的调用完毕而消失
堆:所有对象及其对应的示例变量和数组都将存储在此处
- 简单理解为:new出来的东西,都存储在堆内存
- 每一个new出来的东西都有一个地址值,使用完毕后,会在垃圾回收器空闲时被回收
- 实例变量(成员变量)有初始化值:
- 基本数据类型:整数
0
,浮点数0.0
,布尔false
,字符空字符
- 引用数据类型
null
- 基本数据类型:整数
2、单个对象的内存图
3、两个对象的内存图
注:多个对象使用的是同一份字节码文件和成员方法
4、两个引用指向同一对象内存图
注:当stu1赋值为null时,stu1指向的堆内存连接断开,再调用会出现空指针异常
当stu2也赋值为空时,堆内存中的那块空间没有引用,会被系统的垃圾回收机制自动清除
- 垃圾回收(以后JVM部分会再细讲)
三、成员变量和局部变量 1、什么是成员变量和局部变量当堆内存中,对象或数组产生的地址,通过任何方式都不能被找到后,就会判定为内存中的垃圾
垃圾会被java垃圾回收器,空闲的时候自动进行清理
- 成员变量:类中方法外的变量
- 局部变量:方法中的变量
public class Student {
String name; // 成员变量
public void study() {
int i = 0; // 局部变量
System.out.println("study....");
}
public void doHomework(){
System.out.println("do homework...");
int j = 0; // 局部变量
}
int age; // 成员变量(不建议这么写)
}
2、两者的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中方法外 | 方法内或方法声明上(形参) |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法调用完毕而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义,赋值后才能使用 |
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问
针对private
修饰的成员变量,如果需要被其他类使用,提供相应的 *** 作
- 提供
get变量名()
方法,用于获取成员变量的值,用public
修饰 - 提供
set变量名(参数)
方法,用于设置成员变量的值,用public
修饰
2、private关键字的使用
一个标准类的编写:
- 把成员变量用private修饰
- 提供对应的setXxx()/getXxx()方法
// 定义一个学生类
public class Student {
// 将成员变量定义为私有
private String name;
private int age;
// 提供外部接口
public void setName(String n){
name = n;
}
public void setAge(int a){
age = a;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
public class StudentTest {
public static void main(String[] args) {
Student stu = new Student();
stu.setAge(23);
stu.setName("张三");
System.out.println(stu.getAge());
System.out.println(stu.getName());
}
}
3、this关键字
-
局部变量和成员变量如果重名,Java使用的是就近原则
-
this关键字的作用:可以调用本来的成员(变量,方法)
- 解决局部变量和成员变量的重名问题
- this限定的变量用于指代成员变量
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
-
this:代表所在类的对象的引用
- 方法被那个对象调用,this就代表哪个对象
public class Student {
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
// 打印this的内存地址
public void printThis(){
System.out.println(this);
}
}
public class StudentTest2 {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
// 打印s1对象的内存地址
System.out.println(s1);
// 打印s1对象的this的内存地址
s1.printThis();
// 打印s2对象的内存地址
System.out.println(s2);
// 打印s2对象的this的内存地址
s2.printThis();
}
}
注:那个对象调用了this,this就保存了哪个对象的内存地址
4、封装
- 面向对象三大特征之一(封装,继承,多态)
- 隐藏内部的实现细节,仅对外暴露公共的访问方式
- 封装常见的体现:
- 私有成员变量,提供setXxx和getXxx方法
- 将代码抽取到方法中,这是对代码的一种封装
- 将属性抽取到类当中,这是对数据的一种封装
- 封装的好处:
- 通过方法来控制成员变量的 *** 作,提高了代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
-
构造、创造对象的时候,所调用的方法
-
格式:
权限修饰符 类名(参数){}
-
方法名与类名相同,大小写也要一致
-
没有返回值类型,连void都没有
-
没有具体的返回值(不能由return带回结果数据)
-
-
执行时机:
- 创建对象的时候调用,每创建(new)一次对象,就会执行一次构造方法
- 不能手动调用构造方法
public class Student {
String name;
int age;
// 构造方法
public Student() {
System.out.println("无参构造方法....");
}
}
public class StudentTest {
public static void main(String[] args) {
Student stu1 = new Student(); // 打印:无参构造方法....
}
}
-
构造方法作用
- 用于给对象的数据(属性)进行初始化
-
注意事项
- 如果没有定义构造方法,系统将给出一个默认的无参数的构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 如果自定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法
- 建议无论是否使用,都手动书写无参构造方法和带参构造方法
- 就是一个Java中的类,其对象可以用于在程序中封装数据
- 举例:学生类,手机类
标准JavaBean必须满足如下要求:
- 成员变量使用private修饰
- 提供每一种成员变量对应的setXxx()和getXxx()
- 提供一个无参构造方法
后续经常会用到JavaBean这个概念,务必牢记
快捷键:Alt + [fn] + Insert
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)