第八章、static和final
目录
一、static
1.static修饰成员变量
斜体显示:
public class Person {
String name;
static int age;
}
- 使用static修饰非成员变量不在对象的数据结构,而是类的基本信息参数
- 使用static修饰的成员可以直接使用,类名.成员的方式访问,而不要new对象
- -static修饰成员变量,加载一些需要优先加载静态的资源
- -通过类名直接访问static属性,类名.属性
- -属性将不在属于对象了,而用于描述类
- -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;
}