- 类与对象:类是数据类型,类是抽象的,对象是一个具体事例,即是实例
- 创建一个对象时:先加载类的信息(属性+方法,一个类只加载一次),然后为类分配空间,默认初始化(不管给没给值都先用默认值初始化),再给属性赋值,再进构造器,返回给对象一个地址。根据后面程序初始化的属性的类型赋值或再分配空间。
- 初始化包括:默认初始化,显示初始化,构造器初始化
- 堆里面的才是对象,栈里cat是对象的引用
在上图中,因为name属性类型为String,也是一个引用类型,所以也是分配一个常量池的地址,在常量池里才有值。
java内存的结构分析
如上图所示
- 栈:一般存放基本数据类型(局部变量)
- 堆:存放对象(Cat cat,数组等)
- 方法区:常量池(常量,如字符串),类加载信息(一个类只加载一次)
方法调用机制
1)首先程序运行在main方法中,main方法在栈中有一个对应的空间
2)程序调用方法时,会在栈中开辟一个新的空间运行方法
3)方法执行完或者执行到return语句返回时,返回到调用的地方,这个空间就会被回收
- 调用带参数的方法时,实参和形参的类型要一致或兼容、个数、顺序必须一致
- 方法返回的类型可以为任意类型,参数类型也可以为任意类型,包含基本类型或引用类型(数组,对象)
- 方法调用:
- 同一个类中可以直接调用方法
- 跨类需要创建对应的对象,用对象.方法调用
- 方法传参机制:设有一个方法 fprint(int a,int[] b), 调用该方法fprint(a,b)。注意:调用方法会在栈中开辟新空间,a赋值给形参是值传递,方法中的形参改变不会引起主程序的a值的变化。但是数组b是引用类型,数组、对象等引用类型传进方法的是地址,值在堆或者常量池里面,方法中改变b的值,会影响主程序b中的值(可以自己画个内存图试一试)
方法重载
- java允许在同一个类中,多个同名方法的存在,但是形参列表不一致!
- 方法名要相同,但是返回类型可以不同
- 如果同一个类中有多个名相同,功能相同,但是参数个数不同的方法(如两个数相加,三个数相加),可以使用可变参数变成成一个方法
- 可变参数的形式:数据类型… 形参名。 如public int sum(int… nums)表示可以接收0到多个int型参数。 nums可以当成数组来使用
- 可变参数可以和普通参数一起放进形参列表,但是必须保证可变参数在最后
- 一个形参列表中只能出现一个可变参数
作用域
- 除了属性之外的变量都看做局部变量,局部变量没有默认值,必须赋值才能使用。全局变量有默认值,可以直接使用
- 全局变量/属性可以加修饰符,局部变量不可以加修饰符
构造器
- 方法名与类名一样,没有返回值,不写void
- 构造器的调用在创建对象时由系统完成,完成对新对象的初始化。
- 构造器也能重载。即可以定义多个参数列表不同的构造器
- 如果没有显示得写构造器,系统会自动给类生成一个默认的无参构造器,如Cat(){}.
- 一旦定义了构造器,这个默认的就会被覆盖,除非显示的写一遍Cat(){}.
this
- java虚拟机给每个对象分配this,代表当前对象。
- 哪个对象调用,this就代表哪个对象。
- this只能在类的方法内使用。
- this用来访问本类的属性(区分属性和局部变量),方法,构造器
- 调用方法:this.方法名(参数列表)
- 调用构造器:this(参数列表)。只能在一个构造器中调用另一个构造器,其他地方不允许使用,且必须放在构造器的第一条语句。
匿名对象
- 创建方法:new Function().test();
- 匿名对象,没有名字 只能使用一次。
包
- 包名的命名:包含字母、数字、下划线,不能包含关键字,数字不能在开头
- 命名规范:一般是com.公司名.项目名.业务模块名
- 常用包
- java.long.* //基本包,默认引用
- java.util.* //系统提供的工具包,工具类,如使用Scanner
- java.net.* //网络包
- java.awt.* //java界面开发
- 建议用到哪个类就导入哪个类,不用*。