static 关键字
在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:
1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)
4. 在static方法中不可直接访问非static的成员。
核心要点:
static修饰的成员变量和方法,从属于类。
普通变量和方法从属于对象的。
static关键字的使用
public class User2 {
int id;
String name;
String pwd;
static String company="北京尚学堂";
public User2(int id,String name) {
this.id=id;
this.name=name;
}
public void login() {
printCompany();
System.out.println(company);
System.out.println("登录:"+name);
}
public static void printCompany() {
//login(); //静态成员调用非静态成员,编译将会报错
System.out.println(company);
}
public static void main(String[] args) {
User2 u=new User2(101,"止小兮");
u.login();
User2.printCompany();
User2.company="苍小凌有限公司";
User2.printCompany();
u.login();
}
}
静态初始化块
构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序:
先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
2. 构造方法执行顺序和上面顺序一样!!
static初始化块
public class User3 {
int id;
String name;
String pwd;
static String company;
static {
System.out.println("执行类的初始化工作");
company="苍小凌有限公司";
printCompany();
}
public static void printCompany() {
System.out.println(company);
}
public static void main(String[] args) {
User3 u3=new User3();
}
}
参数传值机制
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。
基本数据类型参数的传值
传递的是值的副本。 副本改变不会影响原件。
引用类型参数的传值
引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。
多个变量指向同一个对象
public class User4 {
int id;
String name;
String pwd;
public User4(int id,String name) {
this.id=id;
this.name=name;
}
public void testParameterTransfer01(User4 u) {
u.name="止小兮";
}
public void testParameterTransfer02(User4 u) {
u=new User4(200,"苍小凌");
}
public static void main(String[] args) {
User4 u1=new User4(100,"瑾修");
u1.testParameterTransfer01(u1); //传的是u1的地址
System.out.println(u1.name); //结果为:止小兮
u1.testParameterTransfer02(u1);
System.out.println(u1.name); //结果为:止小兮
}
}
包
包机制是Java中管理类的重要手段。 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理。 包对于类,相当于文件夹对于文件的作用。
package实现对类的管理,package的使用有两个要点:
类的第一句非注释性语句。
2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。
注:1. 写项目时都要加包,不要使用默认包。
2. com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的一部分。
JDK中的主要包
导入类import
如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
注:1. Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
如果导入两个同名的类,只能用包名+类名来显示调用相关类
导入同名类的处理
import java.sql.Date;
import java.util.*;//导入该包下所有的类。会降低编译速度,但不会降低运行速度
public class Test6 {
public static void main(String [] args) {
Date now;//这里指的是Java.sql.Date
java.util.Date now2= new java.util.Date();
System.out.println(now2); //因为 java.util.Date 与 java.sql.Date 类同名,需要完整的路径
Scanner input =new Scanner(System.in); //java.util包的非同名类不需要完整的路径
}
}
静态导入
静态导入(static import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。
静态导入的使用
package cn.sxt;
//以下两种静态导入的方式二选一即可
import static java.lang.Math.*;
import static java.lang.Math.PI;
public class Test2 {
public static void main(String [] args) {
System.out.println(PI);
System.out.println(random());
}
}