【韩老师零基础30天学会Java 】07章 面向对象编程(基础)

第七章 面向对象编程(基础)

1. 类与成员方法

类与对象关系示意图
在这里插入图片描述

  • 示例:代码
import java.util.Scanner;public class IntDetail{public static void main(String[] args){Cat cat1=new Cat();cat1.name="小花";cat1.age=12;cat1.color="白";Cat cat2=new Cat();cat2.name="小蓝";cat2.age=100;cat2.color="蓝";System.out.println("第一只猫颜色:"+" "+cat1.name+" "+cat1.age+" "+cat1.color+" "+"第二只猫颜色:"+" "+cat2.name+" "+cat2.age+" "+cat2.color);					}
}
class Cat{String name;int age;String color;
}

类与对象的区别和联系:

  1. 类是抽象的,概念的,代表一类事物,比如人类,猫类… 即它是数据类型。
  2. 对象是具体的,实际的,代表一个具体事物,即 是实例。
  3. 类是对象的模板,对象是类的一个个体,对应一个实例。

对象在内存中的存在形式:
在这里插入图片描述

属性使用注意细节:

  1. 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;这里老师简单的介绍访问修饰符: 控制属性的访问范围。有四种访问修饰符 public,proctected,默认,private ,后面我会详细介绍。
  2. 属性的定义类型可以为任意类型,包含基本类型或引用类型。
  3. 属性如果不赋值,有默认值,规则和数组一致。具体说:
    int 0,short 0,byte 0, long 0, float 0.0,double 0.0, char \u0000, boolean false,String null。

思考题:在这里插入图片描述
内存图:
在这里插入图片描述

类和对象的内存分配机制
Java内存的结构分析

  1. 栈: 一般存放基本数据类型(局部变量)
  2. 堆: 存放对象(Cat cat,数组等)
  3. 方法区:常量池(常量,比如字符串),类加载信息

示例:
在这里插入图片描述
练习题:
在这里插入图片描述
答案:
小明✅
0❌正确答案:200
0❌正确答案:会抛出异常
分析图:
在这里插入图片描述

2. 成员方法🚩

成员方法快速入门:
在这里插入图片描述

  • 代码
import java.util.Scanner;public class IntDetail{public static void main(String[] args){Person peraon1=new Person();peraon1.speak();System.out.println();peraon1.cal01();Scanner myScanner=new Scanner(System.in);System.out.println("请输入一个整数n:");int n=myScanner.nextInt();peraon1.cal02(n);System.out.println("请输入一个整数n1:");int n1=myScanner.nextInt();System.out.println("请输入一个整数n2:");int n2=myScanner.nextInt();int sum=peraon1.getSum(n1,n2);System.out.println(n1+"+"+n2+"的结果是:"+sum);	}
}
class Person{String name;int age;//1.public 表示方法是公开
//2.void :表示方法没有返回值
//3.speak():speak是方法名,()形参列表
//4.{}方法体,可以写我们要执行的代码
//5.System.out.println("我是一个好人”);表示我们的方法就是输出一句话public void speak(){System.out.println("我是一个好人");}public void cal01(){int sum=0;for(int i=1;i<=1000;i++){sum+=i;}System.out.println("1+...+1000的结果是:"+sum);}public void cal02(int n){int sum=0;for(int i=1;i<=n;i++){sum+=i;}System.out.println("从1+...+"+n+"的结果是:"+sum);}public int  getSum(int n1,int n2){int sum=n1+n2;return sum;}}

输出结果:
在这里插入图片描述

方法的调用机制:❗
在这里插入图片描述

示例:多次输出数组

import java.util.Scanner;public class IntDetail{public static void main(String[] args){int[][] arr={{0,0,1},{1,1,1,},{1,1,3}};MyTools myTool=new MyTools();myTool.printArr(arr);myTool.printArr(arr);myTool.printArr(arr);}
}class MyTools{public void printArr(int[][] map){System.out.println("=================");for(int i=0;i<map.length;i++){for(int j=0;j<map[0].length;j++){System.out.print(map[i][j]+" ");}System.out.println();}	}
}

输出结果:
在这里插入图片描述

方法使用细节1.
在这里插入图片描述

成员方法使用细节2
在这里插入图片描述
方法不能嵌套定义❗❗

成员方法使用细节3
同一个类中的方法调用:直接调用即可。
在这里插入图片描述
跨类中的方法A类调用B类方法:需要通过对象名调用。
在这里插入图片描述

练习题:
在这里插入图片描述

