目录
类、对象、引用
类
类(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方法 存在编译错误
}
}