精华内容
下载资源
问答
  • java方法定义的时候是不允许嵌套一个方法吗 内部类分为静态和非静态的吗
  • Java方法嵌套与递归调用

    千次阅读 多人点赞 2020-03-20 15:15:32
    本文关键字:方法嵌套、递归、经典问题。方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是...

    写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。

    • 对于文章中出现的任何错误请大家批评指出,一定及时修改。
    • 有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。
    • 发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    Java方法的嵌套与递归调用

    本文关键字:方法、嵌套、递归、经典问题

    一、方法的嵌套

    1. 概念解读

    方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。

    2. 方法嵌套

    在编程中最常见的就是方法与方法之间的调用嵌套,因为通常情况下,我们解决一个问题不会只靠一个方法。而且如果一个方法所提供的功能十分强大,那势必其中的代码逻辑和参数列表也会变的相对复杂,不利于修改和使用,所以我们希望,每个方法都是一个个小小的利刃,用来解决特定的问题,通过组合使用的方式来完成一个较为复杂的功能,就像雷恩的七星刀一样。
    在这里插入图片描述
    比如,我们已经有了两个方法:分别用于计算圆的面积和计算矩形的面积,如果我们现在需要算一个圆柱的表面积,我们还需要把整个方法重写一遍吗?当然不需要,因为圆柱的表面积的计算刚好可以通过两个圆柱底面积(圆)加圆柱侧面积(矩形)得到,我们只需要合理的传入参数和进行值的返回即可实现。

    public class Test{
        public static void main(String[] args){
            // 计算一个圆柱的面积,已知底面半径和高
            int radius = 5;
            int height = 10;
            // 调用计算圆柱表面积
            double area = getColumnArea(radius,height);
            // 输出结果
            System.out.println("圆柱的表面积为:" + area);
        }
        public static double getCircleArea(double radius){
            // 根据圆的半径计算面积后返回
            return Math.PI * Math.pow(radius,2);
        }
        public static double getRectangleArea(double width,double height){
            // 根据宽和高计算面积后返回
            return width * height;
        }
        public static double getColumnArea(double radius,double height){
            // 计算得到底面积 -> 刚好是侧面积的宽
            double baseArea = getCircleArea(radius);
            // 计算得到侧面积
            double lateralArea = getRectangleArea(baseArea,height);
            // 根据底面积及侧面积计算后返回
            return baseArea * 2 + lateralArea;
        }
    }
    

    那么,整个方法的执行过程是怎样的呢?其实依然是个顺序结构,当一个被调用的方法完全执行后才会继续进行后续的步骤,我们可以将这个过程描述如下:
    在这里插入图片描述

    3. 构造嵌套

    在之前的文章中已经向大家介绍了构造器的重载,可以适用于对不同个数的属性进行初始化,直击传送门:Java初始化对象的工具 - 构造器。但是在使用时我们会发现一个问题,构造器的主要用途是为属性赋值,但是在构造器重载时会发现,一样有代码的冗余,会出现为很多相同的赋值语句,作为强迫症的重度患者,这是不能忍受的,看下面的例子:

    public class Person{
        // 一参构造器
        public Person(String name){
            this.name = name;
        }
        // 两参构造器,可以给name和age属性赋值
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }
        // 三参构造器,可以给name、age和job属性赋值
        public Person(String name,int age,String job){
            this.name = name;
            this.age = age;
            this.job = job;
        }
        public String name;
        public int age;
        public String job;
    }
    

    在上面的例子中一共定义了三个构造器,分别满足不同的初始化需要(当然,我们还可以定义的更多),但是可以发现很多赋值语句都是重复的,我们可以通过构造器互相调用的方式来减少代码量。在当前类中构造器进行相互调用,使用this()的方式来完成,括号中填入相应的参数,修改后代码如下。

    public class Person{
        // 一参构造器
        public Person(String name){
            this.name = name;
        }
        // 两参构造器,可以给name和age属性赋值
        public Person(String name,int age){
            this(name);
            this.age = age;
        }
        // 三参构造器,可以给name、age和job属性赋值
        public Person(String name,int age,String job){
            this(name,age);
            this.job = job;
        }
        public String name;
        public int age;
        public String job;
    }
    

    假如在测试类中使用三参构造器来初始化一个Person对象:Person person = new Person(“小张”,25,”工程师“);则执行过程如下:
    在这里插入图片描述

    二、方法的递归

    1. 概念解读

    递归是一种计算过程或方法,是一种将问题分解为同类的子问题来解决问题的方法,那么什么是同类子问题呢?就是对一个大问题进行拆解,而得到的子问题又是同一规则,或同一种操作,比如最简单的阶乘计算。假如我们需要计算4的阶乘,直接用数学的方式写出来是4! = 4 x 3 x 2 x 1。
    那么我们如何用计算机解决这个问题呢?当然,我们可以使用循环,从给定的数一直乘到1为止:

    public class Test{
        public static void main(String[] args){
            int n = 4;
            int result = 1;
            for(int i = n;i <= 1;i--){
                result *= i;
            }
            System.out.println(result);
        }
    }
    

    但是其实这可以总结或者分解为一个规律:n! = n x (n - 1)!,n ≥ 2;n! = 1,n = 1。那这和循环又有什么区别呢?区别在于我们在使用循环时,我们自己将这个计算过程完全翻译成了计算机可以读懂和直接执行的代码,而却没有了原本的意义,并且在某些情况下,并不是所有问题都可以通过循环结构实现。另外一方面,计算理论可以证明递归的作用可以完全取代循环,但是出于性能的考虑,我们也不会刻意的用递归去代替循环,而更偏向于使用递归去解决某一类特定的问题。

    2. 递归思想

    从上面的介绍中可以看到,我们希望通过递归的思想尽量的贴近原有问题的描述,并能将问题很好的解决。从代码的角度来看,递归方法一句话来概括就是:自己调用自己。为什么这么说呢?因为整个的执行过程都是通过重复一个步骤来实现的,每一步结果的产生都来自于上一步或前一步。那么问题就来了,什么时候是个头呢?这就引出了一个概念:递归的出口
    就像循环需要有一个终止条件一样,递归在不断的调用自己,去获取自己所需要的结果,那同样要有一个终止条件,这个条件的设定通常比较明显,那就是能得到一个确切的结果时,就不需要再进行递归调用了,此时直接将具体结果返回就可以了,比如我们使用递归去实现阶乘:

    public class Test{
        public static void main(String[] args){
            int n = 4;
            int result = getFactorial(n);
            System.out.println(result);
        }
        // 定义一个方法,用于计算n的阶乘,不考虑n < 0的情况
        public static int getFactorial(int n){
            // 递归的出口
            // 描述当n = 1时,阶乘的结果为1,直接返回确定的结果
            if(n == 1){
                return 1;
            }else{
                // 根据规律,此时应该先获取到n - 1的阶乘的结果
                // 描述当n ≥ 2时,n! = n x (n - 1)!
                return n * getFactorial(n - 1);
            }
        }
    }
    

    当我们整理出一个公式或描述出一个规律之后,我们可以尝试按照如下思路进行思考:

    • 首先需要确定递归的出口,也就是判断条件,通常出口即为:能够得到确定值时传入参数的取值
    • 接下来就是确定出口的内容,也就是符合判断条件时,得到的确定值
    • 最后就是递归调用的部分,根据总结出的规律,用表达式表述出来

    3. 执行过程

    如果大家理解了这个分解的过程,那么我们已经从代码上实现了这个描述,当n = 1时,直接就可以得到确定的结果:1;当n ≥ 2时,通过递归调用(调用自己),将n - 1作为参数传入,代表想要获取n - 1的递归的值,将n - 1传入后,如果不能得到确定的结果,就会继续调用,那么整体的运算过程可以用下图来表示:
    在这里插入图片描述

    4. 经典问题

    • 斐波那契数列

    斐波那契数列是一个很经典的数列,第一项为1,第二项为1,从第三项开始,每一项的值都是前两项的和,用数学的方式整理一下就是:当n = 1或n = 2时,f(n) = 1;当n ≥ 3时,f(n) = f(n - 1) + f(n - 2)。按照之前的步骤,我们可以确定出口为n = 1或n = 2,得到的确定值为:1,递归调用的部分即为:f(n - 1) + f(n - 2),据此写出程序:

    public class Test{
        public static void main(String[] args){
            int n = 5;// 自定义一个正整数n
            int result = f(n);
            System.out.println(result);
        }
        public static int f(int n){
            // 递归出口:当n = 1或n = 2时终止调用,得到确定的值
            if(n == 1 || n == 2){
                return 1;
            }else{
                // 自第三项开始,结果为前两项的加和
                return f(n - 1) + f(n - 2);
            }
        }
    }
    
    • 杨辉三角

    杨辉三角是一个很有趣的图形,一个金字塔的构图,顶部和两侧的值固定为1,此时你应该想到什么?没错,递归出口!其他部分的值为上一层中与它最邻近的两个值的加和,如:自顶向下(第4层,第3列),它的值为(第3层,第2列) + (第3层,第3列)。
    在这里插入图片描述
    如果我们用变量i代表层,j代表这一层的列,那么(i,j)的值为(i - 1,j - 1) + (i - 1,j),这是什么?没错,规律的描述!最后我们只需要搞定递归出口的判定条件,一切就大功告成啦!由上面的构图我们知道,每一层的元素的个数,不会超过这一层的层数,并且刚好相等,所以你知道顶部和两侧该如何描述了吗?

    public class Test{
        public static void main(String[] args){
            int i = 4;// 定义一个正整数i
            int j = 3;// 定义一个正整数j,大小不能超过i
            int result = getN(i,j);
            System.out.println(result);
        }
        public static int getN(int i,int j){
            // 第1层和第1列的值固定为1,最后一列的值也固定为1
            if(i == 1 || j == 1 || j == i){
                return 1;
            }else{
                // 使用表达式描述规律
                return getN(i - 1,j - 1) + getN(i - 1,j);
            }
        }
    }
    

    以为这就完了?怎么会!既然碰到了这么美丽的图形,不通过程序打印出来如何能消心头之痒!与获得单个的数值不同,打印时要求输入的是想要显示的层数,那么我们就要用到双重for循环来构建出整个图形了:

    public class Test{
        public static void main(String[] args){
            int n = 5;// 定义一个正整数n
            print(n);
        }
        public static void print(int n){
            for(int i = 1;i <= n;i ++){
                // 在每行前插入空格,空格数量与目标层数相关
                for (int j = i;j <= n;j++){
                    System.out.print(" ");
                }
                for (int j = 1;j <= i;j++){
                    // 输出后进行留空
                    System.out.print(getN(i,j) + " ");
                }
                // 打印一层后换行
                System.out.println();
            }
        }
        public static int getN(int i,int j){
            // 第1层和第1列的值固定为1,最后一列的值也固定为1
            if(i == 1 || j == 1 || j == i){
                return 1;
            }else{
                // 使用表达式描述规律
                return getN(i - 1,j - 1) + getN(i - 1,j);
            }
        }
    }
    

    运行结果如下:

    扫描下方二维码,加入官方粉丝微信群,可以与我直接交流,还有更多福利哦~

    在这里插入图片描述

    展开全文
  • http://blog.csdn.net/u011001084/article/details/54090425 资源类
  • 为什么Java方法里面不能再嵌套方法?直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法。个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一...

    为什么Java方法里面不能再嵌套方法?


    直接原因:

      这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法。

    个人理解:
      1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体。
      2.因为没必要,所以不能用。

    特殊情况:如果出现方法里面嵌套方法,那只有一种情况,那就是方法里面定义了内部类,里面的方法属于内部类中的方法。

    下面将说明为什么没有必要?
      1.从Java组成结构来看: 
         Java程序是由类组成的。
         Java类中只有属性和方法两大模块。所以,方法,属性必须直属于某个类。
      2.从方法来看:
        如果是方法,只有两种情况,要么有返回值,要么没有返回值。
              那么我们来看看嵌套的方法。
          2.1 有返回值:
            如果有返回值的话,return 值;这个值一定返回到最外层的方法,所以这个方法的调用将没有任何意义。
          2.2 没有返回值:
            如果没有返回值,那么这个方法体里面要做的事无非就是过程化的处理数据。所以用方法来处理,更没必要,不利于简化代码。

    总上所说:
      1.不允许这样做,由Java结构组成。
      2.没必要这样做,所以不能用。
      3.因为没必要,所以不能这样

    展开全文
  • java编程-循环嵌套;数组定义

    千次阅读 2019-01-17 02:25:29
    package day03; public class HomeWork1 { public static void main(String[] args) { int sum=0; int [][] a = {{1,2,3,4,5,6},{1,2,3}}; for(int i=0;i&lt;a.length;i++) { ...a[i].l...
    package day03;
    
    public class HomeWork1 {
    	public static void main(String[] args) {
    		int sum=0;
    		int [][] a = {{1,2,3,4,5,6},{1,2,3}};
    		for(int i=0;i<a.length;i++) {
    			for(int j = 0;j<a[i].length;j++) {
    				sum+=a[i][j];
    			}
    		}	
    		
    		for(int i=100;i<=999;i++) {
    			int ge = i%10;
    			int shi = i%100/10;
    			int bai = i/100;
    			if(i==ge*ge*ge+shi*shi*shi+bai*bai*bai) {
    				System.out.println(i);
    			}
    		}	
    		
    		for(int i=1;i<=9;i++) {
    			for(int j=0;j<=9;j++) {
    				for(int k=0;k<=9;k++) {
    					if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) {
    						System.out.println(i*100+j*10+k);
    					}
    				}
    			}
    		}		
    	}
    }
    
    153
    370
    371
    407
    153
    370
    371
    407

     

    展开全文
  • java(13)List-----List嵌套

    万次阅读 2018-04-14 00:52:45
    定义:如下的两种定义方式都是不会报错的。   如何初始化和使用呢?  一层一层赋值就可以了,因此也实现了多个list的传值。 输出结果:   test4: 测试两个list放进入是否成立。因此多个...

    我的需求是想一次性传递多个list。

    现在在测试可以如何实现。查看test4:list<list<String>>的初始化

    在我不同测试和思路中,对list传递有几个不同的猜测和实验。

    test1:测试两个list的话,一个list存数据,那么另一个list是否可以存第一个list的首地址。

    首先这个问题是可以实现的。

    List<String> tep = new ArrayList<String>();

    List<String> ls = new ArrayList<String>();

    tep.add("A");

    tep.add("B");

    tep.add("C");

    ls.add(tep.get(0));

    System.out.println(ls.get(0));

    这么是可以访问到数据A的。

    test2:但是我的问题是,我想用一个链表ls,他其中存的都是其他链表的首地址,这样我就可以通过传递ls那个List去传递所有的链表了。当然,测试后发现并不可以,其实问题出在了s.get(index_1).get(index_2);是不可以的。就是我是能访问tep的第一个数据A,但是我不能连着两个get得到B和C;如果我用String也仍然是不可以的。

     

    test3:如果我们这么声明List<List<String>>的话,可以吗?怎么定义,怎么初始化啊?

    定义:如下的两种定义方式都是不会报错的。

        

    如何初始化和使用呢?

        一层一层赋值就可以了,因此也实现了多个list的传值。

    输出结果:

     

    test4: 测试两个list放进入是否成立。因此多个list的传递是可以放在一个List中,然后传递List<List<String>>过去的。

     

    输出结果:

    接受该参数的函数,只需要用同样的变量接受。那他怎么使用内层的List呢?因此无论基层都是可以使用的。

     

     

     

    展开全文
  • java方法定义及使用

    千次阅读 多人点赞 2019-08-20 15:39:00
    (2)定义方法的完整格式: 修饰符 返回值类型 方法名称(参数类型 参数名称,…){ 方法体 Return 返回值; } 修饰符:现阶段的固定写法,public static 方法名称:方法的名字,规则和变量一个,小驼峰 参数...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...
  • 开心一笑【刚在路上遇到一只狗,我蹲下来问它:我2017年的运势,它慎重考虑了下说:旺旺旺,这下我就放心了……】提出问题java中的嵌套接口和嵌套类???解决问题接口嵌套接口/** * 花(接口嵌套接口) */ interface...
  • Java嵌套接口

    2019-05-09 19:09:49
    在学习接口的过程中,这次的嵌套接口对接口的只是覆盖的更加全面,所以在这为读者们进行讲解。 嵌套接口 **:指接口可以嵌套在类或其他的接口中。但凡事的存在必有其必然性,也存在一定的规则约束。接下来我们通过...
  • java语言中不允许嵌套定义

    千次阅读 2016-03-31 12:34:48
    java语言中不允许嵌套定义,这点和c不一样。如:public class test { public static void main(String[] args) { int x = 9; { int x = 3; System.out.println(x); } Syste
  • Java嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。whiledo.while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环, Java嵌套循环格式如下:  ...
  • java Container 嵌套布局

    2017-11-16 12:32:41
    使用 Container嵌套布局按钮,如图 老师完全按PPT来讲,听得一头雾水,用了javafx还是不行,请大神赐教![图片](https://img-ask.csdn.net/upload/201711/16/1510835317_541461.jpg)
  • 关于Java里面的嵌套类,你了解多少?

    千次阅读 多人点赞 2018-06-01 21:50:36
    当然为了方便我看的是英文电子版的PDF格式(有需要的朋友,可以后台留言给我),期间又重新认识或升级了不少Java相关的知识,今天我们来聊一聊Java里面的内嵌类,又称嵌套类。什么是嵌套类?简单的说,就是把一个类...
  • 主要介绍了 java开发中嵌套类的详解及实例的相关资料,一般把定义内部类的外围类成为包装类(enclosing class)或者外部类,需要的朋友可以参考下
  • java 数组里嵌套字典

    千次阅读 2019-06-10 15:21:40
    import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; public class testDataStore { public static void main(String[] args) { Map&....
  • java多层map嵌套案例

    万次阅读 2017-03-29 09:50:15
    这是做项目事service层的一个方法,TmCisDataItemDef是一个对象,tmCisDataItemDefDao.queryForList()方法从数据库中取出所有TmCisDataItemDef表中的数据放大list中,再变量list,根据对象的字段分级放到map中。...
  • 大概意思就是java嵌套类型有两种一个事静态的一个是非静态的。因为main函数是静态的所以需要调用静态的内嵌子类。如果一定要吊用非静态的子类需要先申明一个父类的对象然后才能调用子类。 于是做了以下实验 ...
  • Java中的嵌套类总结

    千次阅读 2016-10-25 20:30:51
    一直对内部类、静态内部类这些名词的认识不太清晰,做一些小小的总结。 总结内容:Java嵌套
  • 我们发现中都是一些条件只有满足这些条件了才...课前准备 云课堂APP 班级二维码 前情回顾 方法嵌套调用 1方法嵌套调用的写法 2方法嵌套程序的流程执行 教学目标的确定 通过汉诺塔小游戏程序了解java递归的编程思想和
  • Java中Map集合的嵌套及遍历

    万次阅读 2018-07-27 15:49:00
    * Map集合的嵌套,Map中存储的还是Map集合 * 要求存储以下数据: * ww一中 * 高三太阳班 * 001 张三 * 002 李四 * * 高三平行班 * 001 王五 * 002 赵六 * 对以上数据进行对象的存储 * 001 张三 键值对 * 高三平行班: ...
  • 主要介绍了Java嵌套类和内部类详解,本文讲解了什么是嵌套类及内部类、静态嵌套类、在外部类中定义内部类、在方法定义内部类、匿名内部类等内容,需要的朋友可以参考下
  • 假设嵌套在类里面有一个private接口定义,然后我分别在类内部定义实现该接口的两个类,一个是public,一个是private,请问这两个类有什么区别?
  • JAVA中跳出多重嵌套循环的几种方法

    万次阅读 2019-06-13 13:46:43
    Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号break语句,即可跳出外层循环。例如:ok: for(int i=0;i;i++) { for(int j=0;j;j++) { System.out....
  • Java中的嵌套

    千次阅读 2018-09-03 18:00:00
    点击蓝字关注我们嵌套类和私有方法当你在另一个类中有一个类时,他们可以看到对方private方法。然而,这个事实在Java开发人员中并不为人所知。很多应聘者在面试时都会说p...
  • Java枚举中嵌套枚举用例

    万次阅读 2017-07-20 19:26:31
    最近项目中需要在枚举类中定义枚举常量的子枚举,翻了一下编程思想,顺手写了一个枚举中嵌套枚举的小demo,供各位码友参考。public enum TestEnum { LOW(Type.Common.class), HIGH(Type.Customized.class); //枚举...
  • java.util.List嵌套集合

    2018-09-30 16:25:57
    今天模仿手机商城的时候, 大胆想出了使用集合'嵌套' private List&lt;List&lt;Xxx&gt;&gt; xxx; // 两个不确定 (第一层属性不确定, 第二层属性不确定) 场景:  首页展示出不同的大类, 像...
  • Java的循环结构及嵌套循环

    千次阅读 2020-01-12 17:18:38
    Java的循环结构及嵌套循环Java的循环结构while 循环结构do...while 循环结构for 循环结构Java嵌套循环概念循环控制语句breakcontinuereturnforeach 循环 Java的循环结构 Java 总共有三种循环结构,分别是while、do...
  • java中if嵌套的使用

    千次阅读 2019-10-24 16:26:03
    import java.util.Scanner; /* 嵌套if的使用 */ public class exercise_IF02 { public static void main(String[] args) { Scanner a=new Scanner(System.in);//定义一个输出键盘内容的值; System.out.println(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 180,849
精华内容 72,339
关键字:

java方法嵌套定义

java 订阅