Java入门第二章——面向对象:对象

本文介绍了Java中的类定义、对象创建、JVM内存结构(栈内存、堆内存和方法区),以及实例变量、静态变量的区别,还涉及了对象的使用和垃圾回收机制。通过实例演示了如何创建类和对象,并展示了如何在类间关联属性。
摘要由CSDN通过智能技术生成

1.类的定义

语法结构:

[修饰符列表] class 类名{ }

*属性通常是采用变量形式定义

*java语言中包括两种数据类型

-基本数据类型:byte,int,short,long……

-引用数据类型:定义的类,如SUN提供的String、System,自己定义的student等。

例子1:定义一个学生类

//定义一个类,类名student
//student是一个类,代表了所有的学生对象,是一个学生模板
public class Student{
    //属性:描述状态信息
    //属性通常采用变量方式定义
    //在类体中,方法体外的定义变量成为“成员变量”
    //成员没有赋值时,系统默认值:一切向0看齐。
    
    //访问属性必须先创建对象,通过对象访问属性
    //类中的属性不能直接通过“类”去访问,所以这种属性【成员变量】又叫做:实例变量。
    //对象又被称为示例,实例变量又称为对象变量。
    //不创建对象时,属性变量内存空间是不存在的,只有创建了对象,这些属性的内存空间才会被创建。
    
    //学号
    int no;
    //姓名
    String name;
    //性别
    boolean sex;
    //年龄
    int age;
    //住址
    String address;
    
    //方法:描述动作信息。
    //这里暂不定义
}

2.对象的创建

  • 通过一个类可以实例化 N个对象。以"例子1"定义的学生类做为基准。
public class OOTest01{
    public static main(String[] args){
        //通过一个类可以实例化N个对象
        //实例化对象语法:new 类名();
        //new 是 java语言当中一个运算符
        //new运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间
        //方法区内存:在类加载的时候,class字节码代码片段被加载到内存空间当中。
        //栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。
        //堆内存:new的对象在堆内存中存储
        Student s = new Student();
        //访问创建的Student对象的no。
        int stuNo = s.no;
        //修改创建的Student对象的no的值。
        s.no = 2;
        
        
        //再通过类实例化一个全新的对象
        //stu是一个引用
        //stu同时也是一个局部变量
        //Student是变量的数据类型
        Student stu = new Student();
    }
}
/*
  局部变量在栈内存中存储
  成员变量的实例变量在堆内存的java对象内部存储
  
  实例变量是一个对象一份。
*/

这里的在JVM中,堆内存保存Student对象,Student对象中保存着对象的实例变量。其中“ s ”存储的是创建的Student对象在堆内存的地址,“ s ”称为"引用"。这个引用是保存在栈内存中。

也就是说:

*new运算符在堆内存中开辟的内存空间称为对象。

*引用是一个变量,这个变量中保存了另一个java对象的内存地址。

*java中不能直接操作堆内存,java中没有指针。只能通过“引用”去访问堆中对象内部的实例变量。

*读取数据:引用.变量名;

*修改数据:引用.变量名 = 值;

例子1:

//家庭住址类
public class Address{
    //属性【成员变量之实例变量】
    String city;
    String street;
    String zipcode;
}

//用户类
public class User{
    //属性【一下都是成员变量之实例变量】
    
    //用户编号
    //int是一种基本数据类型
    //no是一个实例变量
    int no;
    
    //用户名
    //String是一种引用数据类型:字符串
    //name是一个实例变量
    //name是一个引用【记录地址的引用数据类型的变量名称】
    String name;
    
    //家庭住址
    //Address是我们定义的引用数据类型
    //addr是一个实例变量
    //addr是一个引用
    Address addr;
}

//测试类
public class OOTest{
    public static void main(String[] args){
        //创建User对象
        User u = new User();
        
       //输出User对象内部实例变量的值
        System.out.println(u.no); //0
        System.out.println(u.name); //null
        System.out.println(u.addr); //null
        
        //修改User对象内部实例变量的值
        u.no = 10;
        u.name = "jack";
        u.addr = new Address();
        
        //在main方法中目前只能看到一个引用"u"
        //一切都是只能通过u来进行访问
        System.out.println(u.name + "居住在哪个城市" + u.addr.city);
        System.out.println(u.name + "居住在哪个城市" + u.addr.street);
        System.out.println(u.name + "居住在哪个城市" + u.addr.zipcode);
    }
}

