初识Java 1-1 面向对象的语言

news2024/11/26 12:30:02

目录

引用的作用

数据的储存

常见的数据储存方式

特殊储存的基本类型

数组

销毁对象

基本类型的作用域

对象的作用域

创建新类型 - class关键字

方法、参数和返回值

参数列表

编写程序

名称可见性

使用组件

static关键字

Java程序

编程风格(驼峰式命名法)


 

本笔记参考自: 《On Java 中文版》


        不同于C++的向后兼容,Java的设计预期就是编写面向对象的程序。因此,在进行程序的编写之前,我们需要先熟悉面向对象的知识。

引用的作用

        在编程中,我们往往需要通过内存来处理各种元素,比如C/C++使用指针进行间接的内存操作。而Java将一切视为对象,通过对象来进行内存的操作。虽然如此,但在实际操作中,我们会使用到的其实是该对象的引用

        例如,如果我们想要储存一句话,我们就会需要使用到一个String类型的引用:

String s;

        上述的语句并没有创建一个对象,而是创建了一个引用。此时还不能向 s 发送信息,因为这个引用还没有连接任何对象。比较安全的做法是在创建引用时对其进行初始化:

String s = "初始化的内容";

        这就是引用的作用:关联对象。另外,上述这种初始化的方式(使用带引号的文本)是String类独有的,创建、初始化对象更常用的方式是使用new关键字:

String s = new String("初始化的内容");

    除去Java的预置类型,我们也可以手动进行新类型的创建。

数据的储存

常见的数据储存方式

数据储存方式特点
寄存器速度最快的数据储存方式,将数据直接保存在中央处理器中。(在Java中,寄存器无法由程序员进行分配)
效率仅次于寄存器。不过Java要求明确所以栈上对象的生命周期,这在一定程度上限制了其的灵活性。多用于存放对象引用
用于存放所有的Java对象。编译器不关心堆上的对象的生命周期,所以堆的使用更为灵活。
常量存储常量通常直接保存在程序代码中,它们的值不会改变。(有时常量会与代码分开保存,此时常量可以保存在只读存储器中)
非RAM存储这种数据不保存在应用程序中,它们的生命周期不依赖于应用程序。通常,这种数据被保存在其他媒介中。

特殊储存的基本类型

        new关键字是在堆上创建对象,在面对一些简单的变量时,这种做法就显得不够高效。Java的做法是创建“自动变量”,这种变量会直接储存在栈上面,运行效率较高。

    Java定义了每一种基本类型占用的空间大小,这种规定的一致性也给予了Java更好的可移植性。

        当然,如果遇到要在堆上开辟基本类型对象的情况,Java也提供了对应的“包装类”。通过包装类,可以把基本类型转变为位于堆上的非原始对象:

// 将基本类型转变为对应的包装类对象
char c = 'x';
Cahracter ch = new Character(c);

// 直接使用包装类进行初始化
Character ch = new Character('x');

// Java的“自动装箱”机制,能够将基本类型自动转换为包装类对象
Character ch = 'x';

        反过来,将对象转变为基本类型也是可以的:

char c = ch;

    Java提供了两个类来支持高精度计算,分别是BigIntegerBigDecimal。这两个类都没有对应的基本类型。


数组

        和许多的编程语言一样,Java也支持数组。但不同于C和C++中数组就是内存块的概念,Java对数组的要求更加严格,也更加安全。在Java中,数组有以下特征:

  1. 一定被初始化;
  2. 无法访问数组边界之外的元素。

    这使得Java的数组拥有更大的代价,但从安全性等角度来看,这是值得的。

        和之前提到的概念相吻合,Java的数组实际上还是存放着引用。Java会将这些引用初始化成特殊值:null,以防止某些数组问题的出现。(如果一个数组用来被放置基本类型,那么这些元素的初识值将会是0)
 

销毁对象

        在C和C++中,对象需要手动销毁,由程序员来回收内存,这会导致一些难以发觉的问题。而Java对内存的自动释放也在这一层面上帮助程序员分担了压力。

基本类型的作用域

||| 作用域的概念:作用域会决定其范围内定义的变量名的可见性和生命周期。

        Java通过大括号({ })来定义作用域的范围,如下所示:

{
    int a = 12;    
    // 此时只有变量a是存在并且可以使用的
    {
        int b = 100;    
        // 此时a、b都存在
    }
    // 此时超出了b的作用域,只有a存在
}

        但值得注意的是,Java不会运行在外围数据域中“隐藏”变量,这被认为是会引发歧义的:

{
    int x = 10;
    {
        int x = 20;    // 出现语法错误
    }
}

对象的作用域

        与基本类型不同,在Java中,若使用new关键字进行对象的创建,该对象在作用域结束后仍会存在(但是作为连接的引用却会消失):

