栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础~面向对象之方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础~面向对象之方法

方法的重载
  1. 方法的重载(overload):在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

  • "两同一不同":同一个类、相同方法名

  • 参数列表不同:参数个数不同,参数类型不同

2.判断是否是重载:

  • 跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!

3.在通过对象调用方法时,如何确定某一个指定的方法:

  • 方法名 ---> 参数列表

public class OverLoadTest {
      public static void main(String[] args) {
          
          OverLoadTest test = new OverLoadTest();
          test.getSum(1,2);   
      }
      
      //如下的4个方法构成了重载
      public void getSum(int i,int j){
          System.out.println("1");
      }
      
      public void getSum(double d1,double d2){
          System.out.println("2");
      }
      
      public void getSum(String s ,int i){
          System.out.println("3");
      }
      
      public void getSum(int i,String s){
          System.out.println("4");
      }
  }

练习:

1.编写程序,定义三个重载方法并调用。方法名为mOL。

三个方法分别接收一个int参数、两个int参数、一个字符串参数。

分别执行平方运算并输出结果,相乘并输出结果,输出字符串信息。在主类的main ()方法中分别用参数区别调用三个方法。

public class OverloadExer {
      
      //1. 如下的三个方法构成重载
      public void mOL(int i){
          System.out.println(i * i);
          
      }
      public void mOL(int i,int j){
          System.out.println(i * j);
      }
      
      public void mOL(String s){
          System.out.println(s);
      }
  }

2.定义三个重载方法max(),第一个方法求两个int值中的最大值,第二个方法求两个double值中的最大值,第三个方法求三个double值中的最大值,并分别调用三个方法。

 public class OverloadExer {
      public int max(int i,int j){
              return (i > j)? i : j;
          }
          public double max(double d1,double d2){
              return (d1 > d2)? d1 : d2;
          }
          public double max(double d1,double d2,double d3){
              double max = (d1 > d2)? d1 : d2;
              return (max > d3)? max : d3;
          }
      }

可变形参的方法

可变个数形参的方法

  1. jdk 5.0新增的内容

