面向对象--静态

目录

一、静态

1.1 static修饰成员变量

1.2 static修饰成员变量的应用场景

1.3 static修饰成员方法

1.4 工具类

1.5 static的注意事项

1.6 static应用(代码块)


 

面向对象基本理解 写完会在此处放上链接

一、静态

 

面向对象编程中很常见的一个关键字static.

static读作静态,可以用来修饰成员变量,也能修饰成员方法。先来static修饰成员变量。

1.1 static修饰成员变量

Java中的成员变量按照有无static修饰分为两种:类变量、实例变量。它们的区别如下图所示:

面向对象--静态_第1张图片

由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量

实例变量是属于对象的,需要通过对象才能调用:对象.实例变量

  • 下面代码(注意静态变量,和实例变量是如何调用的)

面向对象--静态_第2张图片

来看一下上面代码的内存原理 面向对象--静态_第3张图片

最后总结一下

 在实际开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住

1.2 static修饰成员变量的应用场景

写个需求

需求:系统启动后,要求用于类可以记住自己创建了多少个用户对象

 

  • 第一步:先定义一个User类,在用户类中定义一个static修饰的变量,用来表示在线人数;

public class User{
    public static int number;
    //每次创建对象时,number自增一下
    public User(){
        User.number++;
    }
}
  • 第二步:再写一个测试类,再测试类中创建4个User对象,再打印number的值,观察number的值是否再自增。

public class Test{
    public static void main(String[] args){
        //创建4个对象
        new User();
        new User();
        new User();
        new User(); 
        
        //查看系统创建了多少个User对象
        System.out.println("系统创建的User对象个数:"+User.number);
    }
}

 运行上面的代码,查看执行结果是

1.3 static修饰成员方法

 

成员方法根据有无static也分为两类:类方法、实例方法

面向对象--静态_第4张图片

有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。

无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。

  • 先定义一个Student类,在类中定义一个类方法、定义一个实例方法

 

public class Student{
    double score;
    
    //类方法:
    public static void printHelloWorld{
        System.out.println("Hello World!");
        System.out.println("Hello World!");
    }
    
    //实例方法(对象的方法)
    public void printPass(){
        //打印成绩是否合格
        System.out.println(score>=60?"成绩合格":"成绩不合格");
    }
}
  • 在定义一个测试类,注意类方法、对象方法调用的区别

public class Test2{
    public static void main(String[] args){
        //1.调用Student类中的类方法
        Student.printHelloWorld();
        
        //2.调用Student类中的实例方法
        Student s = new Student();        
        s.printPass();
        
        //使用对象也能调用类方法【不推荐,IDEA连提示都不给你,你就别这么用了】
        s.printHelloWorld();
    }
}

static修饰成员方法的内存原理。

1.类方法:static修饰的方法,可以被类名调用,是因为它是随着类的加载而加载的; 所以类名直接就可以找到static修饰的方法
        
2.实例方法:非static修饰的方法,需要创建对象后才能调用,是因为实例方法中可能会访问实 例变量,而实例变量需要创建对象后才存在。  所以实例方法,必须创建对象后才能调用。

面向对象--静态_第5张图片以上就是  static修饰成员变量、和静态修饰成员方法这两种用法。

1.4 工具类

 如果一个类中的方法全都是静态的,那么这个类中的方法就全都可以被类名直接调用,由于调用起来非常方便,就像一个工具一下,所以把这样的类就叫做工具类。

  • 写一个生成验证码的工具类  
public class MyUtils{
    public static String createCode(int n){
        //1.定义一个字符串,用来记录产生的验证码
        String code = "";
        
        //2.验证码是由所有的大写字母、小写字母或者数字字符组成
        //这里先把所有的字符写成一个字符串,一会从字符串中随机找字符
        String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ";
        
        //3.循环n次,产生n个索引,再通过索引获取字符
        Random r = new Random();
        for(int i=0; i
  • 接着可以在任何位置调用MyUtilscreateCOde()方法产生任意个数的验证码

//比如这是一个登录界面
public class LoginDemo{
    public static void main(String[] args){
        System.out.println(MyUtils.createCode());
    }
}
//比如这是一个注册界面
public class registerDemo{
    public static void main(String[] args){
        System.out.println(MyUtils.createCode());
    }
}

工具类的使用

在补充一点,工具类里的方法全都是静态的,推荐用类名调用为了防止使用者用对象调用。我们可以把工具类的构造方法私有化。

public class MyUtils{
    //私有化构造方法:这样别人就不能使用构造方法new对象了
    private MyUtils(){
        
    }
    
    //类方法
    public static String createCode(int n){
       ...
    }
}

 

1.5 static的注意事项

 

记住三点

  1. 类方法中可以直接访问类成员,不可以直接访问实例成员
  2. 实例方法中既可以直接访问类成员,也可以直接访问实例成员
  3. 实例方法中可以出现this关键之,类方法中不可以出现this关键字
public class Student {
    static String schoolName; // 类变量
    double score; // 实例变量

    // 1、类方法中可以直接访问类的成员,不可以直接访问实例成员。
    public static void printHelloWorld(){
        // 注意:同一个类中,访问类成员,可以省略类名不写。
        schoolName = "黑马";
        printHelloWorld2();

        System.out.println(score); // 报错的
        printPass(); // 报错的

        ystem.out.println(this); // 报错的
    }
    
	// 类方法
    public static void printHelloWorld2(){

    }
    
    // 实例方法
    public void printPass2(){

    }
    
    // 实例方法
    // 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。
    // 3、实例方法中可以出现this关键字,类方法中不可以出现this关键字的
    public void printPass(){
        schoolName = "黑马2"; //对的
        printHelloWorld2(); //对的

        System.out.println(score); //对的
        printPass2(); //对的

        System.out.println(this); //对的
    }
}

 

1.6 static应用(代码块)

代码块根据有无static修饰分为两种:静态代码块、实例代码块  

 

静态代码块:

 

格式: static{}

特点:类加载时自动执行,由于类只会加载一次,所有静态代码块也只会执行一次;

作用:完成类的初始化:列如:对类变量的初始化赋值。

 

public class Student {
    static int number = 80;
    static String schoolName = "黑马";
    // 静态代码块
    static {
        System.out.println("静态代码块执行了~~");
        schoolName = "静态代码块";
    }
}

静态代码块不需要创建对象就能够执行

public class Test {
    public static void main(String[] args) {
        System.out.println(Student.number);
        System.out.println(Student.number);
        System.out.println(Student.number);

    }
}

执行上面代码时,发现没有创建对象,静态代码块就已经执行了。

静态代码块,随着类的加载而执行,而且只执行一次。

 

实例代码块:“

格式:{}

特点:每次创建对象时,执行实例代码块,并且在构造器前执行。

作用:和构造器一样,都是用来完成对象初始化  列如:对实例变量进行初始化赋值。

public class Student{
    //实例变量
	int age;
    //实例代码块:实例代码块会执行在每一个构造方法之前
    {
        System.out.println("实例代码块执行了~~");
        age = 18;
        System.out.println("有人创建了对象:" + this);
    }

    public Student(){
        System.out.println("无参数构造器执行了~~");
    }

    public Student(String name){
        System.out.println("有参数构造器执行了~~");
    }
}

接下来在测试类中进行测试,观察创建对象时,实例代码块是否先执行了。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student("张三");
        System.out.println(s1.age);
        System.out.println(s2.age);
    }
}

对于实例代码块重点注意:实例代码块每次创建对象之前都会执行一次

 

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