第八章:面向对象编程(1)—— 类与对象

目录

一、类与对象的关系

二、类与对象的创建

(一)类的创建

(二)对象的创建

三、类与对象的内存机制


一、类与对象的关系

说明:模板(类)可以设定参数(成员:属性和方法)==> 生成实体(对象)==> 传递参数 ==> 访问实体,调用参数。

举例:手机图纸(类)可以设定尺寸和功能 ==> 生成华为手机(对象)==> 尺寸为12寸,智能识别功能 ==> 查看华为手机的说明,就能知道尺寸为12 和 智能识别功能。

结论:类就是模板,对象就是通过模板而生成的


类就是数据类型,对象就是变量名

  • 类相当于变量的数据类型,作为标识符的数据类型
  • 对象相当于变量名,作为数据类型的标识符
对象与变量的区别
对象的 = 号 右侧的赋值变量的 = 号 右侧的赋值
创建对象[new](类似赋值常量值)常量
对象名(类似赋值)变量(同类型 or 可转型)

二、类与对象的创建

(一)类的创建

创建方式:[访问修饰符]  class 类名 {  }

代码说明:类的创建细节

  • 一般来说,主执行的类通常放置在最上方(方便调用查看)
  • 类的访问修饰符只能用 public 和 默认(无访问修饰符),但是 public 只能有一个
class Cat{ }    //类可以创建在任何类的上方 or 下方,不影响参数传递
 
public class Demo { }   //源文件只能存在(一个)public 和 (多个)默认
 
public class Fish{  }   //这样会报错(只能有一个public)
 
class Dog{ }

(二)对象的创建

创建对象的常用说法:创建对象;创建实例化;实例化对象

直接创建:类名  对象 = new 类名();   


先声明,后使用:类名 对象 ;对象 = new 类名() 


匿名对象:new 类名();

  • 在不同类中,可创建本类的对象,也可以创建其他类的对象
  • 对象的命名跟变量名一致,必须遵守标识符规则

代码说明:对象在类中作为成员创建,实际上是属性

class Test {
    // ★ 细节:在类中可以直接创建对象,看似对象实际上是属性
    // ★ 注意:只有直接创建的方式可以在类中创建
    static Test a = new Test();      //可以创建自身的类对象
    Demo b = new Demo();            //可以创建非自身的类对象
}

public class Demo {
    /*  ★ 在main(有static)方法中调用在类中直接创建的对象(属性)的要求 ==> 由a说明
     *       1、对象(属性)必须带有 static 的关键字
     *       2、在方法内直接用静态调用方式
     * */
    public static void main(String[] args) {
        System.out.println(Test.a); //静态调用方式:类名.对象名【实际上是调用属性】

    }

    /*  ★ 在(非static)方法中调用在类中直接创建的对象(属性)的要求 ==> 由b说明
     *      1、对象(属性)不能带有 static 的关键字
     *      2、在方法内必须创建对象后,才能代用
     * */
    public void mthod() {
        Test test = new Test();
        System.out.println(test.b);
    }
}

代码说明:对象通常创建在main方法中 or 非属性成员的成员中,此处以main方法举例


代码说明:普通对象和匿名对象的使用区别

class Test{
    int num = 0;
    public void funt(){
        System.out.println(++num);  //每次执行方法,输出自增num
    }
}
 
public class Demo {
    public static void main(String[] args) {
 
        // ★ 结论:匿名对象,每次执行都算是第一次执行,不保存数据
 
        //普通对象:执行会存储值
        Test test = new Test();
        test.funt();    //1
        test.funt();    //2
 
        //匿名对象:执行时不会存储值
        new Test().funt();  //1
        new Test().funt();  //1
    }
}

三、类与对象的内存机制

JVM的内存由栈空间、堆空间、方法区(元空间)组成

  • 栈空间:放置引用、方法栈等,利用引用指向堆中地址
  • 堆空间:放置数据的地址
  • 方法区:放置真实数据(实际值)

在JDK1.8后,方法区从堆空间中剥离出来,并将原来的方法区变成元空间堆空间存放地址,元空间内有存放实际值,指向堆空间的地址(方法区变成元空间,用于存放实际值和加载类信息

创建类与对象后,运行时在JVM的内存机制流程图

流程分析

  1. 加载Cat类信息(Cat.class),只加载一次,默认初始化属性(Cat 初始化)【堆空间、元空间】
  2. 在堆中分配空间空间地址【堆空间】
  3. 创建对象(cat)【栈空间】, 完成对象初始化【堆空间、元空间】
  4. 将对象在堆空间中的地址,返回给对象(cat)【栈空间、堆空间】

代码实现

public class Demo {
    public static void main(String[] args) {  //<== 调试点
        //创建对象
        Cat cat = new Cat();
        System.out.println(cat);    //空间地址:Cat@16b98e56
 
        System.out.println(cat.name);   //输出默认值:小白(在Cat@493:Cat.name = "小白”)
        System.out.println(cat.color);  /* 注意:必须通过调用才能得知*/
 
        //对象Cat的属性值
        cat.name = "小花";
        cat.age  = 12;
        cat.color = "花色";
        System.out.println(cat.name + " " + cat.age + " " + cat.color);
    }
}
 
class Cat{  //当创建对象运行时,类只会加载一次
    String name = "小白"; //初始化
    int age;             //未初始化,则值为默认值
    String color;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值