Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)

简介: Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)

三、static成员



       3.1 再谈学生类


                   学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别,年龄,学分绩点等成员信息,这些信息是对不同学生进行描述的,例如


public class Student{
                        // ...
                        public static void main(String[] args) {
                                Student s1 = new Student("Li leilei", "男", 18, 3.8);
                                Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
                                Student s3 = new Student("Jim", "男", 18, 2.6);
                          }
                }


             如果三个同学是一个班的,那么他们上课在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。


              之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。


       3.2static修饰成员变量


static修饰的成员变量,称为静态成员变量静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

            静态成员变量的特性:不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中;既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问;类变量存储在方法区当中;生命周期伴随类的一生。

public class Student {
            public String name;
            public String gender;
            public int age;
            public double score;
            public static String classRoom="bit110";
            public Student(String name,String gender,int age,double score){
                this.name=name;
                this.gender=gender;
                this.age=age;
                this.score=score;
            }
            public void print(){
                System.out.println(this.name+" "+this.gender+" "+this.age+" "+this.score);
            }
            public static void main(String[] args) {
                //直接通过类名访问
                System.out.println(Student.classRoom);
                System.out.println("====");
                Student s1 = new Student("张三", "男", 18, 3.8);
                Student s2 = new Student("李四", "女", 19, 4.0);
                Student s3 = new Student("王五", "男", 18, 2.6);
                s1.print();
                s2.print();
                s3.print();
                System.out.println("====");
                //也可以通过对象访问,三个对象共享classRoom
                System.out.println(s1.classRoom);
                System.out.println(s2.classRoom);
                System.out.println(s3.classRoom);
    }
}


d7ae33e3f9bc494c93fc5b700d84bfd4.png

449af09d6d91466193e5dda58ac99832.png

可以看到,静态成员变量并没有存储到某个具体的对象中


       3.3static修饰成员方法


               一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?


   

class Stu {
            private String name;
            private String gender;
            private int age;
            private double score;
           private static String classRoom="bit110";//private修饰只能在自己类中使用
            public Stu(String name,String gender,int age,double score){
                this.name=name;
                this.gender=gender;
                this.age=age;
                this.score=score;
            }
        }
            public class TextStu{
                public static void main(String[] args) {
                        System.out.println(Stu.classRoom);
                }
             }


       编译失败,报错:


ac6ea0c521a44168ad8cd9926088ce2d.png

              Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。


 

//....
        public static String Getclassroom(){
            return classRoom;
        }
        public class TextStu{
            public static void main(String[] args) {
                    System.out.println(Stu.Getclassroom());
            }
        }

80ce874df52246ef8cd2fc8a1455894d.png


                静态方法特性:不属于某个具体的对象,是类方法;可以通过对象调用,也可以通过类名.静态方法名(...)方式调用;不能在静态方法中访问任何非静态成员变量;静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用。


       3.4 static成员变量初始化


               静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性,静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。


               1.就地初始化


                       就地初始化指的是:在定义时直接给出初始值。

public class Student{
                private String name;
                private String gender;
                private int age;
                private double score;
                private static String classRoom = "bit110";
                // ...
          }

               2.静态代码块初始化


                       看后文---


四、代码块



       4.1 代码块概念及分类


               使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:普通代码块、构造块、静态块和同步代码块。


       4.2 普通代码块


              普代码块:定义在方法中的代码块。


public class Main{
                public static void main(String[] args) {
                            { //直接使用{}定义,普通方法块
                                int x = 10 ;
                               System.out.println("x1 = " +x);
                            }
                            int x = 100 ;
                            System.out.println("x2 = " +x);
                   }
          }

6acf08bc01fd40febce17cf566779f71.png

       4.3 构造代码块


               构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。


class Student {
    //成员变量
    private String name;
    private String gender;
    private int age;
    private double score;
    public  Studenet(){
        System.out.println("Student()");
    }
        //实例代码块
    {
        this.name="zhangsan";
        this.age=15;
        this.gender="nan";
        System.out.println("实例");
    }
    public void show(){
        System.out.println(this.name+" "+this.age+" "+this.gender);
    }
}
public class fangfakuai {
    public static void main(String[] args) {
        Student stu1=new Student();
        stu1.show();
    }

eea78bbe69fd441e9d10dd5d9fc76763.pngd0fdd46ef12f4548a611a68766f57e7f.png



       4.4 静态代码块


               使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

class Student {
            //成员变量
            private String name;
            private String gender;
            private int age;
            private double score;
            private static String classRoom;
            public  Student(){
                System.out.println("Student()");
            }
            //实例代码块
            {
                this.name="zhangsan";
                this.age=15;
                this.gender="nan";
                System.out.println("实例代码块");
            }
                //静态代码块
                static {
                classRoom="bit110";
                System.out.println("静态代码块");
                System.out.println("======");
            }
            public void show(){
                System.out.println(this.name+" "+this.age+" "+this.gender);
            }
        }
        public class TextStudent {
            public static void main(String[] args) {
                Student stu1=new Student();
                Student stu2=new Student();
            }

da506ce6944647c2b6dfad826e93b65d.png1e1546d9c09d49a8ada11cabd776bf1b.png


               注意:静态代码块不管生成多少个对象,其只会执行一次;静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的;如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行;实例代码块只有在创建对象时才会执行。

目录
相关文章
|
5天前
|
缓存 运维 Java
Java静态代码块深度剖析:机制、特性与最佳实践
在Java中,静态代码块(或称静态初始化块)是指类中定义的一个或多个`static { ... }`结构。其主要功能在于初始化类级别的数据,例如静态变量的初始化或执行仅需运行一次的初始化逻辑。
23 4
|
4天前
|
Java
java构造方法,构造代码块,静态代码块的执行顺序
本文介绍了Java中构造方法、构造代码块和静态代码块的执行顺序。静态代码块用`static`声明,在JVM加载类时执行一次;构造代码块在每次创建对象时执行,先于构造方法;构造方法用于对象初始化,创建对象时调用。示例代码展示了这三者的输出顺序,并解释了它们的区别和应用场景。
|
5月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
413 2
|
1月前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
2月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
159 15
|
2月前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
106 12
|
2月前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
38 15
|
4月前
|
Java
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
【Java入门提高篇】Day6 Java内部类——成员内部类
  内部类是什么,简单来说,就是定义在类内部的类(一本正经的说着废话)。   一个正经的内部类是长这样的: public class Outer { class Inner{ } }   这是为了演示而写的类,没有什么luan用,可以看到Inner类置于Outer类的内部。
924 0

热门文章

最新文章