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

目录
相关文章
|
28天前
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
52 11
|
7天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
7天前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
28天前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
105 15
|
28天前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
62 12
|
3月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
68 8
|
5月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
44 10
|
5月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
80 18
|
5月前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
39 4
|
6月前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。