【JAVA入门】Day05 - 面向对象

news2024/11/15 23:58:13

【JAVA入门】Day05 - 面向对象


文章目录

  • 【JAVA入门】Day05 - 面向对象
    • 一、对象的设计和使用
      • 1.1 类和对象
      • 1.2 类的分类
    • 二、封装
    • 三、private 关键字
    • 四、this 关键字
    • 五、构造方法
    • 六、JavaBean
    • 七、对象的内存图
      • 7.1 一个对象的内存图
      • 7.2 两个对象的内存图
      • 7.3 两个引用指向同一个对象
      • 7.4 null
      • 7.5 this 的内存原理
      • 7.6 成员变量和局部变量的区别


        面向对象编程通俗来讲就是“拿东西来做对应的事情”,这里的“对象”自然是指“能干活的东西”。在面向对象编程时,你想做一件事情,就可以用专门做这件事情的“对象”来进行编程。

一、对象的设计和使用

1.1 类和对象

        对象是帮助人们解决问题的实例。而是对这些对象共同特征的一种描述,它是对象的一种”上层设计“。
        在 JAVA 中,必须先设计类,才能获得对象。
        类的定义

public class 类名 {
	1.成员变量(代表属性,一般是名词)
	2.成员方法(代表行为,一般是动词)
	3.构造器
	4.代码块
	5.内部类
}

例:

public class Phone {
	
	// 属性(成员变量)
	String brand;
	double price;

	// 行为(成员方法)
	public void call() { 
		System.out.println("手机在打电话");
	}
	public void playGame() { 
		System.out.println("手机在玩游戏");
	}
}

类的使用——生成对象

public static void main(String[] args) {
	//创建手机的对象
	Phone p = new Phone();

	//给手机的品牌变量和价格变量赋值
	p.brand = "白象";
	p.price = 2999.99;

	//打印手机里的变量
	System.out.println(p.brand);
	System.out.println(p.price);

	//调用手机中的方法,玩手机
	p.call();
	p.playGame();
}

1.2 类的分类

  • 用来描述一类事物的类,专业叫做:Javabean类。在 Javabean 类中,是不写 main 方法的。
  • 而含有 main 方法的类,叫做测试类。我们可以在测试类中创建 Javabean 类的对象并进行赋值调用。
public class Student {
	String name;
	double height;

	public void study() { 
	
	}
	public void sleep() {

	}
}
  • 类名的首字母建议大写。
  • 一个 Java 文件中可以定义多个 class 类,但是只能有一个 public class,而且 public 修饰的 class 名必须和代码的文件名一致。

二、封装

        对象代表什么,就得封装对应的数据,并提供数据对应的行为。

public class Circle {
	double radius;
	
	public void draw() {
		System.out.println("根据半径" + radius + "画一个圆");
	}
}

        人画圆,并不是人画,而是圆画,圆调用了自己的 draw 方法完成的,这才是类设计的正常思想。

三、private 关键字

  • private 关键字是一个权限修饰符
  • private 关键字可以修饰成员变量和成员方法
  • 被 private 修饰的成员只能在本类中才能访问
public class GirlFriend {
	private String name;
	private int age;
	private String gender;
}

        如上代码所示,被 private 修饰的变量,只能在本类中才能访问,而用该类创建的对象则不可直接使用之。

GirlFriend gf1 = new GirlFriend();
gf1.age = 18;

        如此就会使程序报错,原因是直接访问了类的私有变量。
        如果想使用这些私有变量,就要按照如下的写法:

public class GirlFriend {
	private int age;
	private String name;
	
	//set方法(赋值)
	public void setAge(int a) {
		if(a >= 18 && a <= 50) {
			age = a;   //这里的 age 就是类里面的私有变量 age
		}else{
			System.out.println("非法数据");
		}
	}

	public void setName(String n) {
		name = n;
	}

	//get方法(取值)
	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}
}

        只要给属性添加 public 的 set 和 get 方法,利用这两个方法间接调用这俩属性,就可以实现对它们的操纵。set 方法负责给变量赋值,get 方法负责获取变量的值。

GirlFriend gf1 = new GirlFriend();
gf1.setAge(18);
System.out.println(gf1.getAge());

四、this 关键字

public void setName(String n) {
		name = n;
}

        刚才的代码中,我们用形参 n 给 name 赋值,但是这个 n 并不能明确表达 name 的含义,有没有一种办法可以让 n 也体现 name呢?
        在 Java 中,区分两个同名变量的方法采用的是就近原则,谁离得近,就使用谁。

public class GirlFriend {
	private int age;
	public void method() {
		int age = 10;
		System.out.println(age);
	}
}

        以上述代码为例,我们定义了一个成员变量 age,之后又在成员方法 method() 里,重新定义了一个局部变量 age,那么这里的 sout 输出的到底是那个成员变量,还是这个局部变量呢?
        答案是输出10,因为就近原则,这个局部变量离得近,所以 age 被识别为这个局部变量。
        那如何令其输出那个成员变量呢?这时就可以引入 this 关键字了。

