JAVA学习小记(第二周)

类的无参方法

定义类的方法:

 

语法:返回修饰符 返回值类型 方法名(){

 

//具体实现方法的操作

 

}

 

比如:

 

public void sayHello(){

 

//具体实现方法的操作

 

System.out.println(“你好”);

 

}

 

1、访问修饰符(在哪些地方能够使用这个方法),public公共的,最高级别

 

返回值类型(执行完方法后能够得到什么数据)

void,表示没有返回值,也就是没有任何数据返回

如果有数据返回,那么就需要使用return关键字返回一个数据,并且返回的数据类型

和返回值的数据类型一致

方法名(),方法名表示方法的名字

方法体:具体实现方法的操作

编写类的方法步骤:

1、先定义方法的访问修饰符,先写没有返回值类型,定义方法名,方法名的命名采用见文识意的方式

2、定义方法体,也就是写具体实现方法的操作

3、判断方法是否有返回值,如果有,添加return关键字返回该数据,并修改返回值类型方法是怎么去实现,方法是怎么实现的只需要在定义方法的关心,使用的时候只要知道是哪一个方法是什么作用就可以了

方法的调用:

1、在同一个类调用同一类中的方法,只需要通过方法名()就可以指直接调用

2、在不同类中调用方法,需要先new一个需要调用方法的类的对象,然后通过对象名.方法名的方式去调用方法,调用方法的时候,实际上就是去执行方法体中的代码

注意:

1、返回值数据类型必须和返回值类型一致

2、不可以返回多个值,也不能写多个返回值类型

3、定义方法不能够相互嵌套

4、程序逻辑代码(顺序、选择、循环结构)只能写在方法体中

5.面向对象的编程:

类的方法实现某个特定的功能,其他类不需要知道它如何实现,只需要知道它是用来干什么的

6.全局变量:(成员变量)它是指定义在类中的变量,它在类中的任意位置都可以被识别,比如:

类的属性

(1)作用域:作用在类中任意位置

(2)初始值不同:如果没有给它赋值,系统会默认给它一个初始值,int类型为0,double为0.0,String为null

(3)在同一个类中不允许同名存在

7.局部变量:它是指定义在方法体中变量,它只能在该方法中被识别

(1)作用域:作用在定义该变量的方法体中

(2)初始值不同:必须给它赋值后才能去使用

类的有参方法

带参数的方法:

无参方法:在方法名()的括号中没有参数的方法

有参方法:在方法名()的括号中有参数的方法

定义有参方法的语法:

访问修饰符 返回值类型 方法名(参数1、参数2、参数3…参数n)

{

方法体(具体实现方法的过程)

}

 

参数:

实际就是声明的一个变量,声明的变量使用“,”隔开

在定义方法的时候,方法中的参数只是进行了声明,并没有赋值,这个参数就叫做形式参数,也就是形参;

在调用方法的时候,对方法中参数进行赋值,这个参数就叫作实际参数,也就是实参

调用带参数的方法:

同一类中调用同一类中的方法,直接方法名()调用

不同类中调用不同类中的方法,先new一个对象,再通过对象名.方法名()的方式调用必须和定义方法的参数个数相同,并且数据类型必须一致,顺序也要和定义的位置一致

二次传递:

在调用方法的时候,传递一个参数值给该方法,然后在该方法中去调用了另外的方法,

再将这个参数值传递给在该方法中调用的这个方法

F5:

单步跳入,遇到方法的时候回进入方法体中,逐方法体的代码一行一行的执行

F6:

单步跳过,遇到方法的时候直接执行完方法,获得结果,不进入方法体

对象数组:

就是自己定义的类型的数组

自己定义类型,如果没有new一个对象,那么它的初始就为null

对象数组的使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YW75Y-q5bCP546L5Y-t,size_20,color_FFFFFF,t_70,g_se,x_16

 

包:

在windows中以文件夹的方式存在

1)将类分为几个类似于文件夹的单元

2)防止命名冲突,在同一个包不允许重复命名,不同包可以重复

3)可以对类中数据中进行一个保护作用

声明包,语法:

package 包名; 必须为java源文件中第一条非注释语句

包名:

1、通常由小写的英文字母组成,不能以圆点开头或结尾

2、开头一般是一个顶级域名cn,com,org,net

3、后续部分一般由公司名称、部门名称、小组名称、项目名称

导入包:语法八、字符串

字符串:

就是一个或多个字符组成

声明字符串:

对象实例化

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YW75Y-q5bCP546L5Y-t,size_20,color_FFFFFF,t_70,g_se,x_16

 

1、直接声明

比如:String name = “张三”;

2、使用对象的方式

new一个String类的对象,

比如:String name = new String(“张三”);

对象的使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YW75Y-q5bCP546L5Y-t,size_20,color_FFFFFF,t_70,g_se,x_16

 

