【JavaSE】-- 类和对象(2)

文章目录

  • 6. 封装
    • 6.1 封装的概念
    • 6.2 访问限定符
    • 6.3 封装拓展之包
      • 6.3.1 包的概念
      • 6.3.2 导入包中的类
      • 6.3.3 自定义包
  • 7. static成员
    • 7.1 再谈学生类
    • 7.2 static修饰成员变量
    • 7.3 static修饰成员方法
    • 7.4 static成员变量初始化
  • 8. 代码块
    • 8.1 代码块概念以及分类
    • 8.2 普通代码块
    • 8.3 构造代码块
    • 8.4 静态代码块
  • 10. 对象的打印

6. 封装


6.1 封装的概念

对于面向对象的语言来说 有几个比较重要的特征:封装、继承、多态。
这里有一个误区:这三个特征不是哪个语言的特征,而是面向对象的特征。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互.

6.2 访问限定符

访问权限用来控制方法或者字段能否直接在类外使用

No范围privatedefaultprotectedpublic
1同一个包的同一类
2同一个包中的不同类
3不同包中的子类
4不同包中的非子类

【说明:】

  • protected主要是用在继承中
  • default权限指:什么都不写时的默认权限
  • 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。
class Student {private String name;private int age;private String stuNum;// get  和  set方法//当成员变量被private修饰了之后  该成员变量只能在同一个包中的同一个类中被访问// 提供get 和 set方法 供给访问public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getStuNum() {return stuNum;}public void setStuNum(String stuNum) {this.stuNum = stuNum;}//构造方法public Student(String name, int age, String stuNum) {this.name = name;this.age = age;this.stuNum = stuNum;}
}
public static void main(String[] args) {Student student = new Student("zhangsan", 11, "202320044118");System.out.println(student.getName());// zhangsan// System.out.println(student.name);//报错
}

6.3 封装拓展之包


6.3.1 包的概念

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。

包的本质就是一个 文件夹 ,可以理解为包就是为了组织类的; 在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

6.3.2 导入包中的类

Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用 java.util.Date 导入 java.util 这个包中的 Date类.

//导入一个包(方法1)
public static void main(String[] args) {java.util.Date date = new java.util.Date();// 得到一个毫秒级别的时间戳System.out.println(date.getTime());
}

但是这种写法比较麻烦一些, 可以使用 import语句导入包.

import java.util.Date;
// 或者写成
// import java.util.*;
// 但是这种写法并不推荐public class Test {public static void main(String[] args) {Date date = new Date();
// 得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}

更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.

import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错Date date = new Date();System.out.println(date.getTime());}
}
// 编译出错
Error:(5, 9) java:Date的引用不明确java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

在这里插入图片描述

6.3.3 自定义包

鼠标放在src上右键—new—package
在这里插入图片描述

包名采用小驼峰的写法,一般采用公司名的倒写形式(比如:com.baidu.www)

建完包之后 如果包名是一行的话:
在这里插入图片描述
打开文件路径:
在这里插入图片描述
在这里插入图片描述
src: 程序的默认包,程序在运行的时候默认是在Src这个包下面找可执行程序,去执行。

7. static成员


7.1 再谈学生类

