第九节:类和对象【三】【static、代码块、对象的打印】

news2024/11/24 20:15:10

目录

🥇1.什么是封装

📘1.1封装的实现

🎒2.static成员

📒2.1 再谈学生类

​编辑

📗2.2 static修饰成员变量

2.3 static修饰成员方法

📕2.4 static成员变量初始化

🔲3. 代码块

📙3.1 代码块概念以及分类

📒3.2 普通代码块

📘3.3 构造代码块

📗3.4 静态代码块

📁4. 对象的打印


🌈上节课的封装我们学习了封装,让我们来回忆一下什么是封装!

🥇1.什么是封装

✅对类的细节进行隐藏,提供功能公开的接口来进行和数据进行交互!!

📘1.1封装的实现

class Person {
    private String name;
    public int age;

    private void eat() {
        System.out.println("吃饭!");
    }

    public void show() {
        System.out.println(name+" "+age);
    }
}

public class Tesk {
    public static void main(String[] args) {
        Person person = new Person();
        /*person.name = "zhangsan";
        person.eat();*/ //error
    }

}

🔺name 、eat这两个方法都已经被封装起来了 ,使用private关键字进行了封装。此时,name的权限就变小了。他只能在当前类当中才能访问

❗❗❗特别注意:

public----------哪里都可以访问

default---------包访问权限

private---------当前类中才能访问

🎒2.static成员

📒2.1 再谈学生类

class Student {
    private String name;
    private int age;
    private String classRoom; //上课的教室

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public  void doClass() {
        System.out.println("上课!");
    }
}

public class Tesk2 {
    public static void main(String[] args) {
        Student student1 = new Student("xiaowen", 10);
        Student student2 = new Student("xiaowen1", 20);
        Student student3 = new Student("xiaowen2", 15);
        System.out.println("fsfa");

    }
}

🙈假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,就没必要每次都写出来,只需要一次即可

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

那么就可以修改代码:

private String classRoom;--------->private static String classRoom = "107java直播间";

 ➡️现在就不显示classroom了,那么classroom就在方法区。

📗2.2 static修饰成员变量

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

class Student {
    public String name;
    public int age;
    public static String classRoom = "107java直播间"; //上课的教室

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public  void doClass() {
        System.out.println("上课!");
    }
}

✨当我们在输出的时候:

public static void main(String[] args) {
        System.out.println(Student.classRoom);
    }

静态的成员变量不属于对象,所以不用通过对象的引用来访问,直接可以通过类名就可以访问的

🔺 【静态成员变量特性】
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生 ( 即:随类的加载而创建,随类的卸载而销毁 )

📜此时我们举一个极端的例子:

public static void main(String[] args) {
        Student student1 = null;
        System.out.println(Student.name);
    }

此时这个代码就会空指针异常,student1不指向任何对象。但是name属于student这个对象的,就会产生空指针异常

✅修改为:

public static void main(String[] args) {
        Student student1 = null;
        //System.out.println(Student.name);
        System.out.println(Student.classRoom);
    }

因为classroom不属于任何对象,它的调用是通过类名来调用的。虽然引用等于null,无所谓,因为在类名调用的时候 . 前面其实就是一个类型,它的类型也是student。

2.3 static修饰成员方法

➡️成员方法:静态成员方法/类方法、非静态成员方法

    //非静态成员方法
    public  void doClass() {
        System.out.println("上课!");
    }
    //静态成员方法
    public static void func() {
        System.out.println("staticFunc()");
    }

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

public class Tesk2 {

    public static void main(String[] args) {
        Student.func();
    }
}

1️⃣在静态方法内部,不能直接调用非静态的成员方法

public class Tesk2 {
    public void mainStaticFunc() {

    }

    public static void main(String[] args) {
        mainStaticFunc();
    }
}

 

✅如果想要调用非静态方法: 依赖于对象的引用

public class Tesk2 {
    public void mainStaticFunc() {
    }

    public static void main(String[] args) {
        Tesk2 tesk2 = new Tesk2();
        tesk2.mainStaticFunc();
    }
}

 2️⃣在静态方法内部,不能够直接使用非静态的数据成员(静态方法里边是不能调用this的)

    //静态成员方法
    public static void func() {
        System.out.println(this.name);//error
        System.out.println(name);//error
    }

只要是非静态的数据成员,都需要通过对象的引用才能调用

    public static void func() {
        Student student = new Student("BIT",18);
        System.out.println(student.name);
    }

在普通的成员方法内部是可以调用静态方法的

class Student {
    //非静态成员方法
    public void doClass() {
        func();
    }
}

public class Tesk2 {
    public static void main(String[] args) {
        Student.func();

    }
}
👉总结:
🔺 静态方法特性
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名 . 静态方法名 (...) 方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有 this 参数,在静态方法中调用时候无法传递 this 引用

🌈建议:获取静态的成员变量或者是设置静态的成员变量,此时的方法最好是静态的,否则你要是非静态的,必须要实例化对象

