当前位置: 首页 > news >正文

java初始(4)【补充】

1.3 构造方法

它也被称为构造函数、构造器。类创建对象是通过调用构造方法来实现的。构造方法是一种特殊的方法,方法名必须和类名一致,不需要定义返回值类型。

public构造方法名(参数列表){

//方法体

}

示例代码如下:

(1)在Student类中编写构造器:

public class Student { public Student(){ } }

(2)在主函数中调用该构造器:

import java.util.Arrays; public class Test { public static void main(String[] args ){ Student student = new Student(); } }

【注意:对于在别处调用构造器,如果我们要去查看这个构造器,只需要按住ctrl键,用鼠标点击构造方法名即可

【注意:该部分为新创建的构造方器,它存储在堆内存中;它为新创建的对象,它存储的是前面新创建的构造器的地址,并且存储在栈内存中,当我们使用新创建的对象时,会发现一个内存地址,根据这个内存地址从而找到了构造器。】

构造方法主要分为两种:(1)无参构造;(2)有参构造。每个类默认都有一个无参构造,定义类的时候不需要专门声明无参构造方法,如果手动定义一个有参构造,则会覆盖默认的无参构造。

1.4 创建对象

创建对象只需要调用对应类的构造器即可,构造器分为无参构造和有参构造,区别在于调用无参构造创建的对象,不会给属性赋值,需要手动对属性进行赋值,先创建再赋值。调用有参构造,则不需要在构造函数外部进行属性赋值,构造函数本身就会为创建好的对象赋值,只需要在调用的时候将属性值传入即可,边创建边赋值。

【注意:(1)int的默认值为0,string的默认值为null;(2)在Java中,int类型的数如果以0开头,怎会认为是八进制数;(3)若是double类型的数据,我传参01.23,则会输出1.23,因为Java中(Java7以后)只支持十进制和十六进制,不支持八进制,所以会输出实际值。】

(1)构造器为无参构造时

创建构造器代码如下:

public class User { public int id; public String name; public int age; public User(){ } }

调用该构造器代码如下:

public class Test { public static void main(String[] args ){ User user =new User(); user.id = 1; user.name = "02"; user.age = 3; System.out.println(user.id); System.out.println(user.name); System.out.println(user.age); } }

输出结果如下:

1 02 3

(1)构造器为有参构造时

创建构造器代码如下:

错误传参示例:

创建构造器:

public class User { public int id; public String name; public int age; public User(){ } public User(int id,String name,int age){ } }

调用构造器:

public class Test { public static void main(String[] args ){ User user =new User(1,"02",3); System.out.println(user.id); System.out.println(user.name); System.out.println(user.age); } }

输出结果:

0 null 0

错误原因:输出这样的结果是因为我们传入的参数名和构造器中的属性名是一样的,其本质代码如下所示,程序不知道我们在构造器中定义的id到底是类中的属性还是传入的参数,根据就近原则,程序会默认把定义的id当成我们传入的参数,也就是把传入的参数又给赋值成属性名(或者说是参数名),此时就会输出默认值。

public class User { public int id; public String name; public int age; public User(){ } public User(int id,String name,int age){ id = id; name = name; age = age; } }

解决方法:

(1) 修改传入的参数的参数名,如下代码:

public class User { public int id; public String name; public int age; public User(){ } public User(int id1,String name1,int age1){ id = id1; name = name1; age = age1; } }

(2) 使用this关键字,使用此种方式比较常见。【使用this关键字则是指定其为属性名】如下代码:

public class User { public int id; public String name; public int age; public User(){ } public User(int id,String name,int age){ this.id = id; this.name = name; this.age = age; } }

修改后最终结果如下:

1 02 3

1.5 使用对象

对象的使用包括获取和修改属性,调用方法。访问属性通过对象名.属性名来完成,调用方法通过对象名.方法名来完成。

在User类中新定义一个test方法,代码如下:

