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加载类时开辟空间并初始化的;如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行;实例代码块只有在创建对象时才会执行。

目录
相关文章
|
27天前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
|
9天前
|
Java
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
29天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
20 3
|
1月前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
43 1
|
2月前
|
安全 Java 数据安全/隐私保护
Java 封装怎么理解
封装是Java中的一种重要机制,它将对象的状态(数据)和行为(方法)打包在一起并控制外部访问权限,以保护数据不被随意修改。封装的主要目的包括数据保护、接口设计和增强模块性。通过使用`private`、`protected`及`public`等访问控制修饰符,结合getter和setter方法,可以有效隐藏对象内部实现细节。下面是一个简单的`BankAccount`类示例,展示了如何通过封装保护类的内部状态,确保数据安全和一致性,简化类的使用。理解封装有助于编写高质量代码和设计优秀程序架构。
|
2月前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
16 1
|
2月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
30 10
|
2月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2月前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。