📕2.4 static成员变量初始化

📖静态成员变量的初始化分为:

1️⃣就地初始化:在定义时直接给出初始值

public static String classRoom = "107java直播间";

2️⃣默认初始化

3️⃣可以通过提供get和set方法来进行初始化

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

 4️⃣通过代码块进行赋值继续往后看 :) ~~~

🔲3. 代码块

📙3.1 代码块概念以及分类

使用 {} 定义的一段代码称为代码块 。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块(非静态代码块/实例化代码块)
静态块
同步代码块(后续讲解多线程部分再谈)

📒3.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);
    }
}
// 执行结果
x1 = 10
x2 = 100

📘3.3 构造代码块

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

class Student {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("带有两个参数的构造代码块!");
    }

    //实例代码块
    {
        name = "caocao";
        System.out.println("构造代码块/非静态代码块/实例化代码块!->初始化非静态的数据成员");
    }
    
}

public class Tesk2 {

    public static void main(String[] args) {
        Student student1 = new Student("xiaowen", 10);
        System.out.println(student1.name);
    }
}

 1️⃣由此代码可知:在调用构造方法之前,先执行的是实例代码块(非静态代码块)

由于在调用构造方法之前,先执行的是实例代码块,则最后打印不是caocao,而是xiaowen 

可以简单认为,编译器编译好代码之后,会把非静态代码块拷贝到构造代码块的最前面

2️⃣如果都是非静态的,那么看定义的顺序。谁在前,最后就是哪个值

📗3.4 静态代码块

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

class Student {
    public String name;
    public int age;
    public static String classRoom = "107java直播间"; //上课的教室


    //实例代码块
    {
        name = "caocao";
        System.out.println("构造代码块/非静态代码块/实例化代码块!->初始化非静态的数据成员");
    }
    //静待代码块
    static {
        System.out.println("静态代码块--》初始化静态数据成员/ 提前准备一些数据");
    }

    //构造方法
    public Student() {
        System.out.println("不带参数的构造方法!");
    }

}

public class Tesk2 {
    public static void main(String[] args) {
        Student student1 = new Student();
    }

