第一节 成员变量
1.1 成员变量与局部变量
成员变量: 声明在类下面, 方法外面; 作用于整个类中;
局部变量: 声明在方法下面, 作用于方法下面.
1.2 成员变量默认值
成员变量的默认值和数组的默认值一样:
整数类型: 0
浮点类型: 0.0
字符类型:\u0000
布尔类型: false
字符串类型: null
1.3 成员变量和局部变量的区别
1. 从声明的位置: 局部变量声明在方法中, 成员变量声明在类下面.
2. 从默认值方面: 局部变量没有默认值, 成员变量有默认值.
3. 从生命周期来说: 局部变量随着方法的调用而开辟存储空间, 方法调用结束.
释放存储空间, 成员变量随着对象的消失而消失.
4. 从存储位置方面: 局部变量存储在栈内存, 成员变量存储在堆内存 .
第二节 面向对象中 JVM 内存管理
2.1 类文件名
类文件是以. java 为后缀的代码文件, 在每个类文件中最多只允许出现一个 public 类,
当有 public 类的时候类文件的名称必须和 public 类的名称相同, 若不存在 public,
则类文件的名称可以为任意的名称(以数字开头的名称是不允许的).
2.2 栈内存, 堆内存与方法区
JAVA 的 JVM 的内存可分为 3 个区: 堆 (heap), 栈(stack) 和方法区(method) .
2.2.1 堆区:
1. 存储的是对象和成员变量, 每个对象都包含一个与之对应的 class 的信息.(class 的目的是得到操作指令)
2.JVM 只有一个堆区 (heap) 被所有线程共享, 堆中不存放基本类型和对象引用, 只存放对象本身
2.2.2 栈区:
1. 每个线程包含一个栈区, 栈中只保存基础数据类型的对象和自定义对象的引用(不是对象), 对象都存放在堆区中
2. 每个栈中的数据 (原始类型和对象引用) 都是私有的, 其他栈不能访问.
3. 栈分为 3 个部分: 基本类型变量区, 执行环境上下文, 操作指令区(存放操作指令).
2.2.3 方法区:
1. 又叫静态区, 跟堆一样, 被所有的线程共享. 方法区包含所有的 class 和 static 变量.
2. 方法区中包含的都是在整个程序中永远唯一的元素, 如 class,static 变量.
2.3 创建对象过程中内存中各类数据的执行情况
运行类过程: 方法区找到方法 -- 堆中实例化对象 -- 调用栈(指向堆中实例)(有误??????)
之前笔记存疑, 确定后更新 待补充.........................
总结:
栈内存: 基本的数据类型, 对象的引用;
堆内存: 一切 new 出来的对象, 成员变量;
方法区: class 文件, static 变量, 方法;
第三节 构造函数
3.1 构造函数
1, 意义: 对成员变量 (类) 初始化;
2, 分类: 无参构造函数 有参构造函数
3.3 this 关键字
在 java 中的作用:
1, 代表本身(本类) this. 成员变量
2, 可以调用本类相关的构造函数
无参调有参: this(参数列表);
有参调无参: this();
备注:
1,this 关键字在调用自身的构造函数时, 必须放在构造函数的第一行, 否则报错;
2, 无参调有参, 有参调无参只能存一, 不能同时存在;
例程: Dog.java
3.3 构造函数的特点
1. 没有返回值(不用写 void).
2. 方法名必须和类名一致.
无参构造函数:
语法:
public 类名(){
方法体
}
有参构造函数:
语法:
public 类名(参数列表){
方法体
}
例程: Dog.java
- package gouzao_this;
- public class Dog {
- String kind;
- String name;
- int age;
- // 无参构造函数
- public Dog() {
- // 无参调有参, this 调用自身的构造函数必须放在第一行否则会报错
- //this("大黄","土狗",9);
- // 有参与无参之间的相互调用只能存在一个不能同时都存在
- kind = "erha";
- name = "shagou";
- age = 3;
- System.out.println("无参调用");
- }
- // 有参构造函数
- public Dog(String name,String kind,int age) {
- // this(); // 有参调无参
- //this 关键字调用类本身
- this.name = name;
- this.kind = kind;
- this.age = age;
- System.out.println("有参调用");
- }
- public void show() {
- System.out.println("这是条叫"+name+"的"+kind+"今年"+age+"岁");
- }
- }
- View Code
例程: 测试 Dog 类:
- package gouzao_this;
- public class TextDog {
- public static void main(String[] args) {
- Dog dog1 = new Dog(); // 调用无参构造函数
- Dog dog2 = new Dog("大黄","土狗",4);
- dog1.show();
- dog2.show();
- }
- }
- View Code
思考:
1. 构造函数中能否有 retrun 关键字?
可以, 只用写 return; 作为结束符;
2. 有参构造函数中参数列表能否自行控制数量(数量能否不和成员变量一致)?
可以, 想初始化几个变量就初始化几个变量
3. 有参构造函数和无参构造函数能够独立存在?
可以, 但是最好都把它写在类中.
备注:
1, 构造函数在创建对象函数时执行, 即对象的创建是对类的构造函数的调用;
2, 若没有创建构造函数时, 系统会默认添加一个无参构造函数, new 对象时会自动调用无参构造函数;
3, 当添加了有参构造函数时, 系统此时不会默认添加一个无参构造函数, 需手动添加无参构造函数; 若不添加无参构造函数, 不能够创建无参对象;
练习: 用面向对象的思想实现之前的双色球随机数组, 要求生成随机数的最大值可以任意改变.
参考代码:
- package gouzao_this;
- import java.util.Arrays;
- import java.util.Random;
- public class DoubleColerBall {
- public void getNum(int redBallNum,int blueBallNum) {
- int[] redBall = new int[6];
- int index =0;
- int temp = 0;
- int blueBN = 0;
- Random r = new Random();
- // 生成红色球的随机数
- redBall[index++] = r.nextInt(redBallNum)+1;
- loop: while(true) {
- temp = r.nextInt(redBallNum)+1;
- for(int t=0; t<redBall.length;t++) {
- if(redBall[t]==temp) {
- continue loop;
- }
- } //for 循环
- redBall[index++] = temp;
- if (index==6) {
- break;
- }
- }
- // 蓝色球随机数
- blueBallNum = r.nextInt(blueBallNum)+1;
- int[] Ball = Arrays.copyOf(redBall, redBall.length+1);
- Ball[Ball.length-1]=blueBallNum;
- System.out.println("生成的数组为:"+Arrays.toString(Ball));
- }
- }
- View Code
- package gouzao_this;
- /**
- *
- * @项目名称: OOPDay02m
- * @模块功能: 用面向对象的思想方法实现双色球,
- * 要求生成随机数的最大值可以任意改变.
- * @模块版本:
- * @JDKVersions:JDK 8.0
- * @author: Kanekiyi
- */
- public class TextDoubleCB {
- public static void main(String[] args) {
- DoubleColerBall DCB1 = new DoubleColerBall();
- // 输入红球蓝球生成的数字最大数
- DCB1.getNum(37,18);
- }
- }
来源: http://www.bubuko.com/infodetail-2735512.html