{
    String s = new String("内容");
}// 作用域结束,s被销毁

        当作用域结束时,引用s会被销毁,但其连接的对象仍会占用一块内存。此时已经无法再次使用这一占用内存的对象,因为唯一的引用s已经离开了它的作用域。这一情况如果发生在C和C++中,无疑是令人头疼的。但Java会通过自带的垃圾收集器监视所有对象,并及时销毁无用对象。这就解决了“内存泄漏”这一严重的编程问题。


创建新类型 - class关键字

        大多数的面向对象编程语言会使用“class”关键字来描述新类型,其用法如下:

class AtypeName{
    // 类的具体实现
}

        在创建了一个新类型后,我们就可以通过new关键字创建一个该类的对象:

AtypeName a = new AtypeName();

        当然,上述的类还缺少很多东西,这些都需要程序员进行补齐。一个类可以有两种元素,分别为:字段(数据成员)和方法(成员函数)。我们使用引用,就是与其中的字段进行互动。

    也有一些字段是某一对象的引用,此时也需要使用new关键字对这一引用进行初始化。

        一般来说,对象都会单独保存其字段,不同对象的字段之间不会共享:

class DataOnly{
    int i;
    double d;
    boolean b;
}

        上述代码定义的类只有数据字段,当我们为这一类创建了一个对象后,就可以通过对象成员为字段赋值(引用与字段之间使用“.”进行连接):

//创建对象
DataOnly data = new DataOnly();

//通过对象的引用名进行字段赋值
data.i = 10;
data.d = 1.1;
data.b = false;

类中的默认值

        若一个类的某一字段是基本类型,那么这一字段就会默认被初始化(这一机制只适用于当变量作为类的成员存在时)。这种默认值不一定合理,所以最好的方式还是显式地初始化。

    除此之外,局部变量并不会被这样初始化,此时需要程序员为其赋值。若没有进行赋值,Java就会进行报错。

方法、参数和返回值

        在C和C++中,“函数”用于表示子程序。但Java没有这一概念,取而代之的是“方法”,即“做某件事的方式”。方法有四个最基础的部分:方法名、参数、返回值和方法体,例如:

ReturnType methodName(/* 参数列表 */){
    // 方法体
}

其中:

  • 返回值:表示当调用该方法时,该方法生成的值是什么类型;
  • 参数列表:提供需要传递给方法的信息(类型和名称);
  • 方法名和参数列表共同构成了“方法签名”(该方法的唯一标识符)。

    在Java中,方法只能作为类的一部分存在,且只能通过对象进行调用。

        调用对象方法和调用字段类似,都是通过“.”进行,不同的是调用方法时还需要写明参数列表:

objectReference.methodName(arg1, arg2, arg3);

参数列表

        参数列表负责描述传递给方法的信息,和Java的其他部分一样,这些被传递的信息也是对象。因此,在进行传参的时候,也会需要描述这些对象的类型和对象名。因为实际被操作的是对象的引用,所以引用的类型就必须正确——传入的对象类型必须与方法定义的参数类型一致。

int f(String s){
    return s.length * 2;
}

        return关键字使方法结束,并且将方法产生的值进行返回,该值的类型也必须与返回值的类型相一致。

编写程序

名称可见性

        为了方便区分不同模块的相同名称,C++引入了命名空间的概念。而Java则另辟蹊径,设计者将互联网域名反转使用(域名是唯一的),以此保证冲突不会发生。举个例子:若域名是xxx.com,那么abc库的名称就是com.xxx.utility.abc。其中的“.”用来分隔域名(其中,utility指Java的实用工具包)。

    通过上述的这种方式,Java为文件中的每一个类生成了唯一对应的标识符,而由于一些历史原因,包名都是小写字母。

        通过关联命名空间和反转的URL生成文件路径存在一个缺点,那就是冗长的文件夹路径。还是上面的例子:若我需要使用com.xxx.utility.abc这一命名空间,我就需要创建com和xxx的空文件夹。在一些更大的工程中,这些路径也被用于保存一些表明文件夹内容的数据,而为了管理这些套娃式的代码,使用好的IDE是一个不错的选择。


使用组件

        编译器无法自动找到存放在其他文件中的类,最简单的理由是一个类可能存在许多不同的定义。为此,就需要使用import关键字:import关键字的作用就是通知编译器导入一个指定位置的包(即放置了各种类的库)。

        若使用的是编译器自带的各种Java标准库组件,就不需要考虑那些冗长的域名,而可以这样直接使用:

import java.util.ArrayList;    //使用位于util库的ArrayList类

        或者使用通配符“*”引入util库中的所有类:

import java.util.*;

    但每一个被用到的类最好应该被单独引入。