public class GirlFriend {
	private int age;
	public void method() {
		int age = 10;
		System.out.println(this.age);
	}
}

        因此,this 关键字,代指的就是当前类。这个时候的 age 被指明为该类的成员变量 GirlFriend.age。
        综上,利用 this 关键字,可以改写 set 方法,让它变得更加可读。

public void setName(String name) {
		this.name = name;
}

        this.name 和 name 完全不同的两个变量。this.name 代表该类的成员变量,name 表示传递给该函数的局部变量

五、构造方法

        构造方法又叫构造器、构造函数。它的作用就是在创建对象时,给成员变量进行赋值。
构造方法的格式:

public class Student {

	修饰符 类名(参数) {
		方法体;
	}
	
}

注意:

  • 方法名与类名必须完全相同,大小写也要一致。
  • 没有返回值类型,连 void 都没有。
  • 没有具体的返回值(不能由 return 带回结果数据)。

以下是两个不同参数的构造方法(一个空参一个有参数,属于重载):

public class Student {
	private String name;
	private int age;

	public Student() {
		//空参构造方法
	}

	public Student(String name, int age) {
		//带全部参数的构造方法
	}
	
}

构造方法的调用:
        构造方法在创建对象的时候由虚拟机调用,不能手动调用构造方法。每创建一个对象,就会调用一次构造方法。
        如果我们没有写任何构造方法,虚拟机在运行时,也会自动给我们添加一个空参的构造方法。如果我们写了新的空参构造方法,就会替换掉虚拟机自动生成的那个。
        我们还可以利用有参构造方法,在对象生成之初,就给对象包含的成员变量赋初值。

public Student(String name, int age) {
	this.name = name;
	this.age = age;
}
Student s = new Student("丁真",22);

        值得一提的是,虚拟机调用哪个构造方法,是根据生成对象时括号里有没有参数,因此,有参构造方法和空参构造方法可以同时存在,这也是一种重载

public Student(String name, int age) {
	this.name = name;
	this.age = age;
	System.out.println("我是有参构造方法");
}

public Student() {
	System.out.println("我是空参构造方法");
}
Student s1 = new Student("丁真",22); // 我是有参构造方法
Student s2 = new Student();		 	 // 我是空参构造方法

        但是,如果我们只写一个有参构造方法,不写空参构造方法,虚拟机也不会自动生成那个空参构造方法了,这个时候无参调用就会报错。

public Student(String name, int age) {
	this.name = name;
	this.age = age;
}
Student s1 = new Student();  //报错,虚拟机没有自动给无参构造方法
Student s2 = new Student("丁真",22);

        综上,我们在编程时,往往都会同时写上有参构造和无参构造,防止出错。

六、JavaBean

        一个标准的 JavaBean 书写有以下规则:

  1. 类名需要见名知意。
  2. 成员变量使用 private 修饰。
  3. 提供至少两个构造方法——无参构造方法、带全部参数的构造方法。
  4. 成员方法——提供每一个成员变量对应的setXxx() / getXxx() ,如果该成员变量还有其他行为,一并写上。

【例】写一个用户的 JavaBean 。

public class User {
	// 属性
	private String username;
	private String password;
	private String email;
	private String gender;
	private int age;

	// 空参
	public User() {}

	// 带全部参数的构造
	public User(String username, String password, String email, String gender, int age) {
		this.username = username;
		this.password = password;
		this.email = email;
		this.gender = gender;
		this.age = age;
	}

	// get和set方法
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUsername() {
		return username;
	}

	//其他成员变量的省略
}

七、对象的内存图

        从 JDK8 开始,JAVA 的内存取消了方法区,新增元空间,将方法区的职能拆分给了堆和元空间。
在这里插入图片描述
        在 JDK7 以前,元空间的名字叫“方法区”并且和堆是一段连续的空间,顾名思义,方法区是 JAVA 在运行一个类(class)时存储的区域,其工作原理如下:
        当运行一个类时,它的字节码文件会进入方法区。当类中的方法运行时,该方法会进入中。如果类中使用了 new 关键字,就会在内存中开辟空间并产生一个地址值。
在这里插入图片描述

7.1 一个对象的内存图

Student s1 = new Student();

        当生成一个对象时,虚拟机会按以下步骤执行:

  1. 加载 class 文件。(加载 Student 类的代码到方法区内存中)
  2. 申明局部变量。(就是等号左边的 s)
  3. 在堆内存中开辟一个空间。(等号右边的 new 关键字)
  4. 默认初始化。
  5. 显示初始化。
  6. 构造方法初始化。
  7. 将堆内存中的地址值赋值给左边的局部变量。
    在这里插入图片描述

