JAVA学习笔记20(面向对象编程)

1.3 方法递归调用

在这里插入图片描述

​ *阶乘

public int factorial(int n)
{
    if(n == 1){
        return 1;
    }
    else{
        return factorial(n-1)*n;
    }
}

1.递归重要规则

1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

2.方法的局部变量是独立的,不会相互影响,比如n变量

3.如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据

4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError

5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就,就将结果返回给谁,当方法执行完毕或者返回时,该方法也就执行完毕

2.斐波那契数列

public int fib(int n)
{
    if(n == 1 || n ==2)
    {
        return 1;
    }
    else
    {
		return fib(n-1) + fib(n-2);
    }
}

3.猴子吃桃

在这里插入图片描述

public int eatPeach(int day)
{
    if(day == 10)
    {
        return 1;
    }
    else if(day >=1 && day <=9)
    {
        return (eatPeach(day + 1)+1) * 2;
    }
}

4.老鼠走迷宫

0表示可以走,1表示障碍物,2表示走得通

public boolean findway(int[][] map, int i,int j)
{
    if(map[6][5] == 2)	//说明已经找到
    {
        return true;
    }
    else
    {
        if(map[i][j]==0)	//当前这个位置为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;
            }
        }
    }
}

5.汉诺塔

pubolic class HanoiTower{
    public static void main(String[] args){
       	Tower tower = new Tower();
        tower.move(1,'A','B','C');
    }
}

class Tower{
    
    //方法
    //num 表示要移动的个数,a,b,c分别表示A塔,B塔,C塔
    public void move(int num, char a,char b, char c)
    {
        if(num == 1){
            System.out.println(a + "->" + c);
        }else{
            //如果有多个盘,可以看成两个,最下面的和上面的所有盘(num-1)
            //1.先移动上面所有的盘到b,借助c
            move(num - 1,a,c,b);
            //2.把最下面的这个盘,移动到c
            System.out.println(a + "->" + c);
            //3.再把b塔的所有盘,移动到c,借助a
            move(num - 1,b,a,c);
            
        }
    }
}

1.4 方法重载(OverLoad)

​ *基本介绍

java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致。

class MyCalculator{
    public int calculate(int n1,int n2)
    {
        return n1 + n2;
    }
    
        public double calculate(int n1,double n2)
    {
        return n1 + n2;
    }
    
        public double calculate(double n1,int n2)
    {
        return n1 + n2;
    }
    
        public int calculate(int n1,int n2,int n3)
    {
        return n1 + n2 + n3;
    }
}

1.方法重载使用细节

1.方法名:必须相同

2.参数列表:必须不同(参数类型或个数或顺序,至少有一样不同,形参参数名无要求)

3.返回类型:无要求

1.4 可变参数

​ *基本概念:

java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法,就可以通过可变参数实现

​ *基本语法:

访问修饰符 返回类型 方法名(数据类型…形参名){

}

class HspMethod{
    //可以计算2个数的和,3个数,4,5,6...
    //可以使用方法重载
    public int sum(int n1, int n2){
        return n1 +n2;
    }
    public int sum(int n1,int n2, int n3){
        return n1 +n2 +n3;
    }
    public int sum(int n1,int n2, int n3,int n4){
        return n1 +n2 +n3+n4;
    }
    
    //上面三个方法名称相同,功能相同,但参数个数不同->使用可变参数优化
    //1.int...表示接受的是可变参数,类型是int,即可以接收多个Int(0-多)
    //2.使用可变参数时,可以当做数组来使用,即nums可以当做数组
    //3.遍历nums求和即可
    public int sum(int... nums){
        //System.out.println("接收的参数个数=" + nums.length);
        int res = 0;
        for(int i =0;i<nums.length;i++){
            res += nums[i];
        }
    }
}

1.可变参数的注意事项与细节

1.可变参数的实参可以为0个或任意多个

2.可变参数的实参可以为数组

3.可变参数的本质就是数组

4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后

5.一个形参列表中只能出现一个可变参数

public class VarParameterDetail{
    //编写一个main方法
    public static void main(String[] args){
        //细节:可变参数的实参可以为数组
        int[] arr = {1,2,3};
        T t1 = new T();
        t1.f1(arr);
    }
}

class T
{
    public void f1(int... nums){
        System.out.println("长度=" + nums.length);
    }
    
    //细节:可变参数和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
    public void f2(String str,double... nums){

    }
}

1.5 作用域

​ *提醒:

​ 1.主要的变量就是属性(成员变量)和局部变量

​ 2.我们所说的局部变量一般是指在成员方法中定义的量

​ 3.java中的作用域分类

​ *全局变量:也就是属性,作用域为整个类体

​ *局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块

class Cat
{
    //全局变量:也就是属性,作用域为整个类体
    int age = 10;	//全局变量
    