 静态代码块先执行(大的角度--------先执行静态代码块、再执行非静态代码块、最后执行构造方法)

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

📁4. 对象的打印

public class Tesk {
    public static void main(String[] args) {
        Person person = new Person("zhangsan",10);
        person.setName("gaobo");
        System.out.println(person.getName());
        person.show();
        /*person.name = "zhangsan";
        person.eat();*/ //error
    }

}

public class Person {
    String name;
    String gender;
    int age;
    public Person(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    public static void main(String[] args) {
        Person person = new Person("Jim","男", 18);
        System.out.println(person);
    }
}

// 打印结果:day20210829.Person@1b6d3586

➡️如果想要默认打印对象中的属性该如何处理呢?答案:重写toString方法即可。

public class Person {
    String name;
    String gender;
    int age;
    public Person(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    @Override
    public String toString() {
        return "[" + name + "," + gender + "," + age + "]";
    }
    public static void main(String[] args) {
        Person person = new Person("Jim","男", 18);
        System.out.println(person);
    }
}
// 输出结果:[Jim,男,18]

✨总结:

对于你想输出一个对象的引用的值的时候,如果你没有自己写一个toS挺方法,那么就会调用Object这个类的方法。

如果自己写了,就会调用自己的!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四届全国中医药院校大学生程序设计竞赛 : 二进制码(Python)

文章目录题目描述输入输出样例输入 Copy样例输出 Copy代码测试题目描述 在计算机中,对于定点数有三种不同的表示方法。在本题中,假定码的长度固定为 8 位,从左往右依次编号为第 1 到 8 位,第 1 位为最高位。 x 的原码&#xff1a…

Python爬虫实战(七):某讯较真辟谣小程序爬虫

追风赶月莫停留,平芜尽处是春山。 文章目录追风赶月莫停留,平芜尽处是春山。一、准备工作二、目标分析二、接口分析url分析返回数据分析三、编写代码获取数据保存数据完整代码大四考研狗没时间更新博客了,大家勿怪,等我有学上了&a…

手把手带你搭建个人博客系统(二)

⭐️前言⭐️ 因文章篇幅较长,所以整个流程分两篇文章来完成。 🍉博客主页: 🍁【如风暖阳】🍁 🍉精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、【数据结构】 🍉欢迎点赞…

Matplotlib设置限制制作

Matplotlib自动到达要沿着图的x,y(以及3D图的情况下为z轴)轴显示的变量的最小值和最大值。但是,可以使用set_xlim()和set_ylim()函数显式设置限制。 在下图中,显示了x和y轴的自动缩放限制 - #! /usr/bin/env python #codingutf-8 import matp…

【关于Linux中----进程控制和进程替换】

文章目录一、进程创建二、进程终止2.1进程退出场景2.2进程退出方法三、进程等待3.1进程等待必要性3.2进程等待的方法3.3获取子进程status四、进程程序替换4.1替换原理4.2替换函数4.3命名理解五、总结一、进程创建 谈到创建进程,不得不提到一个函数----fork。 在li…

【Python】一个矩阵根据某一列选择大于或小于范围的数据

data_all data_all[data_all[:,3]>54201]data_all data_all[data_all[:, 3] < 54220] 上面就是根据数据的第3列&#xff0c;选取54201到54220的范围的数据&#xff1a;

单片机最小系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统. 对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路. 下面给出一个51单片机的最小系统电路图. 晶振电路&#xff1a; 单片机里都有晶振&#xff0c;在单片机系统里晶振作用…

2013年第四届C/C++ A组蓝桥杯省赛真题+解析+代码

目录 第一题&#xff1a;高斯日记 题目描述 思路分析 AC代码 第二题&#xff1a;排它平方数 题目描述 思路分析 AC代码 第三题&#xff1a;振兴中华 题目描述 思路分析 AC代码 第四题&#xff1a;颠倒的价牌 题目描述 思路分析 AC代码 第五题&#xff1a;前缀…

jsp就业管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 就业管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

蓝桥杯备赛(三)

目录 前言&#xff1a; 一、门牌制作 解析&#xff1a; 代码实现 二、寻找2020 解析&#xff1a; 代码实现 三、蛇形填数 解析&#xff1a; 代码实现 四、成绩分析 解析&#xff1a; 代码实现 五、单词分析 解析&#xff1a; 代码实现 小结&#xff1a; 前言&am…

热门Java开发工具IDEA入门指南——了解并学习IDE

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 本…

面试了1个月连续失败4次,自动化测试真没想象的那么简单

我干测试6年了&#xff0c;最近面试又碰壁了… 这大概是我这一个月来第4次面试失败了&#xff0c;起初我投简历比较勇猛&#xff0c;奔着薪资高的有点儿名气的企业就开始海投&#xff0c;碰上了2家还不错的邀约面试&#xff0c;前面交流还行&#xff0c;一问到自动化测试就傻眼…

怎么进行视频恢复?推荐使用这4种方法

电脑视频怎么恢复&#xff1f;很多朋友在使用电脑的过程中&#xff0c;如果系统或者是存储文件出现问题的话&#xff0c;可能会出现视频丢失的情况。因为在使用电脑运行视频软件时&#xff0c;系统或者存储文件存在一些质量问题从而导致视频丢失。那么想要进行视频恢复&#xf…

【Leetcode】拿捏链表(一)——206.反转链表、203.移除链表元素

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 206.反转链表 203.移除链表元素 206.反转链表 力扣https://leetcode…

“工程化”对于大型数据平台而言,意味着什么?StartDT Hackathon来了

日前&#xff0c;2022 第三季 StartDT Hackathon 正式落下帷幕&#xff0c;以“产品工程化与可扩展性提升”为主题&#xff0c;主攻数据云这个“庞然大物”的工程化难题。 本届黑客松共吸引到 9 组参赛&#xff0c;均在 72 小时内完成项目并提测通过。有“单排孤勇者”&#x…

.NET JIT

定义 即时编译器 (JIT) 是 .NET 中公共语言运行时 (CLR) 的一部分&#xff0c;它负责管理 .NET 程序的执行&#xff0c;而与任何 .NET 编程语言无关。 工作流 特定于语言的编译器将源代码转换为中间语言。 然后&#xff0c;这种中间语言由即时 (JIT) 编译器转换为机器代码。 …

一篇文章学会React

React基础 文章目录React基础React介绍React特点React基本使用安装使用React脚手架&#xff08;***&#xff09;生成的项目的目录结构src下的index.js入口文件介绍脚手架中使用ReactJSX什么是JSX产生原因介绍JSX概述JSX语法注意事项JSX语法原理JSX学习声明式渲染条件渲染循环渲…

YOLOX改进

这是yolox的第2季了 如何设计在 mAP 和延迟方面表现良好的单级轻量级检测器&#xff1f;新型的单阶段轻量检测器和各种操作的准确性和延迟。此基础上分别提出了GPU和CPU的最佳操作和架构。一份YOLOX改进的实验报告&#xff1a;如何设计性能优异的单阶段轻量级目标检测器 论文…

Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)

需要全部源码或者图片集请点赞关注收藏后评论区留言~~~ 一、视图的构造方法 Android自带的控件往往外观欠佳&#xff0c;开发者常常需要修改某些属性&#xff0c;比如按钮控件Button就有好几个问题&#xff0c;其一字号太小&#xff0c;其二文字颜色太浅&#xff0c;其三字母默…

表白爱心代码

文章目录一、演示&#xff08;python版&#xff09;代码二、演示&#xff08;html版&#xff09;代码一、演示&#xff08;python版&#xff09; 代码 # 在等一句我愿意 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽…