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编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
11天前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
41 0
|
11天前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
22 0
|
存储 Java 数据库
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
92 1
|
Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
74 1
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
|
存储 Java 编译器
【Java SE】static成员及代码块
【Java SE】static成员及代码块
【Java SE】static成员及代码块
|
存储 Java
Java之static成员与代码块
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
139 0
Java之static成员与代码块
|
存储 设计模式 安全
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
《Java核心技术》java中的{},static{}的代码块
static{...}是静态块,而只有{...}的是叫做构造块。 静态块在一个程序里面只执行一次; 而构造块只要建立一个对象,构造代码块都会执行一次。 静态块优先于主方法的执行,静态块优先于构造快,然后是构造方法的执行,而且只执行一次! ...
779 0
|
2月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
198 60
【Java并发】【线程池】带你从0-1入门线程池