    public void cry()
    {
        //1.局部变量一般是指在成员方法中定义的量
        //2.n和name就是局部变量
        int n = 10;
        String name = "jack";
    }
}

​ 4.全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才可以使用,因为没有默认值

1.注意事项和细节

​ 1.属性和局部变量可以重名,访问时遵循就近原则

​ 2.在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名

​ 3.属性生命周期较长,伴随着对象的创建和死亡;局部变量生命周期较短,随着代码块的结束而死亡

​ 4.作用域范围不同

​ *全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)

​ *局部变量:只能在本类中对应的方法中使用

​ 5.修饰符不同

​ *全局变量/属性可以加修饰符

​ *局部变量不可以加修饰符(public,protected之类的)

1.6 构造方法/构造器

​ *构造方法又叫构造器,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化

​ 1.方法名和类名相同

​ 2.没有返回值

​ 3.在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化

​ *基本语法:

[修饰符] 方法名(形参列表){

​ 方法体;

}

​ *说明:

1.构造器的修饰符可以默认,也可以是public protected private

2.构造器没有返回值

3.方法名 和类名字必须一样

4.参数列表和 成员方法一样的规则

5.构造器的调用由系统完成

main()
{
    Person p1 = new Person("smith", 80);
}

class Person{
    String name;
    int age;
    //1.构造器没有返回值,也不能写void
    //2.构造器的名称和类Person一样
    //3.(String pName, int pAge)是构造器形参列表,规则和成员方法一样
    public Person(String pName, int pAge)
    {
        System.out.println("构造器被调用~");
        name = pName;
        age = pAge;
    }
}

1.注意事项和使用细节

​ 1.一个类可以定义多个不同的构造器,即构造器重载

​ 2.构造器名和类名要相同

​ 3.构造器没有返回值

​ 4.构造器是完成对象的初始化,而不是创建对象

​ 5.在创建对象时,系统自动的调用该类的构造方法

​ 6.如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法,比如Person(){},使用javap指令,可以反编译查看

​ 7.一但定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器

1.7 this关键字

​ *java虚拟机会给每个对象分配this,代表当前对象。

class Dog{
    String name;
    int age;
    public Dog(String name, ing age){
        //this指当前变量的属性值
        this.name = name;
        this.age = age;
    }
}

​ *哪个对象调用,this就指向哪个对象值

1.this使用注意事项和细节

​ 1.this关键字可以用来访问本类的属性、方法、构造器

this.name

​ 2.this用于区分当前类的属性和局部变量

​ 3.访问成员方法的语法:this.方法名(参数列表);

class T{
    //细节:访问成员方法的语法:this.方法名(参数列表);
    public void f1()
    {
		System.out.println("f1()方法");
        
    public void f2(){
        System.out.println("f2()方法");
    	//调用本类的f1
        //方法一:
        f1();
        //方法二:
        this.f1();
    }
    }
}

​ 4.访问构造器语法:this(参数列表);只能在构造器中使用(即只能在构造器中访问另外一个构造器) 必须放在构造器的第一条语句

class T	
{
    //细节:访问构造器语法:this(参数列表);
    //只能在构造器中使用(即只能在构造器中访问另外一个构造器)
    //注意:访问构造器语法:this(参数列表);必须放在构造器的第一条语句
    
    public T(){
                //这里去访问T(String name,int age)构造器
        this("jack", 100);
        System.out.println("T() 构造器");

    }
    
    public T(String name,int age){
        System.out.println("T(String name, int age) 构造器");
    }
}

​ 5.this不能在类定义的外部使用,只能在类定义的方法中使用

class T{
    
    //this关键字可以用来访问本类的属性
	public void f3()
    {
        String name = "smith";
        //传统方式
        System.out.println("name=" + name + " num=" + num);	//输出smith,会按照就近原则调用局部变量
        //也可以使用this访问属性
         System.out.println("name=" + this.name + " num=" + this.num);	//直接调用类中的成员属性
    }
}

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

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

相关文章

反序列化漏洞简单知识

目录&#xff1a; 一、概念&#xff1a; 二、反序列化漏洞原因 三、序列化漏洞的魔术方法&#xff1a; 四、反序列化漏洞防御&#xff1a; 一、概念&#xff1a; 序列化&#xff1a; Web服务器将HttpSession对象保存到文件系统或数据库中&#xff0c;需要采用序列化的…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大&#xff0c;自带代理创建&#xff0c;自带beacon通信&#xff01;&#xff01;&#xff01; 一张图&#xff0c;就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后&#xff0c;我们都会选择sleep时间&#xff0c;…

代码随想录算法训练营Day56 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离

647. 回文子串 dp[i][j]表示第i位开始&#xff0c;第j位结束的字符串是否为回文串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1…

Redis 教程系列之Redis PHP 使用 Redis(十二)

PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前&#xff0c; 我们需要确保已经安装了 redis 服务及 PHP redis 驱动&#xff0c;且你的机器上能正常使用 PHP。 接下来让我们安装 PHP redis 驱动&#xff1a;下载地址为:https://github.com/phpredis/phpredis/releases。 P…

Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