public class Student {private String name;private int age;private String stuNum;private String classRoom;public Student(String name, int age, String stuNum, String classRoom) {this.name = name;this.age = age;this.stuNum = stuNum;this.classRoom = classRoom;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getStuNum() {return stuNum;}public void setStuNum(String stuNum) {this.stuNum = stuNum;}public String getClassRoom() {return classRoom;}public void setClassRoom(String classRoom) {this.classRoom = classRoom;}
}
public class Test {public static void main(String[] args) {Student student1 =new Student("zhansgan", 21, "551453666", "1103");Student student2 =new Student("lisi", 21, "1576632", "1103");Student student3 =new Student("wangwu", 21, "588556546565", "1103");}
}

实例化三个学生对象student1, student2, student3。每个对象都有自己特有的姓名、年龄、学号等信息。

假如这三个同学都是一个班的,那么他们一定在同一个教室上课。

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

7.2 static修饰成员变量

public class Student {private String name;private int age;private String stuNum;private static String classRoom;//...
}

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问(合法但是不合理😉),但一般更推荐使用类名访问.
  3. 类变量存储在方法区当中,所有的对象共享。
  4. 静态成员变量的生命周期伴随类的一生,当类被加载的时候 静态成员变量就被加载了;类的卸载而销毁。

题目: 下面一段程序的输出结果是多少?
在这里插入图片描述

输出12

不管new多少个对象,从始至终只有一个count ,不管是通过哪一个对象访问的, 都是在对同一个count进行操作的。

7.3 static修饰成员方法

一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?

public class TestStudent {public static void main(String[] args) {   System.out.println(Student.classRoom);}
}
// 编译失败:
// Error:(10, 35) java: classRoom 在 extend01.Student 中是 private 访问控制

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

public class Student{// ...private static String classRoom = "306";// ...public static String getClassRoom(){return classRoom;}
}
public class TestStudent {public static void main(String[] args) {System.out.println(Student.getClassRoom());}
}
输出:306

【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
public static String getClassRoom(){System.out.println(this);return classRoom;
}
// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom(){age += 1;return classRoom;
}
// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age
  1. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用.
public static String getClassRoom(){doClass();return classRoom;
}
// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()

在静态方法中,是不能访问普通的非静态成员变量和方法的 普通的非静态成员变量是依赖于对象的 要通过对象的引用去访问 而静态的成员方法是通过类名调用的 所以在通过类名调用静态方法时,是传不了this的,this是当前对象的引用,传不了this,我们就不知道当前对象是什么都不知道。
除非我们在这个静态方法中new一个对象,通过这个对象的引用去访问。
所以在static的成员方法中,是不存在this的。

  1. 静态方法无法重写, 不能用来实现多态。

  2. 在普通的成员方法里面可以调用静态得成员变量和成员方法。


在这里插入图片描述
age是被static修饰的,所以age是不依赖于对象的,age不是在person对象里面的age,age是属于类的。
person=null;代表person是不指向于任何对象的。


为什么在一个方法内部不能定义一个静态的成员变量。
在这里插入图片描述
定义时,加上static就是类变量,定义在方法里面就是局部变量了,它挺有脾气的,它不同意。

7.4 static成员变量初始化

注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性.

静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。

1. 就地初始化
就地初始化指的是:在定义时直接给出初始值

public class Student {private String name;private int age;private String stuNum;private static String classRoom = "106";//...
}

8. 代码块


8.1 代码块概念以及分类

使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:

  1. 普通代码块(不太能用的到)
  2. 非静态代码块(实例代码块/ 构造代码块)
  3. 静态代码块
  4. 同步代码块(后续线程部分)

8.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

这种用法较少见

8.3 构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化类里面非静态的数据成员。构造代码块定义在类的里面,方法的外面。

public class Student {private String name;private int age;private String stuNum;private static String classRoom = "106";//构造方法public Student(String name, int age, String stuNum, String classRoom) {this.name = name;this.age = age;this.stuNum = stuNum;this.classRoom = classRoom;System.out.println("构造方法被调用了....");}//构造代码块{this.age = 100;System.out.println("构造代码块被调用了....");}
}
public class Test {public static void main(String[] args) {Student student1 =new Student("zhansgan", 21, "551453666", "1103");}
}
输出结果:构造代码块被调用了....构造方法被调用了....

和定义顺序没有关系,一定是先执行构造代码块,再执行构造方法。

8.4 静态代码块

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

public class Student {private String name;private int age;private String stuNum;private static String classRoom = "106";public Student(String name, int age, String stuNum, String classRoom) {this.name = name;this.age = age;this.stuNum = stuNum;this.classRoom = classRoom;System.out.println("构造方法被调用了....");}{this.age = 100;System.out.println("构造代码块被调用了....");}static {classRoom = "415";System.out.println("static{}......");}
}
public static void main(String[] args) {Student student1 =new Student("zhansgan", 21, "551453666", "1103");
}
输出结果:static{}......构造代码块被调用了....构造方法被调用了....

