Java学习-Day08(作用域、构造方法、this关键字)

作用域

  1. 在java编程中,主要的变量就是属性(成员变量)和局部变量
  2. 局部变量一般是指才成员方法中定义的变量
  3. java中的作用域的分类:
    • 全局变量:也就是属性,作用域为整个类体
    • 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
  4. 全局变量(属性)可以不赋值,直接使用,因为有默认值。局部变量必须赋值后才能使用,因为没有默认值。

注意事项和细节:

  1. 属性和局部变量可以重名,访问时遵循就近原则
  2. 在同一个作用域中,两个局部变量不能重名
  3. 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量声明周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。
  4. 作用域不同
    • 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
    • 局部变量:只能在本类中对应的方法中使用
  5. 修饰符不同
    • 全局变量/属性可以加修饰符
    • 局部变量不可以加修饰符

构造方法/构造器

基本语法:

修饰符 方法名(形参列表){

​ 方法体;

}

  1. 构造器的修饰符可以默认
  2. 构造器没有返回值
  3. 方法名和类名必须一样
  4. 参数列表和成员方法一样的原则
  5. 构造器的调用由系统完成

构造方法又叫构造器,是类的一种特殊的方法,主要作用是完成对新对象的初始化,有几个特点:

  1. 方法名和类名相同
  2. 没有返回值
  3. 在创建对象时,系统会自动调用该类的构造器完成对对象的初始化

注意事项和细节:

  1. 一个类可以定义多个构造器,即构造器重载
  2. 构造器名要和类名相同
  3. 构造器没有返回值
  4. 构造器是完成对象的初始化,并不是创建对象
  5. 在创建对象时,系统自动调用该类的构造方法
  6. 如果程序员没有定义构造器,系统会自动给类生成一个默认的无参构造器(也叫默认构造器)
  7. 一旦定义了自己的构造器,默认的构造器就被覆盖了,就不能再使用默认的无参构造器,除非自己显式定义

对象创建流程分析:

class Person{
    int age = 90;
    String name;
    Person(String n,int a){
        name = n;
        age = a;
    }
}
Person p = new Person("小倩",20);
  1. 方法区先加载Person类信息,只加载一次
  2. 在堆里分配空间(地址),存放age和name,
  3. 完成对象初始化
    • 默认初始化,值为默认值,age = 0,name = null
    • 显式初始化,age = 90,name = null
    • 构造器初始化,age = 20,name = “小倩”
  4. 将对象在堆中的地址,返回给p(p是对象名,也可以理解为对象的引用)

this关键字

java虚拟机 会给每个对象分配this,代表当前对象

this 指向当前对象的地址

哪个对象调用,this就指向哪个对象

注意事项和细节:

  1. this关键字可以访问本类的属性、方法、构造器
  2. this用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表)
  4. 访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另一个构造器,但this必须放置在第一条)
  5. this不能在类定义的外部使用,只能在类定义的方法中使用

做题小技巧:

  1. 当类的成员方法的返回值是一个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;
    	}
    }
    
  2. new Person().age

    匿名对象,匿名对象使用后就不能再使用

  3. 随机数

    Random r = new Random();
    
    comGuessNum = r.nextInt(3);//返回0-2的随机数
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚来舟Mango

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值