static关键字

        若我们需要使用一个对象,一般需要先使用new关键字为对象分配内存,然后才能使用其的方法。但这并没有办法很好地处理下面两种情况:

  1. 需要通过一块共享空间保存特定字段;
  2. 即便没有生成对应的对象,也希望可以使用其中的某些方法。

        为此,Java使用了static关键字,带有static的方法或者字段不会依赖于任何对象(当然,我们无法通过static对象调用非static成员或方法)。这些只服务于类的数据或方法也被称为“类数据”和“类方法”。创建并初始化一个static字段的例子如下:

class StaticTest{
    static int i = 0;
}

        就算存在两个StaticTest的对象,StaticTest.i也只会占据一块内存空间。这意味着字段i会被两个对象共享

        通过类名和引用名都可以调用static成员,例如:

//使用类名进行static字段的调用
StaticTest.i++;

//使用引用名进行static字段的调用
StaticTest t = new StaticTest();
t.i++;

    一般更推荐使用类名调用static方法。

        同理,也可以这样调用static方法,例如:

class Test {
    static void f() {
        StaticTest.i++;
    }
}

//通过类名调用static方法
Test.f();

        static关键字的使用会改变数据生成的方式:static字段基于类进行创建,而非static字段是基于对象创建的。

Java程序

        这是一个完整的Java程序,该程序打印了一串字符串,和通过Java标准库的Date类生成的日期:

import java.util.*;                //使用import引入额外的类

public class HelloWorld {
    public static void main(String[] args) {
        System.out.printf("Hello world, it's: ");    //打印字符串
        System.out.println(new Date());              //打印Date类生成的日期
    }
}

    其中的out字段就是一个static PrintStream对象,因此它无需创建就可以直接使用。

        该代码的生成结果如下:

        每一个Java文件都会自动导入一个特定的库,即java.lang。而除此之外的类,就需要使用import关键字进行引入。上述程序中使用到的Date类就存在于util库中,因此我们需要在程序的开头进行util库的引入。

        注意:文件中必须要有一个与该文件同名的类。若这个文件是一个可以单独运行的文件,与文件同名的类中还需要有一个入口方法main(),其格式和返回值如下:

