1.类与对象
- 类是抽象的,概念的,代表一类事物,比如人类,猫类。。。,即是数据类型
- 对象是具体的,实际的,代表一个具体事务,即 是实例
- 类是对象的模板,对象是类的一个个体,对应一个实例
对象的内存布局
Cat cat=new Cat();
cat.name="小白";
cat.age=2;
cat.color="白色"
属性/成员变量
- 概念:成员变量=属性=field字段(即成员变量是用来表示属性的)
eg:
Cat(name,price,color); - 属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型(对象,数字)。
- 注意事项和细节说明
- 属性的定义语法和变量相同 eg:访问修饰符 属性类型 属性名
四种访问修饰符:public protected 默认 private - 属性的定义类型可以为任意类型,包含基本类型或引用类型
- 属性如果不赋值,有默认值,规则和数组一致
int 0, short 0, byte 0, long 0, float 0, double 0.0, char \u0000, boolean false. String null
- 属性的定义语法和变量相同 eg:访问修饰符 属性类型 属性名
创建对象
- 先声明再创建
Cat cat;//内存中创建了第一步
cat = new Cat();//内存中创建了第二步
- 直接创建
Cat cat = new Cat();
类和对象的内存分配机制
java内存的结构分析
1. 栈:一般存放基本数据类型(局部变量)
2. 堆:存放对象(Cat cat,数组等)
3. 方法区:常量池(常量,比如字符串),类加载信息
4. 示意图[Cat(name,age,price)]
Java创建对象的流程简单分析:
Person p= new Person();
p.name = "jack";
p.age = 10;
1. 先加载Person类信息(属性和方法信息,只会加载一次)
2. 在堆中分配空间,进行默认初始化(看规则)
3. 把地址赋给p
4. 进行指定初始化
2.成员方法
方法的调用机制
方法调用小结:
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句就会返回
3.返回到调用方法
4.返回后继续执行
成员方法的定义
public 返回数据类型 方法名 (参数列表…)
{//方法体语句;
return 返回值;
}
- 参数列表:表示成员方法输入cal(int n)
- 数据类型(返回类型)
- 方法主体:表示为了实现某一功能代码块
- return 语句不是必须的
3.成员方法传参
- 基本数据类型:值不发生改变(在栈中有另一个地址,并不会改变原有的值)
- 引用数组类型:改变(他们的内存地址是共享的)
4.overload(方法重载)
基本介绍:
java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致
方法名:必须相同
形参列表:必须不同
返回类型:无要求
5.可变参数
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法
基本语法
访问修饰符 返回类型 方法名(数据类型。。。。形参名){
}
1.可变参数的实参可以为0个或者任意多个
2.可变参数的实参可以为数组
3.可变参数的本质就是数组
4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
5.一个形参列表只能出现一个可变参数
6.作用域
1.在java编程中,主要的变量就是属性(成员变量)和局部变量。
2.局部变量一般指在成员方法中定义的变量
3.作用域分类:
全局变量:属性,作用域为整个类体
局部变量:除了属性以外的变量,作用域在代码块中
4.全局变量可以不赋值,直接使用(会给默认值,规则同数组)。局部变量必须赋值后才可使用(无默认值)。
细节:
1.属性和局部变量可以重名,访问时遵循就近原则
2.在同一个作用域中,两个局部变量不能重名
3.属性生命周期长,伴随对象的创建而创建,伴随对象的死亡而死亡。局部变量,生命周期短,伴随代码块的执行而创建,伴随代码块的结束而死亡,仅在一次方法调用过程中。
4.作用域不同
全局变量:可以本类使用,也可以其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5.修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符
7.构造器(constructor)
完成对新对象的初始化
原来:先创建“人类”对象,再对“年龄”“姓名”属性赋值
构造器:创建人类对象,直接指定对象的年龄姓名
语法:
[修饰符] 方法名 (形参列表){
方法体;
}
1.构造器修饰符可以默认
2.构造器没有返回值
3.方法名和类名一样
4.参数列表 和 成员方法一样规则
5.创建对象时,系统会自动调用该构造器完成对象初始化
细节:
1.一个类可以定义多个不同的构造器,即构造器重载
2.构造器名和类名要相同
3.构造器没有返回值
4.构造器是完成对象初始化,并不是创建对象
5.创建对象时自动调用该类的构造方法
6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参的构造方法 (默认构造方法),比如Person(){} 。
7. 一旦定义了自己的构造器,默认的构造器就覆盖了,不能再使用默认的无参构造器。
对象创建的流程分析
1.在方法区加载Person类,只会加载一次
2.在堆分配一个空间(存放age name)
3.首先进行默认初始化,age空间赋值0,name空间赋值null
4.进行显示初始化,age空间90,name空间null
开始初始化:
5.发现有构造器,age是20,name是小倩
6.将对象在堆中的地址赋给p(p是对象名,也可以理解为是对象的引用)
8.this
java虚拟机会给每个对象分配this,代表当前对象。
哪个对象调用,this就代表哪个对象
细节:
1.this可以用来访问本类的属性,方法,构造器
2.this用于区分当前类的属性和局部变量
3.访问成员方法:this.方法名(参数列表)
4.访问构造器:this(参数列表)
5.不能在类定义的外部使用
- this关键字最常用于构造方法中,初始化实例属性(和python中的self是一样的性质)
class Dog {
int age ;
String name ;
public Dog(int age, String name){
//1、在构造方法中用于初始化参数(用于区分属性和入参)
this.age =age;
this.name =name;
}
public void demo(){
System.out.println("demo执行");
}
public void demo1(){
//在普通的实例方法中,可以添加this调用属性/方法
this.age =1000;
this.demo();
//一般情况,我们调用实例属性/实例方法时不需要添加this,编译器会自动添加
name ="小黑";
demo();
}
}
- this()方法
this()表示调用构造方法,此种调用只能用在构造方法中,即构造方法中调用构造方法this(实参)。
1、this()、this(实参)必须方法构造方法的第一行
2、在有参数构造方法中调用无参数构造方法this();在无参数的构造方法中调用有参数的构造方法this(实参)
一、如下是无参数构造方法调用有参数构造方法:
public class Constractor
{
int year;
int month;
int day;
//无参数构造方法
public Constractor()
{
this(2019,1,1);
}
//有参数构造方法
Constractor(int year, int month, int day)
{
this.year = year;
this.month = month;
this.day = day;
}
}
二、如下是有参数构造方法调用无参数构造方法:
public class Constractor
{
int year;
int month;
int day;
//无参数构造方法
public Constractor()
{
}
//有参数构造方法
Constractor(int year, int month, int day)
{
this();
this.year = year;
this.month = month;
this.day = day;
}
}
三、this()/this(实参)必须出现在构造方法的第一行,否则报错