1.static关键字
static:静态的。
static修饰的东西和对象无关!!!
1.1生活中静态的东西
如公共资源。可以使用,但和使用者本身没有关系
1.2Java中的静态
1.2.1static修饰成员变量
静态属性,如 static String name;
语法格式: static 数据类型 变量名;
静态属性的调用(在主函数main中):
赋值:类名.静态属性名 = 值
取值:类名.静态属性名
代码示例1:
class Person {
String name;
int age;
static String country; // 注意:静态属性名字是斜体
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
person.name = "张三";
person.age = 23;
Person.country = "中国"; //正确的调用方式
// person.country = "PRC"; //不规范的调用方式,会有警告
System.out.println(Person.country); //PRC。虽然不规范,但仍会覆盖原来的值
}
}
注意事项:
1.使用static修饰的变量叫静态变量。
2.代码中对象还没创建时,只要加载了类,那么类中静态的属性已经存在于内存的方法区了,因为它和对象没有关系。
3.一个属性如果用static来修饰,那么在内存的方法区和堆区都会存在这个属性,且两者之间存在一个通道,这就是用类名调用和用对象调用时都会改变属性值的原因。
1.2.2static修饰成员方法
静态方法。
语法格式: public static 返回值 方法名(所需参数) { }
调用格式: 类名.静态方法名(所需参数);
代码示例2:
class Dog {
public void eat () {
System.out.println("普通的成员方法");
}
public static void sleep () {
System.out.println("静态方法");
}
}
public class Demo2 {
public static void main(String[] args) {
//通过类名调用静态方法
Dog.sleep();
//普通成员方法需要通过对象来调用
//Dog.eat();
//在一般情况下,Demo2省略掉了,因为是在同一个类中定义并调用了这个静态方法
Demo2.test();
}
public static void test () {
System.out.println("嘻嘻");
}
}
1.2.3static修饰代码块
静态代码块。
语法格式:
static {
//代码块
}
只要这个类加载了,那么静态代码块一定会执行
执行顺序:静态代码块 --> 构造代码块 --> 构造方法。
代码示例3:
class Cat {
public Cat () {
System.out.println("无参构造方法");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
}
public class Demo4 {
public static void main(String[] args) {
Cat cat = new Cat();
//静态代码块
//构造代码块
//无参构造方法
}
}
2.final关键字
final:最终的,最后的。
1.final可以用来修饰成员变量 final String name;
使用final修饰的成员变量一定要先初始化(赋值),且一旦被赋值,无法改变。
2.final可以用来修饰局部变量
修饰局部变量时,可以先不赋值,之后再赋值。一旦被赋值,无法改变。
3.final可以用来修饰成员方法
使用final修饰的成员方法,无法被重写。
4.final可以用来修饰类
使用final修饰的类,不能被继承。
5.final可以修饰一个对象的引用
使用final修饰的对象引用,内存地址固定,不能再用另一个对象的引用对其进行赋值。
代码示例:
class Person {
//final修饰类属性必须赋初始值
//赋值之后无法改变
final String name = "狗蛋";
public void test () {
//final修饰局部变量,可先不赋值
final int i;
i = 30;
//i = 80; //报错,一旦被赋值,就无法改变
System.out.println(i);
}
public final void eat () {
System.out.println("吃饭");
}
}
public class Demo1 {
public static void main(String[] args) {
final Person person = new Person();
System.out.println("Person:" + person);
//一旦使用final修饰对象引用person,就是一个固定的内存地址
Person person1 = new Person();
System.out.println("Person1:"+ person1);
//person.name = "嘻嘻";
//person = person1;//将person1赋值给了person对象。报错,内存地址无法改变
System.out.println(person);
}
}