7.2 两个对象的内存图

Student s1 = new Student();
System.out.println(s1);
s1.name = "阿强";
s1.age = 23;
System.out.println(s1.name + "..." + s1.age);
s1.study();
Student s2 = new Student();
System.out.println(s2);
s2.name = "阿杰";
s2.age = 24;
System.out.println(s2.name + "..." + s2.age);
s2.study();

        注意,两个对象的时候,class 文件只需要加载一次,因为 class 文件是通用的,因此在第一个对象生成时,class 文件已经加载好了,之后就仅对栈和堆进行操作了。在这里插入图片描述
        因为 s1 和 s2 申请的是不同的两块堆空间,所以它们之间相互独立。

7.3 两个引用指向同一个对象

Student stu1 = new Student();
stu1.name = "阿强";
Student stu2 = stu1;
stu2.name = "阿杰";
sout(stu1.name + "..." + stu2.name);

        如上述代码所示,此时的 stu1 对象是生成的,而 stu2 是直接由 stu1 赋值而来的,相当于是把 stu1 的引用给了 stu2,换句话说,stu2 就是 stu1 的同名异构(引用),因此 stu1 和 stu2 应该指向同一块堆空间。因此在 stu2.name = “阿杰” 执行后,会覆盖 stu1.name = “阿强” 这句代码影响到的堆空间相应地址上的变量值。
        这就是,两个引用指向了同一个对象。

7.4 null

Student stu1 = new Student();
stu1.name = "阿强";
Student stu2 = stu1;
stu2.name = "阿杰";
sout(stu1.name + "..." + stu2.name);
stu1 = null;
sout(stu1.name);
sout(stu2.name);
stu2 = null;

         null 就是空,把 null 赋值给 stu1,也就是令 stu1 不再指向之前的那块堆内存,因此 stu1.name 就空了。但此时 stu2 还指向那块堆内存,因此 stu2.name 可以输出“阿杰”。当 stu2 = null;执行后,所有指向那块堆内存的链接都被删除,因此,那块堆内存变为了垃圾内存

7.5 this 的内存原理

        this 是用于区分局部变量和成员变量的关键字。它的本质其实是:所在方法调用者的地址值
        因此,this 在成员参数赋值时所代表的,大概率是该对象本身的地址值。

public void setName(String name) {
	this.name = name;
}
Student s1 = new Student();
s1.setName("竹小玲");

        在上面的代码中,this.name 代指 s1 对象内的成员变量 s1.name, name 代表传递过来的形参 name,其值也就是“竹小玲”。this 指向的内存地址,也即为 s1 指向的内存地址。
在这里插入图片描述

7.6 成员变量和局部变量的区别

        成员变量是指类中方法外的变量;局部变量是指方法中的变量。它们之间的区别如下表格总结:
在这里插入图片描述

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (252)-- 算法导论18.2 5题

五、因为叶结点无需指向孩子结点的指针&#xff0c;那么对同样大小的磁盘页面&#xff0c;可选用一个与内部结点不同的(更大的) t 值。请说明如何修改 B 树的创建和插人过程来处理这个变化。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 当我们在B树&#xff…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

slugify,slug格式转换工具

目录 前言 安装 特性 基本功能 生成简单的Slug 处理特殊字符 Unicode支持 高级功能 自定义替换规则 过滤停用词 使用不同的分隔符 处理多种语言 实际应用场景 网站和博客的SEO优化 电子商务平台的产品链接 数据清洗和预处理 总结 前言 在Web开发中&#xff0c;生成易于…

vm 虚拟机 Debian12 开启 root、ssh 登录功能

前言&#xff0c;安装的时候语言就选中文就好了。选择中文&#xff0c;在安装的时候就可以选择国内 163 的源。 开启 ssh 功能 先提权&#xff0c;用 root 账户 su安装 ssh 安装 ssh-server apt install openssh-server启动 ssh systemctl start ssh查看 ssh 状态 systemctl st…

景源畅信电商:做抖音有哪些未开发的蓝海领域?

在互联网信息爆炸的今天&#xff0c;抖音已经成为人们获取信息和娱乐的重要渠道。然而&#xff0c;随着用户数量的增加和内容的丰富&#xff0c;抖音的红海竞争也日益激烈。在这样的背景下&#xff0c;寻找还未被充分开发的蓝海领域&#xff0c;对于内容创作者来说&#xff0c;…

yolov8 模型架构轻量化 | 极致降参数量

模型轻量化加速是深度学习领域的重要研究方向&#xff0c;旨在减小模型的体积和计算复杂度&#xff0c;从而提高在资源受限设备上的运行效率&#xff0c;模型参数量在轻量化加速中扮演着至关重要的角色。 首先&#xff0c;模型参数量直接决定了模型的复杂度和存储空间需求。随…