public int test(){ return 0; }

对属性的获取、修改以及方法调用的代码:

public class Test { public static void main(String[] args ){ User user =new User(1,"02",3); user.id = 2; // 属性的修改 System.out.println(user.name);// 属性的获取 user.test();//方法的调用 } }

1.6 this 关键字

在类定义的时候通常会使用 this 关键字,this 用来指代当前类的实例化对象,通过 this 可以调用当前类的属性和方法,例如在有参构造函数中,通过 this 关键字将外部传入的值赋给当前类的实例化对象。this 关键字除了可以在类中访问属性也可以在类中调用方法。类中方法分为两种:(1)构造方法;(2)普通方法。

1.6.1 方法的调用

(1)调用构造方法: this(参数列表),【注意:不能在普通方法中使用 this 关键字来调用构造方法】。代码示例如下:

public User(int id,String name,int age){ this(); // 在构造方法中调用无参构造方法 }
public User(){ this(1,"02",3); //在构造方法中调用有参构造方法。 }

【注意:两者不能同时互相调用,否则会报错。原因是我们不能无限的去调用创建对象,最终会导致内存溢出,所以代码会报错。】如下代码所示:

public User(){ this(1,"02",3); } public User(int id,String name,int age){ this(); // 在方法中调用无参构造方法 }

(2)调用普通方法: this.方法名(参数列表)。无论是在构造器中还是普通方法中都可以调用普通方法。【注意:在自己的方法中调用自己,即为递归】具体代码如下:

public User(){ this.test();//在无参构造器中调用普通方法 } public User(int id,String name,int age){ this.test();//在有参构造器中调用普通方法 } public int test(){ this.test();在自己的普通方法中调用普通方法(递归) return 0; } public int test2(){ this.test();//在另一个普通方法调用普通方法 return 1; } }

1.7 方法重载

方法重载是体现 Java 代码复用的一种重要方式,指的是两个方法之间的一种关系。

1.7.1 方法之间可以构成重载所要具备的条件

(1)方法在同一个类中;(2)方法名相同;(3)参数列表不同(个数或类型不同);(4)与返回值和访问权限修饰符无关。

方法重载具体代码如下:

public class Test { public static void main(String[] args) { Test test = new Test(); test.method(); test.method(1); } public void method(){ System.out.println("无参"); } public void method(int num){ System.out.println("有参"); } }

结果如下:

无参 有参

1.8 成员变量和局部变量

变量之间除了数据类型、变量名、变量值不同之外,变量的作用域范围也是不同的。变量的作用域是指在程序中可以通过变量名来访问该变量的范围,变量的作用域是由变量被声明时所在的位置决定的。

Java 中根据不同的作用域可以将变量分为成员变量和局部变量。(1)如果一个变量在方法中声明,则该变量为局部变量;(2)如果一个变量在方法外,类中声明,则该变量为成员变量。

具体代码如下:

public class Test { int id = 1;// 成员变量 public void method(){ int id1 = 1;//局部变量 } }

1.8.1 成员变量和局部变量的作用域的区别

成员变量的作用域在整个类中,类中的每个方法都可以访问该变量。局部变量的作用域只在定义该变量的方法中,出了该方法就无法访问。

示例代码如下【由于变量的作用域不同,最后一行代码会报错】:

public class Test { int num = 1; public void a1(){ int num1 = 2; System.out.println(num); } public void a2(){ System.out.println(num1); } }

1.8.2 不同作用域的变量的优先级

当成员变量和局部变量重名的时候,局部变量优先级更高。

具体代码如下:

public class Test { int num = 1; public void a1(){ int num = 2; System.out.println(num); } public static void main(String[] args) { Test test = new Test(); test.a1(); } }

输出结果如下:

2

之前讲到this关键字会把变量定义到类中定义的属性名,【this是指当前类的意思】于是有以下结果:

public class Test { int num = 1; public void a1(){ int num = 2; System.out.println(this.num); } public static void main(String[] args) { Test test = new Test(); test.a1(); } }

此时结果如下:

1

1.8.3 不同作用域的变量的初始值

成员变量和局部变量除了作用域不同之外,初始值也不同,Java 会给成员变量赋初始值,局部变量则不会赋初始值,不同数据类型的成员变量的初始值也不同。具体如下:

(1)整数类型的初始值是 0;(2)浮点型的初始值是 0.0;(3)char 类型的初始值是 ‘ ’;(4)boolean 类型的初始值是 false;(5)引用类型的初始值是 null

【注意:null是指内存已经开辟出来了,但里面没有任何东西】

示例代码如下:

public class Test { String a1; Object object; byte a2; int a3; short a4; long a5; double a6; float a7; char a8; boolean a9; public void method(){ System.out.println(a1); System.out.println(object); System.out.println(a2); System.out.println(a3); System.out.println(a4); System.out.println(a5); System.out.println(a6); System.out.println(a7); System.out.println(a8); System.out.println(a9); } public static void main(String[] args) { Test test = new Test(); test.method(); } }

输出结果如下:

null null 0 0 0 0 0.0 0.0 false
http://www.jsqmd.com/news/466021/

相关文章:

  • 【2026年最新600套毕设项目分享】基于Java美剧观影网站的设计与实现(14112)
  • 蓝桥杯 无影之谜
  • 揭秘气动注浆泵:这3家公司的产品为何让施工效率翻倍?
  • 防爆电动葫芦什么品牌的比较好|2026 年电动葫芦品牌排行榜推荐 - 博客万
  • SILERGY矽力杰 SY8891EARC SOT563 DC-DC电源芯片
  • ROS2 jazzy下Astra Pro Plus相机驱动问题解决
  • 2026油污监测优质品牌推荐指南技术与场景适配:油污监测/漏油监测/管道漏油/油污检测/溢油监测/选择指南 - 优质品牌商家
  • 二叉树的四种遍历与二叉树还原
  • Claude注册表性能优化秘籍
  • ESP32 开发板动态数字与 GIF 图显示实现技术分享(课程作业)
  • 馈赠佳礼,传递喜悦,年货礼盒如何展现诚意与祝福 - yangyuan-shunfeng
  • VM虚拟机配置静态IP,网络
  • 基于FX3U PLC的3×3立体车库控制系统设计
  • 【在 macOS 上安装 OpenClaw 完整指南】
  • “复制粘贴”这点事你弄明白了吗?
  • Flink从入门到上天系列第十四篇:Flink当中的处理函数
  • Spring Boot中的404错误:原因、影响及处理策略
  • 【C++算法入门】动态规划-糖果问题
  • Samba - 文件共享服务-Windows
  • 归一化技巧哪家强?Batch Norm、Layer Norm 与 Group Norm 深度解析
  • 机器人设计与应用综合实训——ESP32开发技术分享(day3)
  • 第一篇博客日志
  • (3)同步读写client和server
  • GM-CSF Surpass ELISA试剂盒如何助力解析病毒感染中的炎症风暴机制?
  • 2026年上海物联网应用开发报价多少?附性价比高的公司推荐
  • 2026年3月吉林水泥制品/水泥管/顶管/排水管/矩形槽厂家综合分析 - 2026年企业推荐榜
  • 使用内网穿透远程访问 OpenClaw:让本地大模型随时随地可用
  • IFN-γ Surpass ELISA试剂盒如何揭示剂量依赖性干扰素-γ对肿瘤干细胞的双重调控?
  • 豆包GEO优化怎么选?3家服务商实测,效果惊人!
  • 2026辽阳草坪绿化优质品牌推荐指南:辽阳草坪批发、辽阳草坪种植、辽阳草坪绿化、辽阳草坪苗木、辽阳草坪销售、辽阳草坪专用草选择指南 - 优质品牌商家