作用域
- 在java编程中,主要的变量就是属性(成员变量)和局部变量
- 局部变量一般是指才成员方法中定义的变量
- java中的作用域的分类:
- 全局变量:也就是属性,作用域为整个类体
- 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
- 全局变量(属性)可以不赋值,直接使用,因为有默认值。局部变量必须赋值后才能使用,因为没有默认值。
注意事项和细节:
- 属性和局部变量可以重名,访问时遵循就近原则
- 在同一个作用域中,两个局部变量不能重名
- 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量声明周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。
- 作用域不同
- 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
- 局部变量:只能在本类中对应的方法中使用
- 修饰符不同
- 全局变量/属性可以加修饰符
- 局部变量不可以加修饰符
构造方法/构造器
基本语法:
修饰符 方法名(形参列表){
方法体;
}
- 构造器的修饰符可以默认
- 构造器没有返回值
- 方法名和类名必须一样
- 参数列表和成员方法一样的原则
- 构造器的调用由系统完成
构造方法又叫构造器,是类的一种特殊的方法,主要作用是完成对新对象的初始化,有几个特点:
- 方法名和类名相同
- 没有返回值
- 在创建对象时,系统会自动调用该类的构造器完成对对象的初始化
注意事项和细节:
- 一个类可以定义多个构造器,即构造器重载
- 构造器名要和类名相同
- 构造器没有返回值
- 构造器是完成对象的初始化,并不是创建对象
- 在创建对象时,系统自动调用该类的构造方法
- 如果程序员没有定义构造器,系统会自动给类生成一个默认的无参构造器(也叫默认构造器)
- 一旦定义了自己的构造器,默认的构造器就被覆盖了,就不能再使用默认的无参构造器,除非自己显式定义
对象创建流程分析:
class Person{
int age = 90;
String name;
Person(String n,int a){
name = n;
age = a;
}
}
Person p = new Person("小倩",20);
- 方法区先加载Person类信息,只加载一次
- 在堆里分配空间(地址),存放age和name,
- 完成对象初始化
- 默认初始化,值为默认值,age = 0,name = null
- 显式初始化,age = 90,name = null
- 构造器初始化,age = 20,name = “小倩”
- 将对象在堆中的地址,返回给p(p是对象名,也可以理解为对象的引用)
this关键字
java虚拟机 会给每个对象分配this,代表当前对象
this 指向当前对象的地址
哪个对象调用,this就指向哪个对象
注意事项和细节:
- this关键字可以访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表)
- 访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另一个构造器,但this必须放置在第一条)
- this不能在类定义的外部使用,只能在类定义的方法中使用
做题小技巧:
-
当类的成员方法的返回值是一个double值且形参为数组时,可以将返回值设为Double类,很好的处理当实际参数为{}或者为null
import java.util.Scanner; public class Homework01{ public static void main(String[] args) { int arrNum; Scanner myScanner = new Scanner(System.in); System.out.println("请输入数组元素的个数:"); arrNum = myScanner.nextInt(); double[] arr = new double[arrNum]; for(int i = 0 ; i < arrNum;i++){ System.out.println("请输入第" + (i+1) + "个元素:"); arr[i] = myScanner.nextDouble(); } A01 a01 = new A01(); double max = a01.max(arr); System.out.println("数组的最大值为:"+ max); /* 主方法中改为: Double res = a01.max(arr); if(res != null){ System.out.println("数组的最大值为:"+ res); } else{ System.out.println("数组不能为空!"); } 健壮性大大增加! */ } } class A01{ //方法可以返回一个Double类,这样当数组为空的时候,可以返回一个null //而且可以判断arr = null 或者 arr = {} 的情况,十分健壮 /* public Double max(double[] arr){ if(arr.length > 0 && arr != null){ double maxNum = d[0]; for(int i = 1; i < d.length; i++){ if(d[i] > maxNum){ maxNum = d[i]; } return maxNum; } else{ return null; } } */ public double max(double[] d){ if(d.length == 0){ return -999999.9999; } double maxNum = d[0]; for(int i = 1; i < d.length; i++){ if(d[i] > maxNum){ maxNum = d[i]; } } return maxNum; } }
-
new Person().age
匿名对象,匿名对象使用后就不能再使用
-
随机数
Random r = new Random(); comGuessNum = r.nextInt(3);//返回0-2的随机数