JavaSE07_static和final

JavaSE-07 【static-final】

第一章 static关键字

1.1 静态static关键字概述

  • static关键字
    • 一个类的不同对象有些共享的数据,这样我们就可以使用static来修饰 。
    • 一旦使用了static关键字,那么这样的内容不再属于对象,而是属于类的,
    • 凡是本类的对象,都共享同一份。
    • static可以用来修饰成员变量,修饰成员方法,以及静态代码块

1.2 静态static关键字修饰成员变量

  • static修饰成员变量
    • 1、static修饰成员变量,那么此变量就不属于对象,而是属于所在的类
    • 2、本类的多个对象共享此变量
    • 3、调用方式:可以使用对象名调用,也可以使用类名调用
    • 4、推荐使用 类名.静态属性名调用。不推荐使用对象名调用
/**
 * 1、模板类
 */
public class Student {
    private String name;
    private int age;
    public static String address;//定义静态变量

    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
/**
 * static修饰成员变量
 *  1、static修饰成员变量,那么此变量就不属于对象,而是属于所在的类
 *  2、本类的多个对象共享此变量
 */
public class TestStaticFiled {
    public static void main(String[] args) {
        //创建对象
        Student s1 = new Student("Tom", 22);
        //设置静态变量的属性值
        s1.address = "迈阿密";
        //获取对象的属性值
        System.out.println(s1.getName()+" : "+s1.getAge()+"岁, 来自: "+s1.address);
        //创建对象
        Student s2 = new Student("Anny", 19);
        //获取对象的属性值
        System.out.println(s2.getName()+" : "+s2.getAge()+"岁, 来自: "+s2.address);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CQ7iwc0S-1686187990707)(photo/JavaSE07_static和final.assest/1664898331639.png)]

1.3 静态static关键字修饰成员方法

  • static修饰成员方法
    • 1、使用static修饰成员方法,那么方法就成为静态方法
    • 2、静态方法不属于对象,属于类
    • 3、调用方式:类名称.方法名();
    • 4、推荐使用类名.静态方法名调用。不推荐使用对象名调用
    • 5、对于本类中的静态方法之间的调用,可以省略类名称
  • 注意事项:
    • 1、静态只能调用静态,不能调用费静态
    • 2、非静态可以访问静态
    • 3、原因:在内存中,先有的静态内容,后有的非静态内容。后可以访问先,先不能访问后
    • 4、静态方法中不能使用this
public class Person {
    //成员方法
    public void method1(){
        System.out.println("普通成员方法");
    }
    //静态成员方法
    public static void staticMethod(){
        System.out.println("静态成员方法");
    }
}
/**
 * static修饰成员方法
 *  1、使用static修饰成员方法,那么方法就成为静态方法
 *  2、静态方法不属于对象,属于类
 *  3、调用方式:类名称.方法名();
 *  4、推荐使用类名.静态方法名调用。不推荐使用对象名调用
 *  5、对于本类中的静态方法之间的调用,可以省略类名称
 */
public class TestStaticMethod {
    public static void main(String[] args) {
        //创建Person对象
        Person p = new Person();
        //对象调用普通方法
        p.method1();
        //对于静态方法,可以通过对象名进行调用,也可以通过类名调用成员方法
        p.staticMethod();//不推荐
        Person.staticMethod();//推荐
        
        //对于本类中的静态方法之间的调用,可以省略类名称
        methodA();
    }
    
    public static void methodA(){
        System.out.println("AAAAA");
    }
}

1.4 静态static的内存图

在内存图的方法区当中,有一块独立的空间,叫静态区,专门用来存储静态static的数据。

根据类名称访问静态成员变量的时候,全程和对象没有任何关系。

img

1.5 静态代码块

  • 格式:
static{
    //静态代码块的内容
}
  • 特点
    • 1、当类加载的时候,静态代码块一起加载,且只执行一次
    • 2、静态优先于非静态,所以静态代码块优先于构造方法执行
    • 3、一般用来一次性的对静态成员变量进行赋值
public class User {
    //静态代码块
    static {
        System.out.println("静态代码块执行了");
    }
    //无参构造方法
    public User() {
        System.out.println("无参构造执行了");
    }
}
/**
 * 静态代码块
 *  格式:
 *      static{
 *          //静态代码块的内容
 *      }
 *  特点:
 *      1、当类加载的时候,静态代码块一起加载,且只执行一次
 *      2、静态优先于非静态,所以静态代码块优先于构造方法执行
 *      3、一般用来一次性的对静态成员变量进行赋值
 */
public class TestStaticCodeDiv {
    public static void main(String[] args) {
        User user1 = new User();
        User user2 = new User();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbH13ypt-1686187990708)(photo/JavaSE07_static和final.assest/1664900426184.png)]

第二章 final关键字

2.1 final关键字的概念

  • 定义:final表示最终的,不可改变的

2.2 final的四种用法

  • 四种用法:
    • 1、用于修饰类 : final修饰的类不能被继承
    • 2、用于修饰方法:
      • final修饰的方法不能被重写
      • final不能和abstract关键字一起使用,因为两者矛盾
    • 3、用于修饰局部变量
      • final修饰局部变量不可被修改
      • 对于基本类型来说:final修饰的局部变量不可变的是其数据值
      • 对于引用数据类型:final修饰的局部变量不可变的是地址值
    • 4、用于修饰成员变量
      • fianl修饰成员变量,那么这个变量也是不可变的
      • 1、由于成员变量有默认值,所以使用final关键字之后,必须手动赋值。不会再给默认值
      • 2、对于final修饰的成员变量,要么直接赋值,要么使用构造方法赋值

:final修饰的局部变量不可变的是其数据值
- 对于引用数据类型:final修饰的局部变量不可变的是地址值

  • 4、用于修饰成员变量
    • fianl修饰成员变量,那么这个变量也是不可变的
    • 1、由于成员变量有默认值,所以使用final关键字之后,必须手动赋值。不会再给默认值
    • 2、对于final修饰的成员变量,要么直接赋值,要么使用构造方法赋值

你可能感兴趣的:(JavaSE,java,开发语言)