引入类与对象(OOP),根本原因是现有的技术不能完美的解决新的需求
对象由属性和行为组成
猫类(自定义数据类型,抽象)有属性和行为 -------->猫对象(具体的猫 对象实列)
class Cat -------->Cat cat1 = new Cat()//把创建的猫赋给cat1,cat1就是一个对象
创建对象的两种方式:1先声明再创建Cat cat1//空间还没分配cat1为空;cat1 = new Cat()
2直接创建 Cat cat1 = new Cat()
当创建猫对象时,会把类的信息加载到方法区 包含属性信息和行为(方法)
class Cat类中定义了属性/成员变量/field(字段) eg: string name;属性可以是基本数据类型,也可以时引用类型。
属性可以加上访问修饰符(控制属性的访问范围) protected/public/private/默认
属性如果不赋值,有默认值,规则和数组一样
cat1.name = "小白" //赋值
-------->(创建/实例化一个对象)
java最大的特点就是面向对象
对象在内存中存在形式: 对象也是引用类型,和数组一样 有几个属性,就在堆里建立几个空间,怎么存放数据根据存放的数据类型决定,如果为字符串(引用类型),那堆里存放的是个地址,按照JVM规则,会把字符串放在方法区的常量池空间中,也对应一个地址(只要是数据,都对应一个地址), 如果为基本数据类型,那就直接存放在堆中。 真正的对象在堆和方法区中,栈中只是对象引用/对象名,它指向堆和方法区中真正的对象
类与对象内存分配机制:cat1赋值给了cat2,那cat2指向和cat1一样在堆中的地址
栈:一般存放基本数据类型(局部变量)
堆:存放对象(Cat cat,数组)
方法区:常量池(常量,字符串),类加载信息
Person p=new Person();
p.name = "jack";
1先加载Person类信息(属性和方法信息,只会加载一次)
2在堆中分配空间,进行默认初始化(看规则)
3把地址赋给p,p就指向对象
4进行指定初始化,比如p.name=''jack'
成员方法(行为)
方法定义使用细节:
public/private/protected/默认(访问修饰符) 返回函数类型 方法名(形参列表){(方法体)
语句;
return 返回值;}
方法写在类里,在main里先创建对象,再用对象.方法进行调用
返回函数类型 void 表示没有返回值 return语句不是必须的 或者只写return;
一个方法最多有一个返回值,如果想返回多个结果,可以返回数组
形参列表中允许多个参数,可以为任意类型,基本和引用
方法调用时的传入参数称为实参,方法定义时的成为形参
形参和实参的数据类型要一致或者兼容,个数,顺序都要相同
方法体里不能再定义方法
方法调用使用细节:
同一个类中的方法可以直接调用
跨类的方法需要通过对象名调用 列如A的m1方法要调用B的hi方法 和访问修饰符还有关系
A:public void m1(){
B b = new B();
b.hi()
}
方法的调用机制:
1当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2当方法执行完毕,或者执行到return语句时,就会返回
3返回到调用方法的地方
4返回后,继续执行方法后面的代码
5当main方法(栈)执行完毕,整个程序退出