目录
1、对象是什么? 保存该对象的属性信息 ps:方法不在对象中保存
一、Java中能出现语句的位置
1、方法的内部(抽象方法除外)
静态方法:只能使用静态属性和调用静态方法,可以直接通过类名被调用
普通方法:可以使用静态属性和非静态属性,可以调用任意方法,必须实例化对象后,通过对象调用
2、类的内部(属性或赋值语句)
class Demo{
int g=getNum(); 定义属性时便执行了getNum方法(语句)
}
3、代码块
1)构造代码块
2)静态代码块
4、构造方法:
方法名必须和类名一致,没有返回值
class A{
A(){
hello();
}
}
5、内部类,匿名类,lambda表达式
二、语句什么时候被执行
1.语句写了就会被执行?
方法中的语句只有被调用才会被执行!
1)方法重载执行那个方法?
跟传参类型一致的方法
2)当有方法重写时,执行那个方法?
子类实例化时会触发父类的实例化
class A{
int a=2;//A类实例化一个对象时会被执行
}
class A{
static int a=2;//A类被加载时会执行
}
同样的,被代码块包含的部分也是A类实例化对象时会执行,静态代码块部分则是被加载时会执行
总结:语句被执行触发的常见情况:
1):某个类被加载,会触发一批语句的执行
2):某个类实例化对象,会触发一批语句的执行
3):某个类中的方法被调用,会触发一批语句的执行
三、类的加载,对象的实例化,方法的调用
1、什么时候会进行类的加载(类被用到&&类还未被加载过)
1):用到了类中的静态属性||调用了类的静态方法
2):用该类实例化一个对象
3):用到子类会触发父类(包含接口)
执行顺序:静态属性定义中的赋值语句-->静态代码块中的语句(按照书写顺序依次执行)
父类的所有加载语句执行完才会执行子类的加载语句!
2、对象的实例化
1)对象的实例化可能会触发类的加载(有可能类已经加载过了)
2)类的加载完成后紧跟着对象的实例化
3)类的加载完成可能不会对象的实例化(访问类的静态属性,调用类的静态方法)
4)和对象实例化有关的语句:(属性定义时的赋值语句,构造代码块中的语句,构造方法中的语句)
执行顺序:
1)属性定义和构造代码(按照书写顺序)
2)1完成后执行构造方法中的语句
3)子类的实例化时,必须要求父类所有实例化语句完成后才执行子类
总结:方法中的语句,一定是被调用时才能执行
1)静态方法:有类就够了,可以调用
2)普通方法:必须先通过类实例化出对象,通过对象去调用
3)特殊的main方法,被JVM调用
四、数据
1、直接接触到的数据(变量,字面量,数据元素)
2、基本类型和引用类型
引用类型:null,“xxx”
基本类型:1,1L,1.0,1.0F,‘c’,true,false
数组元素类型:byte[] short[] int[] 引用类型作为数组对象 数组本身作为数组元素类型
3、数据存放在内存的哪里?
1)JVM中,针对一个java进程,内存主要分成几个区域:栈区,堆区,方法区
对象在堆区 引用在什么区域? answer:不确定,需要其他条件
变量在什么区域? answer:根据变量的种类来明确
变量的种类: 局部变量(方法定义的变参,方法的形参,catch()定义的变量
局部变量:只存在于该方法执行时创建的栈帧中,属于栈区。
对象的属性:存在于属性附着的对象上,对象存在于堆区
类的静态属性:存在于静态属性附着的类上,类存在于方法区
数组的元素:数组的元素存在于元素附着的数组对象上,还是堆区
ps:只看数据类型(引用类型还是基本类型)无法决定变量存在于何处
方法的某次执行需要的数据,以栈帧的形式放在栈区。
对象放放在堆区
类的数据逻辑上放在方法区
语句数据(指令数据,字节码数据,方法)随着类,放置在方法区
五、引用和对象
1、对象是什么? 保存该对象的属性信息 ps:方法不在对象中保存
2、基本类型
3、引用类型
引用的类型是间接使用的 ,引用类型可以存对象的地址,但不要求必须存对象的地址
数据究竟存在何处是由其变量的种类决定的,和数据的类型无关