2.具体使用:

  • 2.1 可变个数形参的格式:数据类型 ... 变量名

  • 2.2 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,。。。

  • 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载

  • 2.4 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。

  • 2.5 可变个数形参在方法的形参中,必须声明在末尾

  • 2.6 可变个数形参在方法的形参中,最多只能声明一个可变形参。

 public class MethodArgsTest {
      
      public static void main(String[] args) {
          
          MethodArgsTest test = new MethodArgsTest();
          test.show(12);
  //      test.show("hello");
  //      test.show("hello","world");
  //      test.show();
          
          test.show(new String[]{"AA","BB","CC"});
          
      }
      
      
      public void show(int i){
          
      }
      
      public void show(String s){
          System.out.println("show(String)");
      }
      
      public void show(String ... strs){
          System.out.println("show(String ... strs)");
          
          for(int i = 0;i < strs.length;i++){
              System.out.println(strs[i]);
          }
      }
  //不能与上一个方法同时存在
  //public void show(String[] strs){
  //      方法体
  //  }
  //public void show(String ...strs,int i){
  //      方法体
  //  }

方法参数的值传递机制(最重要)
  • 关于变量的赋值内存分析:

    • 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。

    • 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。

从创建o1对象开始在栈空间中产生变量o1指向堆空间中的o1对象实体,然后给堆空间中的o1对象的orderId赋值1001,然后在栈空间中产生o2变量,把栈空间中的o1变量里存放的堆空间中o1对象的地址值,赋值给o2,这个时候o2和o1都指向堆空间中o1对象,所以o1.orderId和o2.orderId的值是同一个值。

 public class ValueTransferTest {
      
      public static void main(String[] args) {
          
          System.out.println("***********基本数据类型:****************");
          int m = 10;
          int n = m;
          
          System.out.println("m = " + m + ", n = " + n);//m=10,n=10
          
          n = 20;
          
          System.out.println("m = " + m + ", n = " + n);//m=10,n=20
          
          System.out.println("***********引用数据类型:****************");
          
          Order o1 = new Order();
          o1.orderId = 1001;
          
          Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中同一个对象实体。
          //从创建o1对象开始在栈空间中产生变量o1指向堆空间中的o1对象实体,然后给堆空间中的o1对象的orderId赋值1001,
  然后在栈空间中产生o2变量,把栈空间中的o1变量里存放的堆空间中o1对象的地址值,赋值给o2,这个时候o2和o1都指向堆空间中o1对象,所以o1.orderId和o2.orderId的值是同一个值
          
          System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
          //o1.orderId =1001,o2.orderId =1001
          
          o2.orderId = 1002;
          
          System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
          //o1.orderId =1002,o2.orderId =1002
      }
      
  }
  ​
  class Order{
      
      int orderId;
      
  }
  • 方法的形参的传递机制:值传递

    • 形参:方法定义时,声明的小括号内的参数

    • 实参:方法调用时,实际传递给形参的数据

  • 值传递机制:

    • 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。

    • 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。

  • 基础数据变量的值传递:

 

从main方法中定义变量m,n,在栈空间中产生main()方法中的m变量并赋值10,n变量并赋值20,然后通过v对象调用swap方法,调用swap的时候会在栈空间中产生swap()方法中的m变量和n变量,v.swap(m,n)方法中的m,n为实参,把实参m,n的值赋给定义的swap()方法中的形参m和n,m=10,n=20(swap()方法中的m,n),执行swap()方法的时候,栈空间中会产生一个变量temp并把m=10的值给了temp,把n=20的值给了m,把temp=10的值给了n。在swap()方法里输出m=20,n=10,执行完swap方法之后,变量temp,m,n都会销毁出栈,这个时候再主函数打印m=10,n=20.

  • 引用数据类型的值传递

 

从main()函数开始执行,创建对象,在堆空间中产生data对象,首地址值为0x7788,在栈空间中产生data变量,并指向堆空间中首地址值为0x7788的data对象,堆空间中data对象中的变量m赋值10,n赋值20;swap()方法里的实参data是栈空间中的指向堆空间中data对象的data变量,这个时候会在栈空间中产生一个属于swap()方法中的变量data,这个变量的值也是堆空间中的data对象的地址值,然后执行swap方法的方法体,栈空间中产生swap方法里的temp变量,通过调用data对象的属性m获取m=10,把10赋值给temp;通过调用堆空间data对象的n参数获取n=20,把20赋值给堆空间data对象中的属性m,把栈空间swap方法中的temp变量的值10赋值给堆空间中data对象的n属性;执行完swap方法之后栈空间中的变量temp,和data对象变量出栈。回到main函数,执行输出语句data.n=10,data.m=20。

public class ValueTransferTest1 {
      public static void main(String[] args) {
        int m = 10;
        int n = 20;
        System.out.println("m = " + m + ", n = " + n);
        //m = 10, n = 20
        ValueTransferTest1 test = new ValueTransferTest1();
        test.swap(m, n);
        System.out.println("m = " + m + ", n = " + n);
        //m = 10, n = 20
      }
       //交换两个变量的值的操作
        public void swap(int m,int n){
        int temp = m ;
        m = n;
        n = temp;
        System.out.println("m = " + m + ", n = " + n);
        //m = 20, n = 10
      }
  }

练习:

1,定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积。

  public class Circle {
      double radius;//半径
      
      //求圆的面积
      public double findArea(){
          return Math.PI * radius * radius;
      }
  }

2,定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下:public void printAreas(Circle c,inttime)printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积。例如,time为5,则输出半径1,2,3,4,5,以及对应的圆面积。

 public class PassObject {
      
      public static void main(String[] args) {
          PassObject test = new PassObject();
          
          Circle c = new Circle();
          
          test.printAreas(c, 5);
          
          System.out.println("now radius is " + c.radius);
      }
  ​
      public void printAreas(Circle c, int time){
          
          System.out.println("RadiusttArea");
          int i = 1;
          for(;i <= time;i++){
              //设置圆的半径
              c.radius = i;
              double area = c.findArea();
              System.out.println(c.radius + "tt" + area);
          }
          
          //
  //      c.radius = time + 1;
          c.radius = i;
          
      }
      
      public class Circle {
      double radius;//半径
      
      //求圆的面积
      public double findArea(){
          return Math.PI * radius * radius;
          }
      }
  }
  

递归方法

递归方法:一个方法体内调用它自身。

  • 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。

  • 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。

练习:

1.请用 Java 写出递归求阶乘 (n!) 的算法。

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

2,已知 有一个数列:f(0) = 1,f(1) =4,f(n+2)=2*f(n+ 1)+f(n),其中 n是大于 0的整数,求 f(10)的值.

 public int f(int n){
          if(n == 0){
              return 1;
          }else if(n == 1){
              return 4;
          }else{
  //错误      return f(n + 2) - 2 * f(n + 1);
              return 2*f(n - 1) + f(n - 2);
          }
      }

3,输入一个数据,计算斐波那契数列(fibonacci)的第n个值

规律:一个数等于前两个数之和

要求:计算斐波那契数列的第n个值,并计算整个数列打印出来

例:1 1 2 3 5 8 13 21 34 55

4,汉诺塔问题

5,快排

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691677.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号