执行顺序和定义顺序无关,执行顺序:静态代码块—>实例代码块—>构造方法。


public static void main(String[] args) {Student student1 =new Student("zhansgan", 21, "551453666", "1103");System.out.println("==============");Student student2 =new Student("lisi", 21, "1576632", "1103");
}
输出结果:static{}......构造代码块被调用了....构造方法被调用了....==============构造代码块被调用了....构造方法被调用了....

可以看到当我们实例化两个学生对象的时候,静态代码块只执行了一次。

注意事项:

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

静态代码块初识化静态数据成员,非静态代码块初始化非静态数据成员。

静态代码块中不会出现this.

10. 对象的打印

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class Test {public static void main(String[] args) {Student student = new Student("zhangsan", 20);System.out.println(student);}
}
输出结果:Student@3b07d329

在这里插入图片描述
归根结底,程序在最后调用了一个toString()

在这里插入图片描述

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

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

相关文章

关于优化活动页面的大尺寸图片的展示问题

背景 在处理一个对清晰度要求较高的页面时,由于可渲染的图片达到了3840 * 10k的分辨率,所以前端这边在接收到活动页面的图片会相当大(2MB起步的),然后就会出现一个图片缓慢从上到下渲染的过程动画,对于C端…

为电机一体化应用提供一种双通道集成电机驱动方案的电机驱动芯片-SS6811H

电机驱动芯片 - SS6811H为舞台灯光和其它电机一体化应用提供一种双通道集成电机驱动方案。SS6811H是一款双通道H桥驱动芯片;用PWM接口进行控制;具有两个独立的H桥驱动通道,每个H桥可提供较大输出电流1.6A (在24V和Ta 25C适当散热条件下)&…

【转型必看】Java到AI,程序员的逆袭秘籍!

随着技术的不断进步,人工智能(AI)已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域,如Java,转向人工智能领域,今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

神经网络(五):U2Net图像分割网络

文章目录 一、网络结构1.1第一种block结构1.2第二种block结构1.3特征图融合模块1.4损失函数1.5总体网络架构1.6代码汇总1.7普通残差块与RSU对比 二、代码复现 参考论文:U2-Net: Going deeper with nested U-structure for salient object detection   这篇文章基于…

网站建设完成后,国家为什么要求域名备案后才能上线

网站建设完成后,域名备案后才能上线的原因有很多。以下是对这些原因的详细分析: 维护国家互联网安全:备案制度有助于防范网络恐怖分子利用国内网站发布恐怖言论和宣传恐怖活动,从而保护国家的互联网安全。保护用户合法权益&#…

虚拟实训室建设需要投入哪些设备?实际效果如何?

随着虚拟现实技术的飞速发展,虚拟现实实训室作为现代教学的重要组成部分,正逐步成为提升教学质量和学生实践能力的重要手段。本文将从虚拟现实实训室建设所需的软硬件设备投入以及实际效果两个方面进行探讨。 软、硬件设备投入 硬件设备方面,…

Linux高级IO之五种IO模型

文章目录 Linux高级IO之五种IO模型IO的理解阻塞式IO非阻塞IO信号驱动式IOIO多路转接异步IO同步和异步 Linux高级IO之五种IO模型 IO的理解 IO模型其实更像是网络部分的延伸和拓展,在学习完计算机网络之后,结合Linux系统,我们就该认识到&…

[数据库实验三]安全性

目录 一、实验目的与要求: 二、实验内容: 三、实验小结 一、实验目的与要求: 1、设计用户子模式 2、根据实际需要创建用户角色及用户,并授权 3、针对不同级别的用户定义不同的视图,以保证系统的安全性 二、实验内…

SAP ABAP ‘‘ 和 `` 的区别

