zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java面向对象编程——static和final

JAVA static Final 面向对象编程
2023-09-11 14:21:22 时间

第八章、static和final


目录

第八章、static和final

一、static

1.static修饰成员变量

2.案例--模拟统计网站访问人数

3.static修饰方法

4、static块和非static块

5.扩展:类加载机制

6.总结 

二、final

1.final关键字修饰类

2.final关键字修饰成员变量

3.final关键字修饰方法

4.static final修饰常量

5.总结

6.案例-窗体创建的三种方式


一、static

1.static修饰成员变量

斜体显示:



public class Person {
    String name;
    static int age;
​
}
  • 使用static修饰非成员变量不在对象的数据结构,而是类的基本信息参数
  • 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不要new对象
  1. -static修饰成员变量,加载一些需要优先加载静态的资源
  2. -通过类名直接访问static属性,类名.属性
  3. -属性将不在属于对象了,而用于描述类
  4. -static 修饰的成员变量存储在方法区中,且独有一份

 
public class Person {
    int  name;
    static int age;
​
    public Person() {
        name ++;
        age ++;
​
    }
​
}
public class TestStatic {
    public static void main(String[] args) {
       
        System.out.println(new Person().name);
        System.out.println(new Person().name);
        System.out.println(new Person().name);
        System.out.println(new Person().name);
        System.out.println(Person.age);
    }
​
}

2.案例--模拟统计网站访问人数

  • 1.服务器端:图片,音频,视频,按钮,连接
  • 2.客户端:访问资源

import java.util.Scanner;
public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要访问的资源");
        System.out.println("0:退出");
        System.out.println("1:图片");
        System.out.println("2:链接");
        System.out.println("3:按钮");
        System.out.println("4:音频");
​
        while(true) {
            //获取输入
            int userIn = scanner.nextInt();
            if (userIn == 0) {
                break;
            }
            switch (userIn){
                case 1: new Servers().getPricture();break;
                case 2: new Servers().getHerf();break;
                case 3: new Servers().getButton();break;
                case 4: new Servers().getVideo();break;
​
            }
        }
        System.out.println("网站访问人数为:"+Servers.count);
    }
}

​
/*
网站:
 */
public class Servers {
    String pricture;//图片
    String herf;//链接
    String button;//按钮
    String video;//音频
​
    static  int count;//访问人数
​
    public Servers(){
        count ++;
    }
​
    public void getPricture() {
        System.out.println("访问了图片");
    }
​
    public void getHerf() {
        System.out.println("访问了链接");
    }
​
    public void  getButton() {
        System.out.println("访问了按钮");
    }
​
    public void  getVideo() {
        System.out.println("访问了音频");
    }
}

3.static修饰方法

  • -类名.方法 -静态方法中不能访问非静态成员

4、static块和非static块

static块:作用就是加载静态资源的 结构:static{ }

static {
    System.out.println("静态代码块");
}

非静态代码块: {}

//非静态代码块
{
    System.out.println("非静态代码块");
​
}

5.扩展:类加载机制

  • 执行顺序:静态代码块>代码块>构造方法 !!!
  • 当有static修饰的内容,会在类加载期间就执行
//非静态代码块
{
    System.out.println("非静态代码块");
​
}
//静态代码块
static {
    System.out.println("静态代码块");
}
//构造方法
public Person() {
    System.out.println("构造方法");
}

6.总结 

  • static修饰的成员可以直接使用类名调用;类名.属性/方法

  • static修饰的成员变量不再属于对象,而用于描述类!

  • static修饰的成员存储在方法区中,且独有一份。

  • static方法不能调用非static成员

  • static成员会在类加载期间加载

二、final

final关键字---最终的

1.final关键字修饰类

  •    ----不能被继承!防止滥用继承

2.final关键字修饰成员变量

  • final修饰的变量不能改变
