JAVA基础06-面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)

面向对象的概念以及特征

概念

实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起, 一切以对象为中心语言。

面向对象的程序设计过程中有两个重要概念:类(class)和对象(也称为实例)

其中类是某一批对象的抽象,可以把类理解成某种概念,相当于一种“模板”;

对象才是一个具体存在的实体,从这个意义上来看,日常所说的人,其实都是人的实例,而不是人类。


面向对象的核心特征

(1) 封装

封装是将数据和操作数据的方法捆绑在一起,形成对象。这样可以保护对象的数据不被外界直接访问和修改,而是通过对象提供的公共接口来进行操作。封装可以降低系统的复杂性,并使系统更加稳定和可靠。

(2) 继承  

 继承允许开发者创建新的类(子类),这个新类可以继承已有类(父类)的属性和方法。子类可以重用父类的代码,并且可以在不需要重新编写原有类的情况下对其进行扩展。继承体现了从一般到特殊的关系,例如,一个具体的汽车类可以继承自通用的交通工具类。

(3) 多态

 多态是指不同的对象可以接收相同的消息,但每个对象可以以不同的方式响应该消息。多态允许同一个接口对应多个不同的实现,从而增加了代码的灵活性和可扩展性。例如,一个名为drive()的方法可以被不同的车辆类实现,每种车辆都可以有自己的drive()实现。


类的定义

- -使用class修饰类

- -类用于描述某种概念,封装类的静态特征以及动态特征

- -定义属性(成员变量、静态特征)

- -定义动态特征(行为方法)


类与实例,实例对象的创建

- -抽象

- -对象是真实存在

- -对象的创建是通过类的构造器new出来的

- -引用类型有多少种?无数种

//定义一个person类,类中包括属性与方法
public class Person {
    	//属性
		String name;
		String sex;
		int age;
		void eat() {//无参数的eat方法
			System.out.println("干饭");}
		void sleep() {
			System.out.println("水饺");}
		void play() {
			System.out.println("玩");}
}
//创建对象,调用person类,初始化属性以及调用其方法
public class Object {
	public static void main(String[] args) {
		Person p;//创建 p 这个person类
		p=new Person();//初始化 p
		p.name="张三";//p的属性的初始化
		p.sex="男";
		p.age=77;
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println(p.age);
		p.eat();//调用p 的eat方法
	}
}

package和import语句

全限定名 package+类名

package的命名规则一般为公司域名倒写/项目前缀; 

例如:com.baidu.xxx(这里的xxx一般为某个模块/层次)

包名也为路径划分,例如:

//通过全限定类型约束当前类为com. day1027中的Person
com.day1027.Person p1 = new com.day1027.Person();

系统导入(import)

import  java.util.*;// 导入java.until这个包里的所有类
import  java.util.Arrays;//导入java.until这个包里面的Arrays类

1) 系统会默认导入同一个包中的类

2) 系统会默认导入java.lang.*; (可以在jdk/jre/lib/rt.jar中找到这个包)


位置关系

1)package语句在java源文件中的第一行

2)import语句在package和class之间


方法

定义

- -用于封装某种特殊的功能操作,能够进行入参和返回数据

组成元素

修饰符,方法返回值,方法名,方法参数,方法体

//定义一个方法,给某个小孩送礼物,要求获取姓名
public String songLiWu(String liwu){
    //public 为修饰符,String为返回值类型,songLiWu为方法名,String liwu为参数,{}包含的为方法体
	System.out.pringln("给小孩送了"+liwu);
	return "小明";
}

方法的语法

举例:我给水果店老板50元,老板要给我称50元的水果,然后把水果交给我(买水果)

修饰符 方法的返回值 方法名(方法的参数列表) {

方法体(买水果的过程)

收了我50元

称50元的水果

返回水果

}

有返回值

在调用方法后需要返回该类型的数据;必须要加return语句。

--返回值类型为基本数据类型(8种)

则需要注意,返回数据的类型要比定义的返回值类型小或者相等   比如:方法返回值类型为double  则可以返回比double类型小的数据(long、int......)

	//两数相加的和,返回结果
	//如果返回值类型为基本数据类型,可以返回该类型所兼容的数据
	int add(int a,int b) {
		return a+b;
	}
 