3.栈:

用来存储较小的数据,离访问位置比较近,比如:int,double,short。

堆:

用来存储较大的数据,离访问位置比较远,比如:String,数组,自己定义的类型

栈内存和堆内存的区别

在Java中,栈( stack)是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本类型(如int.float等)的变量、指令代码、常量及对象句柄(也就是对象的引用地址)。

栈内存的操作方式类似于数据结构中的栈(仅在表尾进行插入或删除操作的线性表)。栈的优势在于,它的存取速度比较快,仅次于寄存器,栈中的数据还可以共享。其缺点表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

堆(heap)是一个程序运行动态分配的内存区域,在Java中,构建对象时所需要的内存从堆中分配。这些对象通过new指令“显式”建立,放弃分配方式类似于数据结构中的链表。堆内存在使用完毕后,是由垃圾回收( Garbage Collection,简称GC)器“隐式”回收的。在这一一点上,是和C/C++是有显著不同的,在C/C++中,堆内存的分配和回收都是显式的,均由用户负责,如果用户申请了堆内存,而在使用后忘记释放,则会产生“内存溢出”问题一可 用内存存在,而其他用户却无法使用。堆的优势是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java 的垃圾收集器会自动收走这些不再使用的内存块。其缺点为,由于要在运行时才动态分配内存,相比于栈内存,它的存由于栈内存比较小,如果栈内存不慎耗尽,就会产生著名的堆栈溢出( stack overflow) 问题,这能导致整个运行中的程序崩溃( crash)。由于这个问题的普通性,全球IT界最受欢迎的技术问答网站也取名为Stack Overflowhttp://stackoverflow.com/)

类似的,如果堆内存使用不当也会产生问题,典型的问题就是内存碎片( fragmentation),当回收堆内存时,可能会导致一些小块的但不连续的内存存在。当用户申请一块较大的堆内存,虽然可用的小块内存总和足够大,本可以满足申请所需,但是由于它们不连续,导致申请失败。这些不可用的非连续的小块内存就是所谓的内存碎片。取速度较慢。

4.引用数据类型:

通过在栈中的地址去引用存储在堆中数据的数据类型

只要使用了new关键字,就表示在堆中新开了一个空间,然后在栈中留下一个地址

String类型中的值是不可变的

5.比较字符串:

使用比较的是存储的地址,引用类型地址不相同,不能使用比较

.equals比较的是存储的数据,将数据一一比较,字符串使用.equals比较是否相等

.equals()比较字符串是否相等

.equalsIgnoreCase()忽略大小写比较字符串是否相等

.toLowerCase()将字符串中所有字符转化为小写

.toUpperCase()将字符串中所有字符转化为大写

6.获得字符串长度:

字符串名.length,获得字符串长度,每个字符就是一个长度

7.字符串的拼接:

1)使用拼接符+进行拼接

2)使用.concat()方法进行拼接

8.字符串的查询和提取

indexOf("@qq")、indexOf(’@’),查询第一个字符出现的位置

.lastIndexOf(‘7’)、.lastIndexOf(“77”),查询最后一个字符出现的位置查询:

字符串名.indexOf(需要查找字符串名),返回一个int类型的数据,第一个数从0开始,返回字符串第一个字符所在位置,找不到指定的字符串返回-1

9.提取:

.substring(8)提取第9个字符串后面的所有字符串

.substring(8,12)提取从第8个字符到第11个字符,开始的位置从0开始数起,结束的位置从1开始数起,忽略字符串前后的空格

.trim()忽略字符串前后的空格,中间不能忽略

10.字符串的分割

.split(以什么为分割的字符),返回一个String的数组,将分割的每个字符串放到这个数组中

11.字符串的替换

.replaceAll(表示替换前的字符,表示替换后的字符),返回一个String的数据

StringBuffer类,是一个可变的字符串类型

语法:StringBuffer sb = new StringBuffer(“小林”);

StringBuffer的拼接:

.append(“需要追加的字符串”);追加的时候不会新开辟空间

StringBuffer的插入字符:

.insert(插入的位置,要插入的字符);:import 包名;导入包,可以将在这个包中的所有类导入到我们这个类中,导入后才能使用该包中的类通过ctrl+鼠标左键点击进入定义方法的位置用,系统不会给它赋初始值

在同一个类中,不同的方法中可以存在相同的命名,同名的两个变量没有任何关系

在同一个类中,允许局部变量和成员变量命名相同,如果两个命名一样,在使用时,局部变量有更高优先级

 

方法

方法的基本定义与使用

将某两个整数之间的随机数写成一个模块将常用的功能封装在一起,不必再“复制和粘贴”这些代码,直接采用这个功能模块的名称,就可以达到相同的效果。

