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

目录
相关文章
|
17天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
23天前
|
安全 Java 数据安全/隐私保护
|
23天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
3天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
6 2
|
3天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
4天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
32 2
|
5天前
|
Java
Java基础之对象的引用
Java基础之对象的引用
6 0
|
9天前
|
Java
Java中如何克隆一个对象?
【4月更文挑战第13天】
15 0
|
11天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
15天前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
47 0
对象的交响曲:深入理解Java面向对象的绝妙之处