DATA(LV_01) 100. DATA(LV_02) 200.’ ’ 输出为 Char 输出为 String 如下直接定义赋值就会报错 DATA ls_value TYPE TABLE OF string. *ls_value VALUE #( ( A ) ). "报错行 ls_value VALUE #( ( A ) ).使用的场景:动态SQL取数 DATA OPTION TYPE STRI…

生成速度更快!AI绘画工具新版 SD WebUI Forge 保姆级安装教程,更低的显存更快的生成速度!

大家好,我是程序员晓晓 不知道平时经常使用 SD WebUI 的小伙伴发现没有,随着安装插件和模型越来越多,WebUI 时不时会出现卡顿或爆显存的情况,尤其在低显存的硬件上更加明显,只能不停的重启来解决。 估计是 WebUI 的作…

进击J8:Inception v1算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 了解并学习图2中的卷积层运算量的计算过程了解并学习卷积层的并行结构与1x1卷积核部分内容(重点)尝试根据模…

基于 Redis 实现滑动窗口的限流

⏳ 限流场景:突发流量,恶意流量,业务本身需要 基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库,具有高性能和支持原子操作的特点,非常适合用来实现限流功能。下面是一个使用 Redis 实现…

浅拷贝和深拷贝(Java 与 JavaScript)

一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…

海外媒体投稿:提高效果的6个国内外媒体套餐内容方法

媒体推广已经成为每个企业形象宣传产品与服务关键方式之一。国内外媒体套餐内容推广方法提供了许多有效的办法,助力企业能够更好地推广自己的产品。下面我们就详细介绍这其中的6个方法,以帮助提升推广效果。 1.明确目标群体和产品定位在制订推广策略以前…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》例10-9

灰度共生矩阵的相关性 相关性(Correlation) 公式 Correlation ∑ i 1 N g ∑ j 1 N g ( i − μ x ) ( j − μ y ) P ( i , j ) σ x σ y \text{Correlation} \frac{\sum_{i1}^{N_g} \sum_{j1}^{N_g} (i - \mu_x)(j - \mu_y) P(i,j)}{\sigma_x \…

HTML【知识改变命运】02标签/元素说明

html 的标签/元素-说明 1:说明2&#xff1a;标签的使用注意点 1:说明 1&#xff1a;html标签在<>中 2&#xff1a;html标签一般是双标签&#xff0c;如起始标签 结束标签 3&#xff1a;html也有单标签&#xff0c;如 4&#xff1a;双标签之间的文本内容就是html的元素内…

开发微信记账本小程序之技术要点记录

我喜欢极简风格&#xff0c;所以我搭建了这款微信记账本小程序。在开发微信记账本小程序过程中&#xff0c;有一些值得关注的技术要点&#xff0c;我则简而记之。 1、空态界面 在没有数据时&#xff0c;我设计了空状态时的占位提示。 在框架中&#xff0c;我使用了 wx:if&qu…

C++安全密码生成与强度检测

目标 密码生成 // Function to generate a random password std::string generatePassword(int length, bool includeUpper, bool includeNumbers, bool includeSymbols) {std::string lower "abcdefghijklmnopqrstuvwxyz";std::string upper "ABCDEFGHIJKLM…

IP地址的打卡路径是什么?

众多周知&#xff0c;IP地址使我们浏览网站的“必需品”&#xff0c;他会在我们进行网络活动时起到通关文牒一般的作用。那么&#xff0c;放我们进行网络活动时&#xff0c;我们的“通关文牒”上面会在哪些地点留下痕迹&#xff0c;IP地址的流转路径是什么&#xff1f; 第一关…

企业如何选择合适的半导体设计小企业软件

在半导体行业日益精细化与智能化的今天&#xff0c;企业选择合适的半导体设计小企业软件&#xff0c;已成为提升研发效率、缩短产品上市周期、增强市场竞争力的关键。面对市场上琳琅满目的软件产品&#xff0c;企业需从多方面考量&#xff0c;以确保所选软件既能满足当前需求&a…