Java内存
- 栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈中。
- 堆(Heap):凡是new出来的东西,都在堆中。堆内存里面的东西都有一个地址值(16进制)。堆内存里面的数据都有默认值。整数(0),浮点数(0.0),字符(’\u0000’),布尔(false),引用类型(null)。
- 方法区(Method Area):存储.class相关信息,包含方法的信息。
- 本地方法栈(Native Method Stack):与操作系统相关。
- 寄存器(pc Register):与cpu相关。
小提示
- 引用类型变量都可以赋null值,如果数组只是赋值了null,而没有进行new创建,那么会发生空指针异常NullPointException
- 获取数组长度:数组名称.lenth。(数组一旦创建,程序运行期间,长度不可改变)
- 索引=下标
数组
// 动态初始化(指定长度)| 可拆分
int[] arrayA = new int[300];
/* <==>
* int[] arrayA;
* arrayA = new int[300];
*/
String[] arrayB = new String[5];
// 静态初始化(指定内容)| 可拆分为两个步骤(同上面一样)
int[] arraya = new int[] { 5, 15, 25 };
// 创建一个数组,来装字符串
String[] arryb = new String[] { "hello", "world", "java" };
// 省略格式 | 不可拆分为两个步骤
int[] arrayc = { 10, 20, 30 };
- 数组可以作为方法的参数,当调用方法的时候,向方法的小括号进行传参,传递进去的是数组的地址值。
数组作为方法返回值
public static int[] calculate(int a, int b, int c) {// 数组作为方法返回值
int sum = a + b +c;
int avg = sum / 3;
int[] array = { sum, avg };
return array;
}
类和对象
- 概念:类=成员变量(属性)+成员方法(行为)
- 重点:普通方法有static关键字(不需要对象就能调用),成员方法没有static关键字。
- 成员变量直接定义在类当中,在方法外面。
对象的创建及使用
1.导包:
指出需要使用的类在什么位置。
import 包名称.类名称
例如:import cn.itcast.day06.demo01.Student;
2.创建
格式:类名称 对象名 = new 类名称();
例如:Student stu = new Student();
3.使用
对象名.成员变量名(如果没有进行赋值,那么将会有一个默认值,规则和数组一样)
对象名.成员方法名()
对象作为方法的返回值
例子:
public static Student getStudent() {
Student stu1 = new Student();
stu1.name = "小红";
stu1.age = 18;
return stu1;
}
加餐
成员变量和局部变量的区别(方法的参数也是局部变量)
1.定义的位置不一样【重点】
局部:在方法的内部。
成员:在方法的外部,直接写在类当中。
2.作用域【重点】
局部:只有方法当中才可以使用,出了方法就不能再用。
成员:整个类全都可以使用。
3.默认值【重点】
局部:没有默认值,如果要想使用,必须手动进行赋值。
成员:如果没有赋值,会有默认值,规则和数组一样。
4.内存位置不一样(了解)
局部:位于栈内存。
成员:位于堆内存。
5.生命周期不一样(了解)
局部:随着方法进栈而诞生,随着方法出栈而消失。
成员:随着对象创建而诞生,随着对象被垃圾回收而消失。
面向对象的三大特征之封装
封装在java中的体现:
1.方法就是一种封装。
例子:
public static int getMax(int[] array) {
int max = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i] > max){
max = array[i];
}
}
return max;
}
2.关键字private也是一种封装。(private关键字的作用及使用)
private int age;//使用private进行修饰,那么本类当中仍然可以随意访问,但是,超出本类范围之外就不能直接访问了。
private boolean male;
...
public void setMale(boolean s) {
male = s;
}
public boolean isMale() {//对于基本类型当中的boolean值,getter方法写成isXxx,而setXxx不变
return male;
}
敲黑板(this关键字的作用)
- 当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。
- 如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
例子:
public void sayHello(String name) {
System.out.println(name + ",你好。我是:" + this.name);
}
- 解释:通过谁调用的方法,谁就是this(及当前对象)
构造方法
定义:专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式:
public 类名称(参数类型 参数名称) {
方法体
}
注意事项:
1.构造方法的名称必须和所在的类名称完全一致,大小写也一样。
2.构造方法不写返回值,void也不写。
3.如果没有编写任何构造方法,那么编译器会默认赠送一个构造方法,没有参数,方法体什么也不做。
4.一旦编写了至少一个构造方法,那么编译器将不再赠送。
5.构造方法也是可以重载的。重载:方法名称相同,参数列表不同。
- 小贴士
一个标准的类通常要拥有下面四个组成部分:
1.所有的成员变量都要使用private关键字修饰。
2.为每一个成员变量编写一对Getter/Setter。
3.编写一个无参数的构造方法。
4.编写一个全参数的构造方法。
这样标准的类也叫Java Bean。
------------------------------------------华丽的分割线-----------------------------------------
在IDEA中: - 自动生成Getter/Setter代码(Code->Generate->Getter and Setter,成员变量都选择)
- 自动生成构造方法代码(Code->Generate->Constructor,Select None:无参构造方法;都选是全参构造方法)
API的概述和使用步骤(程序员随手使用的字典)
Scanner类(功能:可以实现键盘输入数据,到程序当中)
引用类型的一般使用步骤:
1.导包(直接创建就会有提示,如果未导包的话,会变红,将光标放在变红的类上,按alt+enter即可)
格式:import 包路径.类名称
提示:
如果需要使用的目标类,和当前类位于同一个包下,则可以省略导包语句不写。
只有java.lang包下的内容不需要导包,其他的包都需要import语句。
2.创建
类名称 对象名 = new 类名称();
3.使用
对象名.成员方法名()
匿名对象
创建对象的标准格式:类名称 对象名 = new 列名称();
- 匿名对象就是只有右边的对象,没有左边的名字和赋值运算符。
new Person().name = "热巴";
注意事项:匿名对象只能使用唯一的一次,下次再用不得不再创建一个对象。
使用建议:如果确定有一个对象只需要使用唯一的一次,就可以用匿名对象。
匿名对象作为方法的参数和返回值
1.作为返回参数
methodParam(new Scanner(System.in));//调用方法
...
public static void methodParam(Scanner sc) {//方法
int num = sc.nextInt();
System.out.println("输入的是:" + num);
}
2.作为返回值
public static Scanner methodReturn() {
return new Scanner(System.in);
}
Random类(用来生成随机数字)
步骤:
1.导包
import java.util.Random;
2.创建
Random r = new Random();//小括号留空即可
3.使用
- 获取一个随机的int数字(范围是int所有范围,有正负两种):int num = r.nextInt();
- 获取一个随机的int数字(参数代表了范围,左闭右开区间):int num = r.nextInt(3);
- 实际上代表的含义是:[0,3),也就是0~2。
例子:
//输出100个在0~9之间的随机数字
Random r = new Random();
for (int i = 0; i < 100; i++) {
int num = r.nextInt(10);// 实际范围0~9
System.out.println(num);
}
补充
对象数组(定义一个数组,用来储存对象)
例子:
// 首先创建一个长度为3的数组,用来存放Person类型的对象
Person[] array = new Person[3];
Person one = new Person("小明",16);
Person two = new Person("小红",17);
Person three = new Person("小刚",15);
// 将one,two,three中的地址值赋值到数组的0,1,2号元素位置
array[0] = one;
array[1] = two;
array[2] = three;
System.out.println(array[0].getName());
输出结果:小明