  • 第一题代码:
import java.util.Scanner;public class IntDetail{public static void main(String[] args){int n=23;AA a=new AA();if(a.isOdd(n)){System.out.println(n+"是奇数");}else{System.out.println(n+"是偶数");}	}
}class AA{public boolean isOdd(int n){// if(n%2==1){// 	return true;// }else{// 	return false;// }return n%2!=0;}	
}
  • 第二题代码:
import java.util.Scanner;public class IntDetail{public static void main(String[] args){int n=4;int m=3;char ch='#';printchar p=new printchar();p.prichar(n,m,ch);}	
}
class printchar{public void prichar(int n,int m,char ch){for(int i=0;i<n;i++){for(int j=0;j<m;j++){System.out.print(ch+" ");}System.out.println();}}
}

运行结果:
在这里插入图片描述

3. 成员方法传参机制🚩

基本数据类型传参机制:
在这里插入图片描述
结论: 基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参❗❗❗

引用数据类型传参机制:

  • 代码:
import java.util.Scanner;public class IntDetail{public static void main(String[] args){//!!!数组是引用类型!!!int[] arr={1,2,3};BB b=new BB();b.test100(arr);System.out.println("=mian===========");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");//200 2 3}}	
}
class BB{public void test100(int[] arr){arr[0]=200;for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");//200 2 3}System.out.println();}}

结论: 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参❗❗❗

克隆对象

  • 代码:将p1克隆给p2,但不是同一个对象,是两个独立的空间。
import java.util.Scanner;public class IntDetail{public static void main(String[] args){Person p1=new Person();p1.name="小明";p1.age=20;MyTools myTool=new MyTools();Person p2=myTool.copyPerson(p1);System.out.println("p2的信息:"+p2.name+" "+p2.age);//可以同对象比较看看是否为同一个。System.out.println(p1==p2);//false}
}
class Person{String name;int age;}
class MyTools{public Person copyPerson(Person p){Person p2=new Person();p2.name=p.name;p2.age=p.age;return p2;}}

递归能解决什么问题?
在这里插入图片描述
递归执行机制:

举例1:打印问题

在这里插入图片描述

举例2:阶乘问题

在这里插入图片描述

递归重要规则:

  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
  2. 方法的局部变量是独立的,不会相互影响,比如n变量
  3. 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。
  4. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行
    完毕。

练习1:
请使用递归的方式求出斐波那契数1,1,2,3,5,8,13…给你一个整数n,求出第n个斐波那契数是多少?
在这里插入图片描述

  • 代码:输出斐波那契数

import java.util.Scanner;public class IntDetail{public static void main(String[] args){Fibo f=new Fibo();int n=7;System.out.println("当n="+n+"对应的斐波那契数="+ f.fibonacci(7));}
}
class Fibo{public int fibonacci(int n){if(n>=1){if(n==1||n==2){return 1;}else{return fibonacci(n-1)+fibonacci(n-2);}}else{System.out.println("请输入正确整数:");return -1;}}
}

练习2:猴子吃桃子问题

在这里插入图片描述
思路:
在这里插入图片描述

  • 代码:
import java.util.Scanner;public class IntDetail{public static void main(String[] args){Taozi t1=new Taozi();int day=9;int peachNum=t1.peach(day);if(peachNum!=-1){System.out.println("第"+day+"天有"+ peachNum+"个桃子");}}
}class Taozi{public int peach(int day){if(day==10){return 1; }else if(day>=1&&day<=9){return (peach(day+1)+1)*2;}else{return -1;}}
}

迷宫问题

分析:

  1. findway方法就是专内来找出迷宫的路径。
  2. 如果找到,就返回 true,否则返回false。
  3. map 就是二维数组,即表示迷宫。
  4. i,j 就是老鼠的位置,初始化的位置为(1,1)。
  5. 因为是递归的找路,所以我先规定 map数组的各个值的含义:0 表示可以走 ,1 表示障碍物 ,2 表示可以走 ,3 表示走过,但是走不通是死路。
  6. 当map[6][5]=2 就说明找到通路,就可以结束,否则就继续找。
  7. 先确定老鼠找路策略 下->右->上->左
  • 代码

public class IntDetail{public static void main(String[] args){int[][] map=new int[8][7];for(int i=0;i<map.length;i++){map[i][0]=1;map[i][6]=1;}for(int j=0;j<map[0].length;j++){map[0][j]=1;map[7][j]=1;}map[3][1]=1;map[3][2]=1;map[3][4]=1;map[4][3]=1;//输出当前地图System.out.println("=====当前地图情况=====");for(int i=0;i<map.length;i++){for(int j=0;j<map[0].length;j++){System.out.print(map[i][j]+" ");}System.out.println();}T t1=new T();t1.findWay(map,1,1);System.out.println("\n=====找路情况如下=====");for(int i=0;i<map.length;i++){for(int j=0;j<map[0].length;j++){System.out.print(map[i][j]+" ");}System.out.println();}}
}class T{public boolean findWay(int[][] map,int i,int j){if(map[6][5]==2){//说明已找到return true;}else{if(map[i][j]==0){map[i][j]=2;if(findWay(map,i+1,j)){//下return true;}else if(findWay(map,i,j+1)){//右return true;}else if(findWay(map,i-1,j)){//上return true;}else if(findWay(map,i,j-1)){//左return true;}else{map[i][j]=3;return false;}}else{return false;}}}
}

输出结果:
在这里插入图片描述

修改找路策略:
先走上-右-下-左
在这里插入图片描述

结果:在这里插入图片描述

汉诺塔

写代码的时候就按照只有两个盘的移动顺序写。

  • 代码
//最终移动到c盘
public class IntDetail{public static void main(String[] args){int num=2;char a='a';char b='b';char c='c';Tower tower=new Tower();tower.move(num,a,b,c);}
}class Tower{public void move(int num,char a,char b,char c){if(num==1){System.out.println(a+"->"+c);}else{//(1)移动上面所有盘到b,借助cmove(num-1,a,c,b);//(2)把下面的盘移动到cSystem.out.println(a+"->"+c);//(3)把b塔所有的盘,移动到c,借助amove(num-1,b,a,c);}}
}

输出结果:
在这里插入图片描述

八皇后:回溯算法的典型案例

4. overload(重载)

基本介绍
在这里插入图片描述
代码示例:
在这里插入图片描述
案例:
在这里插入图片描述
代码:
在这里插入图片描述
注意事项和使用细节:
在这里插入图片描述
练习题1:
在这里插入图片描述
答案:c、e、g❌
正确答案:
b、c、d、e
练习题2:
在这里插入图片描述
练习题3:在这里插入图片描述

5. 可变参数

基本概念:
在这里插入图片描述
基本语法:
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出结果:
在这里插入图片描述
在这里插入图片描述

可变参数的注意事项和使用细节:
在这里插入图片描述

练习题1:
在这里插入图片描述

6. 作用域

局部变量一般是指在成员方法中定义的变量。
全局变量:也就是属性,作用域为整个类体。
局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中!
全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后才能使用,因为没有默认值。

7. 构造器🚩

8. this

作业

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超子物联网HAL库笔记:定时器[外部模式]篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一、资源介绍&#xff1a;STM32F103C8T6定时器资源介绍 高级定时器&#x…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构&#xff0c;肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权&#xff0c;负责对犯罪行为提起公诉&#xff0c;并监督整个诉讼过程&#xff0c;同时积极参与社会治理&#xff0c;保护公民权益&#xff0c;推动法…

7天用Go从零实现分布式缓存GeeCache(学习)(3)

目录结构 ├── geecache │ ├── byteview.go │ ├── cache.go │ ├── consistenthash │ │ ├── consistenthash.go │ │ └── consistenthash_test.go │ ├── geecache.go │ ├── go.mod │ ├── http.go │ ├── lru │ …

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

CLion配置QT开发环境

一、将qmake工程转为cmake工程&#xff08;方法一&#xff1a;用工具转换并做适当修改&#xff09; 1、工具链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码&#xff1a;7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

《AI 使生活更美好》

《AI 使生活更美好》 当我们步入科技腾飞的时代&#xff0c;人工智能&#xff08;AI&#xff09;如同一颗璀璨的新星&#xff0c;照亮了我们生活的每一个角落。它以惊人的速度改变着我们的世界&#xff0c;从医疗到教育&#xff0c;从交通到娱乐&#xff0c;AI 正以前所未有的力…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?

ODOO是一款开源的企业管理软件套件&#xff0c;广泛应用于企业管理中。它由比利时的Odoo S.A.公司开发&#xff0c;最初名为OpenERP&#xff0c;现在已经成为全球流行的ERP解决方案之一。ODOO集成了ERP、CRM、电子商务和CMS等多种功能模块&#xff0c;适用于各种规模的企业应用…

出海攻略,如何一键保存Facebook视频素材

提词宝&#xff1a;快速保存Facebook视频教程 目标人群与痛点 目标人群&#xff1a;经常在Facebook上浏览视频但不知道如何保存的用户&#xff0c;包括学生、内容创作者、营销从业者&#xff0c;以及需要保存重要视频素材的人。 痛点与场景&#xff1a; 看到喜欢的视频&…

【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框

哈喽&#xff0c;大家好&#xff0c;我是六哥&#xff01;今天我来给大家分享一下如何使用playwight处理Dialogs对话框&#xff0c;面向对象为功能测试及零基础小白&#xff0c;这里我尽量用大白话的方式举例讲解&#xff0c;力求所有人都能看懂&#xff0c;建议大家先收藏&…

LLM - 使用 LLaMA-Factory 微调大模型 Qwen2-VL SFT(LoRA) 图像数据集 教程 (2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143725947 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaMA-…

自动驾驶3D目标检测综述(一)

文章地址&#xff1a;[2206.09474] 3D Object Detection for Autonomous Driving: A Comprehensive Survey (arxiv.org) 这篇综述简单易懂&#xff0c;非常合适对自动驾驶和3D目标检测感兴趣的小白阅读&#xff0c;对相关算法进行初步理解。 目录 一、摘要 &#xff08;一&a…

回归分析学习

学习视频链接&#xff1a; 【回归分析,一套搞定】&#xff01;全网最通俗易懂的回归分析教程&#xff0c;我终于学明白了&#xff01;_哔哩哔哩_bilibili 相关分析&#xff1a;2个或两个以上的变量之间的相关程度及大小的统计方法&#xff1b; 回归分析&#xff1a;存在相关关…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

后端:Aop 面向切面编程

文章目录 1. Aop 初步学习面向切面编程&#xff0c;EnableAspectJAutoProxy2. AOP的核心概念3. 前置通知&#xff08;Before&#xff09;4. 后置通知&#xff08;After&#xff09;5. 返回通知&#xff08;AfterReturning&#xff09;6. 异常通知&#xff08;AfterThrowing&…

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

管家婆财贸ERP BB045.销售批量收款

最低适用版本: 财贸系列 22.8 插件简要功能说明: 销售类单据支持批量收款,简化收款做单流程更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--销售批量收款 插件详细功能文档: 1. 应用中心增加菜单【销售批量收款】 a. 参考23.0应用中心-移动管理-物联宝-【…