public class TestFinal {
    final int i = 5;// final修饰的成员变量不能改变
​
    public static void main(String[] args) {
        new TestFinal().i = 2;
    }
}
  • 但可以分开赋值,在构造方法中赋值:
public class TestFinal {
    final int i ;// final修饰的成员变量不能改变
    public TestFinal() {
        i = 5;
    }
​
    public static void main(String[] args) {
​
    }
}
  • 局部变量
public static void main(String[] args) {
    final int i;
    i = 1;
    
}

3.final关键字修饰方法

  • 不能被重写
public final void show() {
    System.out.println("final关键字修饰方法");
}

4.static final修饰常量

  • -static 和final共同修饰的量为常量
  • -声明方式:声明时初始化 命名方式全是大写,且不同的单词之间用_隔开
  • 用在特定的不让其改变的数值,用在工厂类中
  • 常量在编译时,会直接使用常量的值替换掉常量
ublic class TestFinal {
    final int i = 5;// final修饰的成员变量不能改变
​
    static final  int EXIT;   //错误,必须在这里初始化
​
    public TestFinal() {
​
        EXIT = 4;  //错误,只能在声明时初始化
    }
}
public class TestFinal {
    final int i = 5;// final修饰的成员变量不能改变
​
    static final  int EXIT = 10;   //常量
    }

5.总结

  • final修饰类不能被继承

  • final修饰变量不能被改变,当修饰的是引用对象时,引用的地址不能变,但值可以变

  • final修饰方法不能被重写

  • static final修饰的量为常量,且使用全大写,_分割的形式命名

  • 编译时常量会直接替换为具体的值

  • 对于public static final 三个修饰的次序是无关紧要的:public static final

6.案例-窗体创建的三种方式

  • 第一种
mport javax.swing.*;
​
/*
案例:窗体创建的第一种方式
存在弊端:没有体现面向对象编程
 */
public class MyFirstJFrame {
​
    public static void main(String[] args) {
        //实例化窗体类对象
        JFrame jFrame = new JFrame();
        //1.设置标题
        jFrame.setTitle("My first JFrame");
        //2.设置尺寸
        jFrame.setSize(600,400);
        //设置默认的关闭方式
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        //3.设置窗体可见
        jFrame.setVisible(true);
​
​
​
    }
}
  • 第二种
import javax.swing.*;
​
/*
案例:窗体创建的第二种方式
存在弊端:代码冗余,考虑继承
 */
public class MySecondJFrame {
    JFrame jFrame;
​
    public MySecondJFrame() {
        //实例化窗体类对象
        JFrame jFrame = new JFrame();
        //1.设置标题
        jFrame.setTitle("My Second JFrame");
        //2.设置尺寸
        jFrame.setSize(600,400);
        //设置默认的关闭方式
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        //3.设置窗体可见
        jFrame.setVisible(true);
    }
​
    public static void main(String[] args) {
        new MySecondJFrame();
​
​
​
    }
}
  • 第三种
    
import javax.swing.*;
​
​
/*
案例:窗体创建的第三种方式
继承
 */
public class MyThirdJFrame  extends JFrame{
​
    JFrame jFrame;
​
    public MyThirdJFrame() {
            setTitle("My first JFrame");
            setBounds(Factory.jFrameX,Factory.jFrameY,Factory.jfWidth,Factory.jfHeight);
​
            setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
            setVisible(true);
    }
​
    public static void main(String[] args) {
         new MyThirdJFrame();
    }
}
​
​
//创建数字工厂
​
import java.awt.*;
​
public class Factory {
​
    public static int width = Toolkit.getDefaultToolkit().getScreenSize().width;
    public static int heright = Toolkit.getDefaultToolkit().getScreenSize().height;
​
    public  static int jfWidth = 400;
    public static int jfHeight = 600;
​
    public static int jFrameX = width / 2 - jfWidth / 2;
    public static int jFrameY = heright / 2 - jfHeight / 2;
​
}
​