--返回值类型为引用类型

则返回该类型的对象或者该子类的对象

	//如果返回值类型为引用类型,可以返回该类或者该子类的对象数据
	Object buy(double money) {
		return 12;//自动装箱   基本数据类型装箱为Integer
	}

无返回值

使用void来表示当前方法没有返回值类型

//吃饭没有返回值类型
void eat() {
system.out.println( "吃饭");
}

方法签名

组成:由方法名参数列表组成。(参数列表得看数据的类型是否相同,若数据类型相同,但变量名不同,仍然为同一个方法

方法签名和修饰符、返回值类型没有关系。只要方法签名不一致,则不是同一个方法

	//方法的id==方法签名--》【方法名+参数列表】
	int add(int a,int c) {
		return a;
	}
	int add(int a){//这两个方法并不是同一个方法
   		return a;
    }

练习

1、商品分类:Category

属性:--分类id--分类名称--商品列表   方法:用于获取当前商品分类最top的销量的商品的方法getTopSlaeProdution();

2、商品:Prodution

属性:--商品编号--商品名称--商品价格--商品的总销量【销售额:元】 方法:用于打印当前商品的所有信息printMessage()

//商品分类Category
public class Category {
	// 属性:--分类id--分类名称--商品列表 
	int id;
	String name;
	Prodution[] produtions;

	// 方法:用于获取当前商品分类最top的销量的商品的方法getTopSlaeProdution();
	Prodution getTopSlaeProdution() {
		// 定义一个变量用于存放销量最高的商品
		Prodution top = produtions[0];
		// 遍历
		for (Prodution prodution : produtions) {
			// 判断,比较,把销量高的拿出来
			if (prodution.saleNum > top.saleNum) {
				top = prodution;
			}
		}
		// 返回销量最高的商品
		return top;
	}
    
//商品类Prodution
public class Prodution {
	// 属性:--商品编号--商品名称--商品价格--商品的总销量【销售额:元】
	int code;
	String name;
	double price;
	int saleNum;

	// 方法:用于打印当前商品的所有信息printMessage()
	void printMessage() {
		System.out.printf("当前商品编码%d,名称为:%s,价格:%f,销量%d \n", code, name, price, saleNum);
	}
    
//测试类
    public static void main(String[] args) {
		// 调用getTopSlaeProdution方法,获取当前商品分类的最top的销量的商品,并显示该商品信息
		//主--商品分类    谓--调用    宾--getTopSlaeProdution方法      结果--销量的商品
		//1、创建多个商品
		Prodution p1 = new Prodution();
		p1.name = "秋裤";
		p1.saleNum = 100;
		Prodution p2 = new Prodution();
		p2.name = "卫衣";
		p2.saleNum = 1100;
		Prodution p3 = new Prodution();
		p3.name = "内裤";
		p3.saleNum = 10000;
		Prodution p4 = new Prodution();
		p4.name = "外套";
		p4.saleNum = 500;
		//2、创建商品分类、将多个商品赋值到商品分类中的列表
		Category category = new Category();
		category.name = "衣服";
		category.produtions = new Prodution[]{p1,p2,p3,p4};
		//3、调用方法
		Prodution top = category.getTopSlaeProdution();
		top.printMessage();//调用方法,显示商品信息
	}
    

方法的入参匹配

不同类型匹配的优先级(从高到低)


基本数据类型

转换优先级:本类型--> 类型的提升顺序 --> 本类型的包装类 -->本类型的可变长度类型


引用类型

本类型-->父类

//方法的入参匹配	
public static void main(String[] args) {
		// 方法调用按照方法签名来调用
		MethodInputInvoke invoke = new MethodInputInvoke();
		//方法调用--方法签名
		invoke.input(1,2);
		//基本数据类型:本身--》类型提升--》包装类型--》长度可变类型
		//引用类型:本身--》父类
		
		//在同一个类中,同一种行为的不同的体现
		//方法名相同,但是方法参数列表不同的	
	}

public class MethodInputInvoke {
	//方法的组成元素    修饰符  返回值类型 方法名 方法参数列表 方法体
	/*void input(byte i) {
		System.out.println("byte i----------------------------");
	}
	void input(short i) {
		System.out.println("short i----------------------------");
	}
	void input(int i) {
		System.out.println("int i----------------------------");
	}
	void input(long i) {
		System.out.println("long i----------------------------");
	}*/
	void input(Integer i) {
		System.out.println("Integer i----------------------------");
	}
	void input(Short i) {
		System.out.println("Short i----------------------------");
	}
	//参数入参个数是可变的 int...
	void input(int... i) {
		System.out.println("int... i----------------------------");
	}

重载方法的定义

1.同一个类中

2.方法名相同

3.参数列表不同

4.方法的重载和修饰符以及方法返回值是没有关系的,只跟方法签名有关系

练习

定义Hero类

这四个参数分别是 heroName(英雄名), heroHP(英雄HP),heroArmor(英雄攻击力), heroMoveSpeed(移动速度)

互为重载方法:

--自己治疗的方法heal【自己增加100HP】

--给一个队友治疗的方法heal【队友增加200HP】

//思路
//1.定义Hero类--定义属性--定义两个方法
public class Hero {
	// heroName(英雄名) heroHP(英雄HP) heroArmor(英雄攻击力) heroMoveSpeed(移动速度)
	String heroName;
	int heroHP;
	int heroArmor;
	int heroMoveSpeed;
	//--自己治疗的方法heal【自己增加100HP】
	void heal() {
		heroHP = heroHP+100;
	}
	//--给一个队友治疗的方法heal【队友增加200HP】
	void heal(Hero h) {//heal方法重载
		h.heroHP = h.heroHP+200;
	}	
}
//2.测试类--创建对象--调用方法--输出结果
public class HeroTest {

	public static void main(String[] args) {
		// 孙悟空治疗自己
		Hero sun = new Hero();
		sun.heroName ="孙行者";
		sun.heroHP = 1500;
		System.out.println(sun.heroHP);
		//
		sun.heal();
		System.out.println(sun.heroHP);
		// 小明治疗孙悟空
		Hero xiaoming = new Hero();
		xiaoming.heroName ="小明";
		//
		xiaoming.heal(sun);
		System.out.println(sun.heroHP);
	}
}

方法的递归

定义:一个方法重复调用自身。主要解决问题1、方法的出口 -2、递归的规律

练习

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....;求13个月后,如兔子都不死,兔子对数为多少

public class Raq {
	//方法   n表示为月份
	int growp(int n) {
		//1、出口
		if(n<=2) { //第一、二个月固定数量
			return 1;
		}else {
			//2、迭代    fum(n)= fum(n-1)+ fum(n-2)  当前月的数量等于前两个月的和
			return growp(n-1)+growp(n-2);
		}
	}
	
	//内部测试代码,要加static
    //外部测试代码则不用
	public static void main(String[] args) {
		//
		Raq ra = new Raq();
		//
		System.out.println(ra.growp(13));
	}
}

构造器的定义

定义

作用是创建对象。其最大用处就是在创建对象时执行初始化。构造器也是一个特殊的方法 ,因为构造器没有返回值类型



语法 

 [修饰符]   类名(参数类别){

方法体}

如果一个类中没有定义构造器,则系统会默认提供一个无参构造器,但是如果有定义任意一个构造器,则系统不再提供无参构造器,所以通常来说在一类中有一个无参构造器和一个有参构造器

(注意:一般在类中定义构造器【无参和全参】【抽象类、接口、继承时会调用父类的无参构造器;在框架中会调用无参构造器】)


成员变量默认初始化

引用变量默认为null  ;基本数据类型默认为0   ;布尔类型默认为false;

练习

现有:

班级:班级编号、班级名、学生列表,班主任,班长

方法:统计学生住址地点的方法,返回学生的住址地点

//分析:类--》属性--》方法--》测试
//班级Clazz--班级编号、班级名、学生列表,班主任,班长
//学生Student--姓名,住址地点

public class Clazz {
	//-- 班级编号、班级名、学生列表
	String code;
	String name;
	Student[] students;
	//--班主任
	Teacher teacher;
	//--班长
	Student monitor;
	
	public Clazz() {//无参构造器
	}
	public Clazz(String n,Student[] stus) {//有参构造器
		name=n;
		students=stus;
	}
	
	//统计学生住址地点的方法,返回学生的住址地点
	String[] getStuAddress() {
		//1\创建一个数组,用于存放地址
		String[] adds = new String[students.length];
		//2\遍历学生,把地址存放到adds中
		for(int i=0;i<students.length;i++) {
			adds[i] = students[i].address;
		}
		//3\返回数组
		return adds;
	}
}

//学生类
public class Student {
	// 外貌--属性--静态特征
	String name;
	String address;
    String sex;

	// 行为--方法--动态特征

	// 构造器本质是一个特殊的方法【不需要返回值类型、方法名和类名一致】
	// 无参构造器
	public Student() {
	}
	public Student(String n,String a) {
		name=n;
		address=a;
	}
	//全参构造器:在创建对象的同时,给成员变量赋值
	public Student(String n,String s,int a) {
		name=n;
		sex=s;
		age=a;
	}
}
//测试类
public class ClazzTest {
	public static void main(String[] args) {
		// 统计班级中学生的地址信息

		// 提供学生
		Student stu1 = new Student("zhang", "gz");
		Student stu2 = new Student("li", "sz");
		Student stu3 = new Student("wang", "zh");
		// 提供班级
		Clazz clazz = new Clazz("春田花花幼儿园", new Student[] { stu1, stu2, stu3 });
		// 调用班级的方法,得到地址信息
		String[] adds = clazz.getStuAddress();
		// 遍历显示地址
		for (String string : adds) {
			System.out.println(string);
		}
	}
}

对象创建的内存分析

  1. 定义引用类型变量在main方法栈,而对象是在堆内存中创建的。
  2. 初始化有默认值,赋值就是把默认值给覆盖了。
  3. 方法只有调用的时候,才会入方法栈,用完便会释放出栈。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO-World——S

文章目录 Abstract成果 MethodPre-training Formulation: Region-Text PairsModel ArchitectureYOLO DetectorText EncoderText Contrastive HeadTraining with Online VocabularyInference with Offline Vocabulary Re-parameterizable Vision-Language PANText-guided CSPLay…

强烈推荐 ——电脑终端管理系统

强烈推荐&#xff01;电脑终端管理系统 电脑终端管理系统使用的目的是为了管控电脑上硬件和软件资产&#xff0c;以及员工使用电脑的行为&#xff0c;最终目的是为了保护企业资产和信息&#xff0c;以下是一些推荐的电脑终端管理系统&#xff0c;这些系统为企业提供了强大的功…

C语言基础入门案例(2)

目录 第一题&#xff1a;编写一个基于switch语句的等级评估程序 第二题&#xff1a;学生成绩评定 第三题&#xff1a;计算圆的周长和面积 第四题&#xff1a;将三个整数按从大到小顺序输出 第五题&#xff1a;打印九九乘法表 第一题&#xff1a;编写一个基于switch语句的等…

TXT文本批量高效编辑,支持给文章结尾进行添加上相同的结语,轻松应对多个文本

在信息爆炸的时代&#xff0c;我们每天面对大量的文本信息&#xff0c;无论是工作文档、新闻稿件还是社交媒体内容&#xff0c;都需要进行高效、精准的编辑。而XT文本批量编辑器正是您理想的助手&#xff0c;它支持批量高效编辑&#xff0c;更能在文章结尾添加上您想要的相同结…

Knowledge Editing for Large Language Models: A Survey

目录 IntroductionProblem Formulation评估指标Methods数据集应用讨论挑战未来方向 大型语言模型&#xff08;LLMS&#xff09;最近由于其出色的理解&#xff0c;分析和生成文本的能力而根据其广泛的知识和推理能力来改变了学术和工业景观。然而&#xff0c;LLM的一个主要缺点是…

韩顺平Java | C25 JDBC和连接池(上)

概述 JDBC概述&#xff1a;JDBC为访问不同数据库提供统一接口&#xff0c;为使用者屏蔽细节问题。Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 // 模拟代码 //JdbcInterface.java --Java规定的JDBC接口(方法) p…

计算机网络——抓取icmp包

前言 本博客是博主用于记录计算机网络实验的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 抓包 我们是用Wireshark工具来进行抓包的。 ​在安装时候一路打勾安装即可&#xff0c;不过最后那个因为是英文&#xff0c;一定要看清&#xff0c;点了立即重启&am…

采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示

采用C#.Net JavaScript 开发的云LIS系统源码 二级医院应用案例有演示 一、系统简介 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0…

【UE5.1】使用MySQL and MariaDB Integration插件——(2)查询

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;1&#xff09;连接MySQL&#xff09;基础上继续实现查询MySQL数据表功能。 效果 步骤 1. 这里先新建一个控件蓝图&#xff0c;命名为“WBP_OperateDB”&#xff0c;该界面用于在连接数据…

Java——线程

程序 为实现某些功能&#xff0c;使用计算机语言编写的一系列指令(代码)的集合 特指静态的&#xff0c;安装在硬盘中的代码集合 进程 运行中的程序(被加载到内存中)&#xff0c;是操作系统进行资源分配的最小单位 线程 进程可以进一步细化为线程&#xff0c;是进程内一个…

运费计算(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int distance, c;float weight, price, discount, fee;//提示用户&#xff1b;printf("请输入路程&#xff0c;单价…

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶&#xff0c;这一愿景愈发接近现实。马斯克生动比喻&#xff0c;未来的乘客步入汽车就如同走进一部自动化的电梯&#xff0c;无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

C语言基础---指针的基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实…

六、数据呈现

目录 6.1 理解输入输出 6.1.1 标准文件描述符 1 STDIN &#xff08;0&#xff09; 2 STDOUT &#xff08;1&#xff09; 3 STDERR&#xff08;2&#xff09; 6.1.2 重定向错误 1 只重定向错误 2 重定向错误和数据 6.2 在脚本中重定向输出 6.2.1 临时重定向 6.2.2 永…

腾讯云全新云服务器实例S8/M8正式上线,性能提升高达115%!

2024年4月15日&#xff0c;腾讯云正式上线第八代云服务器标准型实例 S8和内存型实例M8。基于自研服务器的高密设计与硬件升级&#xff0c;搭载第五代英特尔至强可扩展处理器的腾讯云实例S8/M8&#xff0c;计算性能大幅提升&#xff0c;对比腾讯云云服务器上代实例&#xff0c;整…

Ubuntu 22.04安装中文输入法

1. 安装 sudo apt install fcitx5 2. 管理已安装的语言 Setting->Region & Language->Manage Installed Language 在下图中点击“安装”&#xff0c;之后需要等一会 选择Fcitx 5 3. 添加输入法 Setting->Keyboard 点击chinese 选择你想要的输入法 重启一下&a…

React + 项目(从基础到实战) -- 第七期

使用ant design 表单组件,开发登录,注册,搜索功能 React 表单组件 ,受控组件 案列 使用defaultVlue属性 bug : 改变了数据源,但是页面未重新渲染 {/* 表单组件 */}<button onClick{()>{console.log(text);}}>打印</button><button onClick{()>[setText(&…

【网络编程】Linux网络内核结构以及分布剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之Linux网络内核结构以及分布剖析&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何实现网络数据的输入和输出的&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助…

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama&#xff1a;开源小语言模型 【Abstract】 我们推出了 TinyLlama&#xff0c;这是一个紧凑的 1.1B 语言模型&#xff0c;在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2&#xff08;Touvron 等人&#xff0c;2023b&#xff…

【Python】#3 基本程序控制

文章目录 一、分支结构if语句&#xff08;Python没有switch&#xff09;tips:紧凑形式&#xff1a;适用于简单表达式的二分支结构 二、循环结构1. for语句range函数 2. while语句3. 循环保留字&#xff1a;break/continue与带else的循环语句 一、分支结构if语句&#xff08;Pyt…