例子2:

//丈夫类
public class Husband{
    //丈夫的名字
    String name;
    //丈夫的妻子
    Wife w;
}
//妻子类
public class Wife{
    //妻子的名字
    String name;
    //妻子的丈夫
    Husband h;
}
//主类
public class Test{
    public static void main(String[] args){
        //创建一个丈夫对象
        Husband coffee = new Husband();
        coffee.name = "美式";
        
        //创建一个妻子对象
        Wife ice = new Wifu();
        ice.name = "冰";
        //在这里如果没有设定结婚
        //System.out.println(coffee.name + "妻子是" + coffee.w.name);  编译错误
       
        
        //结婚
        coffee.w = ice;
        ice.h = coffee;
        System.out.println(coffee.name + "要加" + coffee.w.name);//美式要加冰
    }
}

3.关于JVM内存管理

1.JVM(Java虚拟机)主要包括三块内存空间,分别是栈内存、堆内存、方法区内存。

2.堆内存和方法区内存各有一个,一个线程一个栈内存。

3.方法调用时,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束后,该方法所属的内存空间释放,称为弹栈。

4.栈中主要存储的是方法体当中的局部变量。

5.方法的代码片段及整个类的代码片段都存储到方法区内存当中,在类加载的时候这些代码片段会载入。

6.在程序执行过程中,使用new运算符创建的java对象,存储在堆内存当中。对象内部有实例变量,所以实例变量存储在堆内存当中。

7.变量分类:

-局部变量【方法体中声明】

-成员变量【方法体外声明】:实例变量【前边修饰符没有static】、静态变量【前边修饰符中有static】。

8.静态变量存储在方法区内存当中

9.三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存。垃圾回收器主要针对堆内存。

10.垃圾回收器【自动垃圾回收机制、GC机制】:

​ *当堆内存当中java对象称为垃圾数据时候,会被垃圾回收器回收。

​ *当没有更多的引用指向堆内存中的java对象时,这个对象称为垃圾数据,即这个对象无法被访问,因为访问对象只能通过引用方式访问。

4.对象的使用

public class Customer {
    int id;
}
//测试程序
public class Test{
    public static void main(String[] args){
        Customer c = new Customer();
        System.out.println(c.id);//0
        
        c=null;
        //一下程序编译可以通过,因为符合语法
        //运行出现空指针异常:java.lang.NullPointerException
        //空(null)引用。在进行引用访问“实例”相关的数据一定会出现空指针异常
        System.out.println(c.id);
    }
}
//“实例”相关的数据:这个数据访问的时候必须有对象的参与,这种数据就是实例相关的数据。

5.练习

1.电脑和学生类

需求:
    (1)计算机类属性:品牌、型号、颜色
    (2)学生类属性:学号、姓名、笔记本电脑
  编写以上两个类,分别将类创建为对象。对象数量不限,然后其中一个学生使用其中一台笔记本电脑。
    

class Computer{
    String brand;//品牌
    String medol; //型号
    String color; //颜色
}
class Student{
    int no;//学号
    String name;//姓名
    Computer pc;//学生的电脑
}

public class Study1 {
    public static void main(String[] args){
        Computer a = new Computer();
        a.brand = "华硕";
        a.medol = "坠机堡垒7";
        a.color = "黑色";

        Computer b = new Computer();
        b.brand = "联想";
        b.medol = "Y7000-2019";
        b.color = "黑色";

        Student stu = new Student();
        stu.no = 12138;
        stu.name="咖啡";
        stu.pc = b;

        System.out.println(stu.name + "使用的电脑是" +stu.pc.brand + stu.pc.medol+stu.pc.color);

    }
}

——本章节为个人学习笔记。学习视频为动力节点Java零基础教程视频:动力节点—JAVA零基础教程视频

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值