垂直起降机场:飞行基础设施的未来是绿色的

电动垂直起降&#xff08;eVTOL&#xff09;飞机的日益发展为建立一个新的网络来支持它们提供了理由&#xff0c;这将推动开发绿色基础设施新模式的机会。这些电气化的“短途”客运和货运飞机通常被描述为飞行汽车&#xff0c;是区域飞行和城市出租车的未来&#xff0c;有可能提…

为什么 Hashtable 不允许插入 null 键 和 null 值?

1、典型回答 浅层次的来回答这个问题的答案是&#xff0c;JDK 源码不支持 Hashtable 插入 value 值为 null&#xff0c;如以下JDK 源码所示&#xff1a; 也就是JDK 源码规定了&#xff0c;如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常 并目看上面的JDK 源码可…

2024全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台

2024全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88948076 更多资源下载&#xff1a;关注我。

蓝桥杯基础练习详细解析一(代码实现、解题思路、Python)

试题 基础练习 数列排序 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第…

吴恩达2022机器学习专项课程(一) 3.6 可视化样例

问题预览 1.本节课主要讲的是什么&#xff1f; 2.不同的w和b&#xff0c;如何影响线性回归和等高线图&#xff1f; 3.一般用哪种方式&#xff0c;可以找到最佳的w和b&#xff1f; 解读 1.课程内容 设置不同的w和b&#xff0c;观察模型拟合数据&#xff0c;成本函数J的等高线…

MQ领消息丢失方案

⼀、哪些场景会丢失消 业务场景&#xff1a;下单⽀付成功后、给⽤户发送消费 ⽤户反馈&#xff1a;⽀付成功以后&#xff0c;没有收到优惠券。原因&#xff1a;⽀付成功的消息丢失了 ⼆、可能丢失消息的环节&#xff1a; 1、订单系统&#xff08;⽣产者&#xff09;向MQ推送…

pytorch 实现线性回归 softmax(Pytorch 04)

一 softmax 定义 softmax 是多分类问题&#xff0c;对决策结果不是多少&#xff0c;而是分类&#xff0c;哪一个。 为了估计所有可能类别的条件概率&#xff0c;我们需要一个有 多个输出的模型&#xff0c;每个类别对应一个输出。为了解决线 性模型的分类问题&#xff0c;我们…

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时&#xff0c;看不到多久可以完成&#xff0c;虽然加上-v参数也只能看到正在拷贝文件&#xff0c;那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

【旅游景点项目日记 | 第二篇】基于Selenium爬取携程网景点详细数据

文章目录 3.基于Selenium爬取携程网景点详细数据3.1前提环境3.2思路3.3代码详讲3.3.1查询指定城市的所有景点3.3.2获取详细景点的访问路径3.3.3获取景点的详细信息 3.4数据库设计3.5全部代码3.6效果图 3.基于Selenium爬取携程网景点详细数据 3.1前提环境 确保安装python3.x环…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

Windows 进程权限浅谈 -- 提权 / 降权

在 Windows 上&#xff0c;用户对权限并不敏感&#xff0c;可能最为直观的是 UAC &#xff0c;但相信很多人已经关掉了它的提示。 但其实安全性早已深入了 Windows 的方方面面。Windows Vista 引入了一个称为强制完整性控制&#xff08;Mandatory Integrity Controls&#xff0…

BMS设计中的短路保护和MOSFET选型(上)

电池管理系统&#xff08;BMS&#xff09;是一种能够对电池进行监控和管理的电子装备&#xff0c;是电池与用户之间的纽带。通过对电压、电流、温度以及SOC等数据采集&#xff0c;计算进而控制电池的充放电过程&#xff0c;主要就是为了能够提高电池的利用率&#xff0c;防止电…

【Python从入门到进阶】51、电影天堂网站多页面下载实战

接上篇《50、当当网Scrapy项目实战&#xff08;三&#xff09;》 上一篇我们讲解了使用Scrapy框架在当当网抓取多页书籍数据的效果&#xff0c;本篇我们来抓取电影天堂网站的数据&#xff0c;同样采用Scrapy框架多页面下载的模式来实现。 一、抓取需求 打开电影天堂网站&…

Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)

Ubuntu Desktop 更改默认应用程序 [Videos -> SMPlayer] References System Settings -> Details -> Default Applications 概况、默认应用程序、可移动介质、法律声明 默认应用程序&#xff0c;窗口右侧列出了网络、邮件、日历、音乐、视频、照片操作的默认应用程序…

OCR如何解决字体多样性难题?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术的确是一项非常实用的技术&#xff0c;能够将图像中的文字转化为可编辑的文本&#xff0c;大大提高了工作效率。然而&#xff0c;你所遇到的问题——字体多样性导致的模型泛化能力不足&a…