Java学习第19天

深入变量
变量的分类和初始值

定义变量的语法:
数据类型 变量名 = 值;
变量根据在类中定义位置的不同分为两大类:
1.成员变量: 全局变量/字段。直接定义在类中方法外;

  • 类成员变量。使用static修饰的字段;
  • 实例成员变量:没有static修饰的字段。
    2.局部变量: 变量除了成员变量,其他都是局部变量;
  • 方法内部的变量;
  • 方法的形参;
  • 代码块中(一对 { }中)的变量。

变量的初始值: 变量初始化以后,才能在内存中开辟空间。
成员变量:默认是有初始值的;
局部变量:没有初始值,所以必须初始化才能使用。
在这里插入图片描述
变量的作用域:
变量根据位置的不同,决定了其作用域的不同,看变量所在的那一对{ }
成员变量:在整个类中都有效;
局部变量:从开始定义的位置开始到紧跟着最近的 } 为止。

成员变量可以先使用后定义,局部变量只能先定义后使用。

class ABC 
{
	String info = null;//成员变量
	void doWork(String name){
		System.out.println(x);
		int age;//局部变量

		if(true){
			int num;//局部变量
		}
	}
	{
		int num;//局部变量
	}
	String x;
}
变量的作用域和生命周期

变量的生命周期:
量的作用域指的是变量的存在范围,只有在这个范围内,程序代码才能访问它。当一个变量被定义时它的作用域就确定了。

变量的作用域决定了变量的生命周期,说明作用域不同,生命周期就不一样。

变量的生命周期指的是一个变量被创建并分配内存空间开始,到该变量被销毀并清除其所占内存空间的过程。
不同变量的生命周期
变量的定义和选择:
局部变量定义后,必须显示初始化后才能使用,因为系统不会为局部变量执行初始化操作。这就意味着,定义局部变量后,系统并未为这个变量分配内存空间。
直到程序为这个变量赋值时,系统才会为局部变量分配内存,并将初始值保存到该内存中。
局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。
基本数据局部变量:直接把这个变量的值保存到该变量所对应的内存中。
引用数据局部变量:这个变量内存中存的是地址通过该地址引用到该变量实际引用堆里的的对象。
栈内存中的变量无需系统垃圾回收,其往往随方法或代码块的运行结束而结束。

什么时候使用成员变量和局部变量:
1:考虑变量的生存时间,这会影响内存开销。
2:扩大变量作用域,不利于提高程序的高内聚。
开发中应该尽量缩小变量的作用范围, 如此在内存中停留时间越短,性能也就更高。
不要动不动就使用static修饰,一 般定义工具方法的时候,static方法需要访问的变量,该变量属于类,此时才使用static修饰字段。
也不要动不动就使用成员变量因为存在着线程不安全问题,能使用局部变量尽量使用局部变量。

封装思想
package语句

为了便于对硬盘上的文件进行管理,通常会将文件分目录进行存放。同理,变成也需要将编写的类分目录存放,便于管理。为此,Java引入了包(package)机制,程序可以通过声明包的方式对Java类定义目录。
package作用: 专门用来给当前的Java文件设置包名;
语法格式: package 包名.子包名.子子包名;注意: 包的声明只能位于Java源文件的第一行(所有代码之前)。
此时编译命令: javac -d . Hello.java
javac -d . Hello.java:
如果此时Hello.java文件中没有使用package语句,表示在当前目录中生成字节码文件。
如果此时Hello.java文件中使用了package语句,此时表示在当前目录中先生成包名,在在包中生成字节码文件。
运行命令: java 包名.类名;
在这里插入图片描述

package最佳实践

1. 包名如何定义: 自定义的包名不能以java. 打头,因为java的安全机制会检查报错

  • 包名必须遵循标识符规范/全部小写
  • 企业开发中,包名采用公司域名倒写
    如:520it.com---->com.520it—>此时520it不符合标识符规范,我们使用下划线_(com._520it),在Android中,如果package中使用了 _,则不能部署到模拟器上,此时可以使用 一个字母来代替。package com.m520it;package com.a520it
    格式: package 域名倒写.模块名.组件名;
    package com._520it.pss.util;---->进销存模块中专门用来存储工具类的包。
    在这里插入图片描述
    2.类的名称:
  • 类的简单名称:定义类的名称 。如:PackageDemo
  • 类的全限定名称:包名 . 类名。如:com._520it.hello.PackageDemo.
    在这里插入图片描述
    3.在开发中,都是先有package而后在package中再定义类。
    在这里插入图片描述
    JDK中的包名:
    在这里插入图片描述
    在这里插入图片描述
import语句

如果A类和B类在不同的包中,若A类需要使用到B类,此时就得让A类中去引入B类。
我们演示数组工具类:Arrays类,该类在java.util包中。
Arrays类的全限定名: java.util.Arrays
在没有使用import前,操作不再同一个包中的类,我们需要使用全限定名来操作。

class ImportDemo 
{
	public static void main(String[] args) 
	{
		int[] arr = new int[]{10,6,3,9,5};
		//打印数组
		String ret = java.util.Arrays.toString(arr);
		System.out.println(ret);
		//排序
		java.util.Arrays.sort(arr);
		//打印
		String ret1 = java.util.Arrays.toString(arr);
		System.out.println(ret1);
	}
}

解决方案:使用import语句,直接把某个包下的类导入到当前类中
语法格式: import 需要导入的类的全限定名;
导入后,在该类的java程序中,只需要使用类的简单名称即可。

import java.util.Arrays;
class ImportDemo 
{
	public static void main(String[] args) 
	{
		int[] arr = new int[]{10,6,3,9,5};
		//打印数组
		String ret = Arrays.toString(arr);
		System.out.println(ret);
		//排序
		Arrays.sort(arr);
		//打印
		String ret1 = Arrays.toString(arr);
		System.out.println(ret1);
	}
}

注意: 编译器会自动去java.lang包中去寻找使用到的类,比如System.String,所以他们不需要导入。
推论:非java.lang包的类,都需要导入。

import java.util.Arrays;
import java.util.Set;
import java.util.List;

如果引用同一个包中的不同类时,我们可以使用通配符(import java.util.*;
import 类的全限定名;只能导入一个类。
import 包名.子包名.
;表示引入该包下的所有的在当前文件中使用到的类。

**注意:**编译器会默认找java.lang包下的类,但是却不会去java.lang的子包下的类。比如:java.lang.reflect.Method类。
此时我们也得使用import java.lang.reflect.Method 。

静态导入 (开发中不建议使用)

String ret = Arrays.toString(arr);
Arrays.sort(arr);
String ret1 = Arrays.toString(arr);

在上述代码中,每次使用Arrays类中的静态方法即使我们使用了import语句,但是每次都需要使用Arrays类名去调用静态方法。
很麻烦,我期望:我能把Arrays类中的静态成员作为自己的静态成员一样调用 。 sort(arr);
解决方案:
语法格式:import static 类的全限定名.该类中的static成员名;
在这里插入图片描述
import static 类的全限定名.*; 此时的 * 表示当前类的任意使用到的静态成员。
静态导入也是一个语法糖/编译器级别的新特性。
在实际开发中,我们不使用静态导入。因为如此,分不清某一个静态方法或字段来源于哪一个类。
Eclipse工具,当格式化代码的时候就自动取消了所有的静态导入,变成使用类名调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值