方法(method )用来实现类的行为。一个方法通常是用来完成一项具体的功能( function),所以方法在C++中也称为成员函数( member function)。英文“function”的这两层含义(函数与功能)在这里都能得到体现。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YW75Y-q5bCP546L5Y-t,size_20,color_FFFFFF,t_70,g_se,x_16

 

方法包含一个方法头( method header)和一个方法体。下图以一个max方法来说明一个方法的组.成部分。

方法头包括修饰符、返回值类型、方法名和参数列表等,下面一一给 予解释。

修饰符( modifier):定义了该方法的访问类型。这是可选的,它告诉编译器以什么调用该方法。返回值类型( return type):指定了方法返回的数据类型。它可以是任意有效的类型,包括构造类型(类就是一种构造类型)。如果方法没有返回值,则其返回类型必须是void。方法体中的返回值类型要与方法头中定义的返回值类型-致。方法名( method name ):方法名称的命名规则遵循Java标识符命名规范,但通常方法名以英文中的动词开头。这个名字可以是任意合法标识符。

参数列表( parameter list):参数列表是由类型、标识符组成的序列,每对之间用逗号分开。参数实际上是方法被调用时接收传递过来的参数值的变量。如果方法没有参数,那么参数表为空的,但是圆括号不能省略。参数列表可将该方法需要的一些必要的数据传给该方法。方法名和参数列表共同构成方法签名,一起来标识方法的身份信息。

方法体( body ):方法体中存放的是封装在{ } 内部的逻辑语句,用以完成一定的功能。

方法(或称函数)在任何一种编程语言中都很重要。它们的实现方式大同小异。方法是对逻辑代码的封装,使程序结构完整条理清晰,便于后期的维护和扩展。面向对象的编程语言将这一特点进一步放大,我们可以通过对方法加以权限修饰(如private、public、 protected 等)来控制方法能够在何处被调用。灵活的运用方法和权限修饰符对编码的逻辑控制非常有帮助。

构造方法

(1)类名称:表示要定义变量的类型,只是有了类之后,变量的类型是由用户自己定义的;

(2)对象名称:表示变量的名称,变量的命名规范与方法相同,例如: studentName ;

(3)new:是作为开辟堆内存的唯一方法 ,表示实例化对象;

(4)类名称():这就是一个构造方法。

所谓构造方法,就是在每一个类中定义的,并且是在使用关键字new实例化一个新对象的时候默认调用的方法。在Java程序里,构造方法所完成的主要工作是对新创建对象的数据成员赋初值。可将构造方法视为一种特殊的方法,其定义方式如下。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YW75Y-q5bCP546L5Y-t,size_20,color_FFFFFF,t_70,g_se,x_16

 在使用构造方法的时候需注意以下几点。

(1)构造方法名称和其所属的类名必须保持一致。

(2)构造方法没有返回值,也不可以使用void。

(3)构造方法也可以向普通方法一样被重载。

(4)构造方法不能被static和final修饰。

(5)构造方法不能被继承,子类使用父类的构造方法需要使用super关键字。

构造方法除了没有返回值,且名称必须与类的名称相同之外,它的调用时机也与普通方法有所不同。普通方法是在需要时才调用,而构造方法则是在创建对象时就自动“隐式”执行。因此,构造方法无需在程序中直接调用,而是在对象产生时自动执行一次。通常用它来对对象的数据成员进行初始化。

方法的形参与实参

形参和是实参的关系如下。

(1)形参变量隶属于方法体,也就是说它们是方法的局部变量,只当在被调用时才被创建,才被临时性的分配内存,在调用结束后,立即释放所分配的内存单元。也就是说,当方法调用返回后,就不能再使用这些形式参数。

(2)在调用方法时,实参和形参在数量上、类型上、顺序上应严格保证一一对应的关系,否则就会出现参数类型不匹配的错误,从而导致调用方法失败。

方法的重载

(1)方法名称相同

(2)方法的参数列表不同(参数个数、参数类型、参数顺序,至少有一项不同)

(3)方法的返回值类型和修饰符不做要求,可以相同,也可以不同

递归调用

函数(或方法)不论是直接调用自身,还是间接调用自身,都是一种无终止的过程。显然,在程序中不能出现这种无终止的递归调用。因此,在编写递归代码时,要特别注意,递归程序一定要有结束条件, 这又被称作递归出口。如果一个递归函数缺少递归出口,执行时就会陷入死循环,其后果非常严重。递归出口可用if语句来控制,在满足某种条件时继续递归调用自身,否则就不再继续。

与数组有关的操作方式

数组克隆

由基本数据类型构建的数组,如: int 0]、double[] 等,Java 提供的内置方法并不是很多,最常用的方法是clone()方法,它会将数组复制一份,返回一个新的引用,常用来复制数组。数组对象提供的length属性用于记录数组的长度,即数组中包含元素的个数。

数组排序

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.javaJava类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值