Day12知识总结

类、对象、引用

类(class) 包含 特征[属性/成员变量]、行为[方法/成员方法] ,代表一种自定义数据结构
class Person{}; [Person 是一个类]

类是具有相同属性与行为集合
定义了该类型对象的数据结构,即成员变量与定义能被调用的功能,即成员方法
类是构建对象的模块,对象的数据结构由类来决定

成员变量、方法的定义

成员变量::成员变量的类型 变量名称;
成员方法:public 返回值类型 方法名 (形参列表){}
成员变量定义在类{}括号中;定义在类方法体中的变量称为 局部变量

对象

类型的具体对象
使用new 运算符才能创建对象[类的实例化],new一次创建一个空间出来
new 类名();
new Person();[Person是个类]
实例化一个类型的对象后,jvm为该对象开辟内存空间,并按类型,存储成员变量

成员变量的初始化

String-默认null
char-默认空
整数[byte、short、int、long]-默认0
浮点数[double、float]-默认0.0
boolean-默认false
引用类型–默认null

成员变量的调用

对象创建之后,把对象的引用地址赋值给相同类型的引用变量,然后可以通过该引用,使用成员变量

成员方法的调用

方法的调用必须通过某个对象的引用变量

引用类型变量

除8种基本数据类型之外,用类名(接口,数组)声明的变量称为引用类型变量,简称引用
引用类型变量声明语法规则: 类名 引用类型变量名
引用类型和指向的对象类型必须一致
Person[类名] person[变量]

引用类型变量中存储的是某个对象在内存中的地址信息
引用的功能在于访问对象

引用变量存储的值

引用变量存储的值为地址
不同对象的引用地址不同,每一个对象都有自己的位置

//已写好了一个Demo2Dog类
Demo2Dog d1=new Demo2Dog();
Demo2Dog d2=new Demo2Dog();
Demo2Dog d3=new Demo2Dog();
System.out.println(d1==d2);//false
System.out.println(d1==d3);//false
System.out.println(d2==d3);//false

同一对象地址相同[引用地址相同,则说明是同一个对象]
指向同一个地址,用哪个引用变量修改成员属性,全部都会使值发生改变

Demo2Dog d4=d1;//把dog1的地址,赋值给dog4
System.out.println(d1==d4); //true
//d1与d4引用地址相同,则指向同一对象[指向同一个空间]

类、对象、引用三者的使用

Person person=new Person();

Person是一个类;
new Person 创建一个类的对象[实例化]
Person person 定义了一个Person类型的引用变量
Person person=new Person();将创建的一个类的对象的地址赋值给相同类型的引用变量person,便于访问对象的成员变量与成员方法

JVM内存结构

方法区

该区间用于存放类的信息
最先有数据的区域

java程序运行时候,首先会通过类加载器载入类文件的字节码文件,经过解析后将其装入方法区类的各种信息都在方法区保存

存放字节码文件、类信息
存储代码片段

栈内存区

栈用于存放程序运行过程中的局部变量
引用类型的变量p ,存储在栈内存中

存放程序运行过程中的变量
在方法调用时,栈内存分配该方法所需要的空间与存储该方法的局部变量
方法调用,压栈、分配空间;方法结束,弹栈、释放空间
栈为空,则程序结束运行

堆内存区

jvm会在其内存空间开一个称为“堆”的存储空间
这部分空间用于存储使用new关键字创建的对象
创建了一个Person对象,存储在堆内存中

存储new关键创建的对象[jvm开辟一块空间,存放成员变量]

方法区、栈内存区、堆内存区

方法重载

方法重载:多个方法的名称相同,但每个方法形参列表参数不同[个数不同、类型不同]
编译器在编译时,会根据其参数的不同,绑定到不同的方法
重载 关注的是方法名与形参 与返回值类型无关
方法名相同、形参列表不同

//成员方法
    public void print(int a){
        System.out.println("打印整数:"+a);
    }
    public void print(int a,int b){
        System.out.println("打印两个整数:"+a+" : "+b); //形参列表参数不同 个数不同
    }
    public void print(double a){
        System.out.println("打印浮点数:"+a);  //形参列表参数不同 类型不同
    }
    public void print(double a,double b){
        System.out.println("打印两个浮点数:"+a+" : "+b);  //形参列表参数不同 个数不同、类型不同
    }
    public void print(String a){
        System.out.println("打印字符串:"+a);
    }
    public void print(char a){
        System.out.println("打印打印字符:"+a);
    }

构造方法

[ 构造方法 构造器 构造函数] — 创建对象的时候,被调用的方法

构造方法是在类中定义的方法(每个类都有构造方法
构造方法的名称必须和类名相同
构造方法没有返回值,但也不能写void

java中规定:
如果没有给类提供构造函数,那么java提供一个默认的无参构造函数
如果自身提供了任意一个构造函数, 那么java就不再提供构造函数

//在一个Demo8Student类中
//构造方法 构造器 构造函数 —————— 创建对象的时候,被调用的方法
    //无返回值 方法名同类名
    public Demo8Student(){
        System.out.println("构造器被调用");
    }
    //构造方法重载 方法名名字相同 但方法的参数列表不同
    public Demo8Student(int a){
        System.out.println("构造器被调用");
    }
    //java规定: 若没有给类提供构造函数,则java提供一个默认的无参构造函数
            //若提供了任意一个构造函数,则java就不再提供默认的构造函数论

void 类名(){}

void 类名(){} 无错,是一个普通的方法,但是一般不这么用

 //正确,普通方法
    public void Demo8Student(){
    }

构造函数重载

为了使用方便对一个类定义多个构造方法,这些构造方法彼此参数不同,称为构造方法的重载
创建对象时,java编译器会根据不同的参数,选择不同的构造函数

public Pet(){
    }
    public Pet(String breed,String name,String colour){
        this.breed=breed;
        this.name=name;
        this.colour=colour;

    }

this

this 代词 指代当前对象(谁调用方法,谁this)

public class Demo1This {
    public static void main(String[] args) {
        Phone p1=new Phone();
        p1.memery=64;
        p1.pinpai="华为p40";
        p1.print();
        p1.updateMemery(128);//this.memery 等价 p1.memery
        p1.print();
    }
}
class Phone{
    int memery; //内存
    String pinpai;  //品牌

    //成员方法
    public void updateMemery(int memery){
        //this 代词 指代当前对象(谁调用方法,谁this)
        this.memery=memery;
    }
    public void print(){
        System.out.println(memery+"==="+pinpai);
    }
}

空指针异常

编译时 只看”=“符号左边的部分

运行时 以”=“符号右边赋的值为准

import java.util.Date;
//没有创建对象,就无法调用方法
//空指针异常 java.lang.NullPointerException 运行程序的错误
public class Demo7Null {
    public static void main(String[] args) {
        //某个引用类型变量为null 不能访问对象 否则抛出空指针异常
        Date data=null;
        //在编译时,只看”=“符号左边的部分,此时data是Date类型,则具有getTime方法
        //在运行时,以”=“符号右边的部分为准,此时右边是null 即null.getTime null没有getTime方法 则抛空指针异常
        long time=data.getTime(); //无任何编译错误,但在运行后出现空指针异常
        //null 是关键字、也是直接量 在java中 null表空 空就代表不指向任何对象
        //编译错误
        //long time1=null.getTime(); //编译错误 编译的时候发现了null没有getTime方法 存在编译错误
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值