public static void main(String[] args) { //...

其中,public关键字表示该方法可以被外部程序所调用。main()的参数是一个String对象的数组,args参数是被要求强制传递的。

编译和运行

        若需要编译之前编写的程序(HelloWorld.java),首先需要打开该程序所在的目录,然后通过命令行输入:

javac HelloWorld.java

        若编译没有报错,则会生成一个HelloWorld.class文件,此时可以继续输入:

java HelloWorld

        通过这行命令就可以将程序的结果输出到控制台了。

编程风格(驼峰式命名法)

        “驼峰式命名法”要求:

  1. 类名:首字母要大写,若是类名包含多个词,则汇总所有词,并且每一个词的首字母都要大写,例如:
    class AllTheColorOfTheRainbow{ //...
  2. 其他内容(方法、字段和对象名等):首字母小写,其他的地方和类名一样,例如:
    class AllTheColorOfTheRainbow{ 
        int anTnterRepresentingColors;
        void changeTheHueOfTheColor(int newHue) {
            //...
        }
        //...
    }

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

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

相关文章

SAP从放弃到入门系列之abapGit更新与卸载

目录概览 概述一、更新1.1 独立版本1.2 开发者版本1.2.1 在线更新1.2.2 离线更新 1.3 更新版本常见问题 二、卸载abapGit 概述 我们就以更新abapGit为例,通过abapGit管理我们的代码其实操作时相似的,更新独立版本就有点像最原始的没有版本管理工具时的版本管理方式…

Elasticsearch中倒排索引、分词器、DSL语法使用介绍

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

研磨设计模式day14模板方法模式

目录 场景 原有逻辑 有何问题 解决方案 解决思路 代码实现 重写示例 模板方法的优缺点 模板方法的本质 何时选用 场景 现在模拟一个场景,两个人要登录一个系统,一个是管理员一个是用户,这两个不同身份的登录是由后端对应的两个接…

Metasploit“MSF”连接postgresql时因排序规则版本不匹配导致无法连接

一、问题 更新Kali之后使用Metasploit时出现一个问题,连接postgresql时因排序规则版本不匹配导致无法连接 警告: database "msf" has a collation version mismatch DETAIL: The database was created using collation version 2.36, but the operati…

SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)

目录 1. Druid连接池的功能2. 自定义版2.1 pom.xml添加依赖2.2 MyDataSourceConfig实现2.3 application.properties配置编写Controller进行测试2.4 druid监控页面查看 3. starter版3.1 pom.xml添加依赖3.2 自动配置分析3.3 使用application.properties对druid进行配置3.4 druid…

Git分支机制

一、分支机制简述 要想真正理解Git的分支机制,我们要首先回过头来看一下Git是如何存储数据的。 Git并没有采用多个变更集( changeset )或是差异的方式存储数据,而是采用一系列快照的方式。当你发起提交时,Git存储的是提交对象( commi…

无涯教程-机器学习 - 箱形图函数

Box和Whisker图(也简称为boxplots)是另一种有用的技术,可用于检查每个属性的分布情况。以下是此技术的特点- 它本质上是单变量的,总结了每个属性的分布。它为中间值(即中位数)画一条线。它将在25%和75%周围绘制一个框。它还会绘制…

ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红

a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景,都是后端返回html结构,前端直接渲染实现,但是如果需要前端处理的话,实现也是很简单的,接下来我直接上应用场景吧 应用场景就是通过关键…

mysql 存储引擎系列 (一) 基础知识

当前支持存储引擎 show engines; 显示默认存储引擎 select default_storage_engine; show variables like ‘%storage%’; 修改默认引擎 set default_storage_enginexxx 或 set default_storage_enginexxx; my.ini 或者 my.cnf ,需要重启 服务才能生效 systemctl …

什么事synchronized的升级

今天我们继续学习synchronized的升级过程,目前只剩下最后一步了:轻量级锁->重量级锁。 通过今天的内容,希望能帮助大家解答synchronized都问啥?中除锁粗化,锁消除以及Java 8对synchronized的优化外全部的问题。 获…

校招算法题实在不会做,有没有关系?

文章目录 前言一、校招二、时间复杂度1、单层循环2、双层循环 三、空间复杂度四、数据结构五、校招算法题实在不会做,有没有关系?六、英雄算法集训 前言 英雄算法联盟八月集训 已经接近尾声,九月算法集训将于 09月01日 正式开始,目…

【uniapp】this有时为啥打印的是undefined?(箭头函数修改this)

😉博主:初映CY的前说(前端领域) ,📒本文核心:uniapp中this指向问题 前言:this大家知道是我们当前项目的实例,我们可以在这个this上面拿到我们原型上的全部数据。这个常用在我们在方法中调用其他方法使用。 …

java-什么是 CAS( 比较并交换-乐观锁机制-锁自旋)

1.什么是 CAS( 比较并交换-乐观锁机制-锁自旋) 1.1. 概念及特性 CAS(Compare And Swap/Set)比较并交换,CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N)。V 表示要更新的变量(内存值),E 表示…

el-date-picker限制选择的时间范围

<el-date-pickersize="mini"v-model="dateTime"value-format="yyyy-MM-dd HH:mm:ss"type="datetimerange"range-separator="~"start-placeholder="开始日期"end-placeholder="结束日期":picker-opti…

零信任体系化能力建设(5):数据安全与控制跟踪

在数字化世界中&#xff0c;一切皆源于数据。无论任何时候、任何地方和任何环境&#xff0c;组织都需要保护数据免受未经授权的访问和泄露&#xff0c;确保核心资产和业务的连续性&#xff0c;并获得客户的信任和忠诚度。 然而&#xff0c;这些跨领域、相互交叉的数据来自于不…

探索昏暗光线下人脸检测,基于YOLOv5[n/s/m/l/x]全系列模型开发构建人脸检测系统,对比分析精度效果

昏暗光线下的目标检测是一个比较小众的场景&#xff0c;之前也有读过一些相关的论文&#xff0c;专门有论文基于这个场景去开发算法模型&#xff0c;目的就是基于这种特定的场景实现性能的提升&#xff0c;那么原生的模型在这种程度的数据下能有什么样的表现效果呢&#xff1f;…

ssm彩妆小样售卖商城源码和论文

ssm彩妆小样售卖商城源码和论文073 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&…

Studio One 6.2.0(音乐制作)

Studio One 6 是一款音乐制作软件&#xff0c;具有以下特色&#xff1a; 直观的用户界面&#xff1a;Studio One 6采用了现代化的设计&#xff0c;使得用户可以轻松地浏览和操作软件。它拥有直观的工作流程和易于使用的功能&#xff0c;适合初学者和专业人士。 多轨道录音和混…

从RocketMQ通信模块聊聊EpollEventLoopGroup和NioEventLoopGroup

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 最近在排查RocketMQ一个网络问题的时候&#xff0c;排查到了Netty相关的处理&#xff0c;然后看到了RocketMQ在构建workGroup的时候&#xff0c;发现了有如…

Java中word转Pdf工具类

背景&#xff1a; 最近做的一个项目中&#xff0c;对于word转Pdf用的地方很多&#xff0c;特此记录 搭建总图&#xff1a; 代码部分&#xff1a; 1.需要的jar包&#xff1a; aspose-words-15.8.0-jdk16.jar 注&#xff1a;下载好这个jar包后&#xff0c;在项目的根目录新建一…