面向对象
本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见 https://www.bilibili.com/video/BV1fh411y7R8?p=201&spm_id_from=pageDriver&vd_source=ceab44fb5c1365a19cb488ab650bab03
java 设计者引入类与对象(OOP) ,根本原因就是现有的技术,不能完美的解决新的需求。(oop一般指面向对象程序设计)
一、从类到对象的说法
- 创建一个对象
- 实例化一个对象
- 把类实例化
二、类和对象的区别和联系
- 类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型
- 对象是具体的,实际的,代表一个具体事物, 即是实例
- 类是对象的模板,对象是类的一个个体,对应一个实例
public class Object01 {
public static void main(String[] args) {
//实例化一只猫(实例化一个对象)
//1.new Cat()创建一只猫
//2.Cat cat1 = new Cat(); 把创建的猫赋给 cat1
Cat cat1 = new Cat();
cat1.name = "小白";
cat1.age = 3;
cat1.color = "白色";
Cat cat2 = new Cat();
cat2.name = "小花";
cat2.age = 5;
cat2.color = "花色";
System.out.println("第1只猫的信息"+cat1.name+" "+cat1.age+" "+cat1.color);
System.out.println("第2只猫的信息"+cat2.name+" "+cat2.age+" "+cat2.color);
}
}
//猫类
class Cat {
String name;
int age;
String color;
}
三、对象在内存中存在形式(重要)
栈、堆、方法区(栈存放变量、常量在方法区)
栈用来存放局部变量,cat是引用类型变量(Cat类变量),堆用来存放变量,堆里面的对象数据有些是常量,方法区是用来存放静态变量 的,所以对象在堆里面存放静态区数据的地址。如果是基本数据类型就放在堆里,如果是字符串类型就放在方法区。String类型的数值不是直接存放在堆里面,而是存放在方法区的常量池。
从JDK1.7开始,字符串常量池以及方法区移到堆中了。
假设创建一个Person类,再创建一个对象 Person p1 = new Person(); 实际上 p1 在栈里,真正的对象在堆里,p1指向堆。p1也叫对象引用、对象名。
Java数据类型
思考题一
题目分析
Person p1 = new Person();
加载Person类信息:1属性信息 2方法信息
new是在堆里面开空间:在堆里面开辟了 age name空间,刚开始创建的时候是其默认值(因为 age 是 int 型,默认值为0,name 是 String 类型,默认为 null )
p1存在于栈里面,指向堆
p1.age = 10;
把age所在的空间存放的默认值,更改为10。
p1.name = “小明”;
注意这里的“小明”是字符串常量,会放在方法区的常量池,然后把在方法区的地址回填到堆中
Person p1 = p2; //把 p1 赋给 p2,
注意Person是引用类型,它使用的是引用传递,也是地址拷贝
Java内存的结构分析
- 栈:一般存放基本数据类型(局部变量)
- 堆:存放对象(cat1,数组等)
- 方法区:常量池(常量,比如字符串),类加载信息
Java创建对象的流程简单分析
Person p = new Person();
p.name = "jack";
p.age = 10;
- 先加载Person类信息(属性和方法信息),注意类信息只会加载一次,比如创建了Cat类,创建c1 c2对象的时候不会重复加载
- 在堆中分配空间,进行默认初始化(int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000, boolean false,String null)。
- 把地址赋给p (p指向对象在堆里面的地址
- 进行指定初始化,比如 p.name=“jack”,p,age=10
思考题二
b = null;
b指空
接下来的 System.out.println(b.age) 会抛出一个异常。
四、类与对象的定义与使用
1、基本语法:
(1)创建类的语法
class 类名称 {
成员变量/ 实例变量;
成员方法;
}
(2)创建具体的对象:
先声明在创建
Cat cat1;
cat1 = new Cat();
直接创建
Cat cat1 = new Cat();
(3)访问属性
对象名.属性名;
cat1.name();
2、属性/成员变量
- 从概念或叫法上看: 成员变量 = 属性 = field(字段) (即 成员变量是用来表示属性的,授课中,统一叫属性)
- 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类 的 int age就是属性。
public class Object02 {
public static void main(String[] args) {
}
}
class Car {
String name;//属性、成员变量、字段、field
double price;
String color;
String[] master;//属性可以是基本数据类型,也可以是引用类型(对象 数组)
}
3、属性/成员变量注意事项
- 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;
简单的介绍访问修饰符: 控制属性的访问范围
有四种访问修饰符 public, proctected, 默认, private - 属性的定义类型可以为任意类型,包含基本类型或引用类型
- 属性如果不赋值,有默认值,规则和数组一致。具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000, boolean false,String null【请见下述例子的默认输出】
public class PropertiesDetail {
public static void main(String[] args) {
//new了一个对象空间,p1指向空间
Person p1 = new Person();
//p1在【栈】里,真正的对象在【堆】里
//p1也叫对象引用、对象名
System.out.println("\n当前这个人的信息: ");
System.out.println("age="+p1.age);
System.out.println("name="+p1.name);
System.out.println("sal="+p1.sal);
System.out.println("isPass="+p1.isPass);
}
}
class Person {
int age;
String name;
double sal;
boolean isPass;
}