西南大学计算机考研,选学硕还是专硕?西南大学计算机考研考情分析!

西南大学&#xff08;Southwest University&#xff09;是教育部直属&#xff0c;教育部、农业农村部、重庆市共建的重点综合大学&#xff0c;是国家首批"双一流"建设高校&#xff0c;"211工程"和"985工程优势学科创新平台"建设高校。现任党委书…

JVM学习-虚拟机栈

虚拟机栈 每个线程创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个栈帧&#xff0c;对应一次次Java方法调用&#xff0c;栈是线程私有的。 生命周期: 与线程相同 作用 主管Java程序的运行&#xff0c;它保存方法的局部变量、部分结果、并参与方法的调用和返回。 …

【Linux】系统登录,调用shell,shell配置文件,shell命令,特殊符号,shell快捷键,Linux运行级别,解决无限登录问题,修改提示符

目录 Linux系统的登录方式 以及 调用shell Linux shell 以及 shell配置文件 shell 命令 shell 特殊符号 shell 快捷键 Linux操作系统运行级别 单用户模式下解决无限登录问题 centos7修改命令行提示符 PS1 补充、centos7没有滚动条 Linux系统的登录方式 以及 调用shell…

怎样让猫给啥吃啥?生骨肉冻干拌粮哪有猫咪不吃的!

随着科学养猫的普及&#xff0c;生骨肉冻干喂养越来越受欢迎&#xff0c;生骨肉冻干喂养对猫的好处很多&#xff0c;它符合猫咪的天性&#xff0c;可以提供全面的营养&#xff0c;保持牙齿和牙龈的健康&#xff0c;还有助于维持健康的消化系统。然而&#xff0c;许多猫主人在选…

构建智能化不动产管理系统:数字化引领未来房地产行业发展

随着城市化进程的不断推进和房地产市场的持续发展&#xff0c;不动产管理系统的重要性日益凸显。在这一背景下&#xff0c;构建智能化不动产管理系统成为推动房地产行业数字化转型的关键举措。本文将深入探讨智能化不动产管理系统的构建与优势&#xff0c;助力房地产企业把握数…

深入剖析Tomcat(八) 载入器与打破双亲委派机制的自定义类加载器

写这篇文章让我头大了好几天&#xff0c;书中描述的内容倒是不多&#xff0c;可能也是那会Tomcat的现状。如今Tomcat发展了好多代&#xff0c;加上springboot的广泛应用&#xff0c;导致现在的类加载的步骤和Tomcat资料中描述的大相径庭。可能也是由于微服务的发展&#xff0c;…

Linux 第三十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a;3&#xff1a;1&#xff0c;餐饮行业是调味品行业的供需主力。在餐饮行业中&#xff0c;“大厨”这一角色具有十分重要的地位。因此&#xff0c;借助大厨的力量成为了许多调味品…

HCIP【VLAN综合实验】

目录 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、在交换机SW1,SW2,SW3配置VLAN和各个接口对应类型的配置 2、在路由器上面配置DHCP服务 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 1、PC1 …

MT2057 门票

思路&#xff1a; 此题是求有多少个区间的平均值>t&#xff0c; 那么可以把每个值-t。如果新的数列的某个区间的和>0&#xff0c;那么说明这个区间满足条件。 令新数列的前缀和为b[i]&#xff0c;所以求[i, j]区间是否满足条件&#xff0c;即求b[j]-b[i-1]是否>0&am…

基于SSM的婚恋网站的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的婚恋网站的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

SpringBoot上传文件到服务器(跨服务器上传)

目录 &#xff08;一&#xff09;上传文件到本地&#xff08;windows&#xff09; &#xff08;二&#xff09;上传文件到linux服务器 &#xff08;三&#xff09;跨服务器上传文件 &#xff08;一&#xff09;上传文件到本地&#xff08;windows&#xff09; 1.新建一个文件…

程序员兼职引起的纠纷?

最近跟朋友聊天&#xff0c;说遇到一些因兼职工作而引发的争议&#xff0c;因为我本人也曾涉足过兼职领域&#xff0c;因此对程序员兼职时可能遇到的各种情况和应遵循的“套路”准则还有有一些发言权的&#xff0c;所以想和大家聊聊如何安全“兼职”的1/2事项~ ✅顺便内推个机会…

什么是用户画像?用户画像的作用是什么?

首先我们来说下什么是用户画像&#xff1f; 用户画像是指对目标用户进行详细描述和分类的方法。 它是根据用户的个人特征、行为习惯、兴趣爱好、消费习惯等信息进行分析和总结&#xff0c;以便更好地了解用户需求和行为模式。用户画像可以帮助企业或组织更好地了解他们的目标…