day4

java 创建对象--内存分析:

一个对象,调用一个方法内存图:

两个对象,调用同一方法内存图:

 

一个引用,作为参数传递到方法中内存图:

 

 

 

 变量:

 

 

 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型。

 

成员方法

  • 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。

  • 将功能封装为方法的目的是,可以实现代码重用,简化代码

  • Java里的方法不能独立存在,所有的方法必须定义在类里。

方法的声明格式

修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){
方法体程序代码
return 返回值;

修饰符:public,缺省,private, protected等

返回值类型

  • 没有返回值:void。

  • 有返回值,声明出返回值的类型。与方法体中“return返回值”搭配使用

方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意” ,最好以动词开头

形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开

返回值:方法在执行完毕后返还给调用它的程序的数据。

 

方法通过方法名被调用,且只有被调用才会执行。

对象.方法名()
  • 方法被调用一次,就会执行一次

  • 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句。如果使用,仅用来结束方法。

  • 定义方法时,方法的结果应该返回给调用者,交由调用者处理。

  • 方法中只能调用方法或属性,不可以在方法内部定义方法。

方法重载

方法重载(overload):在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

重载的特点

  • 与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。

  • 调用时,根据方法参数列表的不同来区别。

可变长度的形参列表

JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。

  • JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量 public static void test(int a ,String[] books);

  • JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量public static void test(int a ,String…books);

特点

  1. 声明格式:方法名(参数的类型名 ...参数名)

  2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个

  3. 可变个数形参的方法与同名的方法之间,彼此构成重载

  4. 可变参数方法的使用与方法参数部分使用数组是一致的

  5. 方法的参数部分有可变形参,需要放在形参声明的最后

  6. 在一个方法的形参位置,最多只能声明一个可变个数形参

 方法参数的传递机制

形参:方法声明时的参数

实参:方法调用时实际传给形参的参数值

Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

  • 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参

  • 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

 

static关键字

在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块。static的主要作用在于创建独立于具体对象的域变量或者方法。在Java类中,可用static修饰属性、方法、代码块、内部类

被修饰后的成员具备以下特点

  • 随着类的加载而加载

  • 优先于对象存在

  • 修饰的成员,被所有对象所共享

  • 访问权限允许时,可不创建对象,直接被类调用

修饰变量

特点

  • 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。

 修饰方法

如果方法与调用者无关,则这样的方法通常被声明为类方法,比如说工具方法由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

特点

  • 没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。

  • 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。

静态代码块

在开发中,有时需要某些代码在程序启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。

特点

  • 静态代码块在类被加载的时候就运行了,而且只运行一次

  • 静态代码块不能存在任何方法体中

  • 静态代码块不能访问普通变量

封装概述

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

实现原则

  • 成员隐藏起来,若需要访问某个成员,提供公共方法对其访问。

3.2 封装步骤

  1. 使用private关键字来修饰成员变量。

  2. 对需要访问的成员变量,提供对应的一对getXxx方法 、setXxx方法。

特点

  • 隐藏一个类中不需要对外提供的实现细节;

  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

  • 便于修改,增强代码的可维护性;

private关键字

  • private是一个权限修饰符,代表最小权限。

  • 可以修饰成员变量和成员方法。

  • 被private修饰后的成员变量和成员方法,只在本类中才能访问。

 

this的含义

  • this代表所在类的当前对象的引用(地址值),即对象自己的引用。

  • 方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

使用场景

  • 可以调用类的属性、方法和构造方法

  • 当在方法内需要用到调用该方法的对象时,就用this。具体的:我们可以用this来区分属性和局部变量。 比如:this.name = name;

 

this关键字小结

  • this关键字在普通方法里加和不加含义相同

  • 在普通方法中,this总是指向调用该方法的对象

  • 构造方法中,this总是指向正要初始化的对象

  • 构造方法调用构造方法可通过this(),可传参数,但必须位于首行

  • this不能用于static方法,static中没有对象

 

构造方法

构造方法,当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。

构造方法的特征

  • 它具有与类相同的名称

  • 它不声明返回值类型。(与声明为void不同)

  • 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值

构造器的作用

  • 创建对象(负责在堆中开辟确定的内存空间);

  • 给对象进行初始化

 

 

 

语法格式

修饰符 构造方法名(参数列表){ 
// 方法体
}

new Person();

示例代码

复制代码
public class Animal {
    private int legs;
    // 构造方法
    public Animal() {
        legs = 4;
    } 
    public void setLegs(int i) {
        legs = i; 
    }
    public int getLegs() {
        return legs;
    } 
}
复制代码

注意事项

  • 如果你不提供构造方法,系统会给出无参数构造方法。

  • 如果你提供了构造方法,系统将不再提供无参数构造方法。

  • 构造方法是可以重载的,既可以定义参数,也可以不定义参数。

  • 构造方法可以使用this关键字进行调用,语法为this()

  • 构造器的调用只能在首行

 

包(package)的作用

  • 包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式

  • 包可以包含类和子包,划分项目层次,便于管理

  • 解决类命名冲突的问题

  • 控制访问权限(包访问权限--缺省)

包的使用

注意事项

  • 包对应于文件系统的目录,package语句中,用“.” 来指明包(目录)的层次;

  • 包通常用小写单词标识。通常使用所在公司域名的倒置:com.neuedu.xxx

Import

为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。

import语句告诉编译器到哪里去寻找类。

语法格式

import 包名.类名;

import 包名.类名;

注意事项

  • 在源文件中使用import显式的导入指定包下的类或接口

  • 声明在包的声明和类的声明之间。

  • 如果需要导入多个类或接口,那么就并列显式多个import语句即可举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。

  • 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。

  • 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。

  • 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。

  • import static组合的使用:调用指定类或接口下的静态的属性或方法

posted on   白嫖老郭  阅读(61)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示