JavaSEDemo05

比眉伴天荒 2021-09-25 05:58 374阅读 0赞

文章目录

  • 简介
  • void方法中return语句的使用规范
  • 可变API与不可变API
  • 数据交换与方法传参
  • 为什么不能用返回值类型来判断方法是否重载
  • 可变参数
  • 普通方法与构造方法同名
  • 构造方法调用同名构造方法
  • this与链式编程
  • this用于传递本对象引用
  • java的访问修饰符
  • 构造方法的特点
  • 方法签名
  • 方法递归及练习

简介

  • 本文是2021/03/24晚上整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进。

void方法中return语句的使用规范

  • void方法一般是不写return语句的,当然了也可以写。
  • void方法中return语句的使用规范:(1)return后面什么也不跟;(2)return必须是最后一句。
  • (1)如果我们在return语句后写了数值
  • 代码示例:

    public static void method(){

    1. return null;
    2. }

  • 在这里插入图片描述

  • 错误解释 无法从返回值类型为void方法中返回一个值
  • (2)如果我们在return语句后写了语句

    public static void method(){

    1. return;
    2. System.out.println();
    3. }

  • 在这里插入图片描述

  • 解释:无法到达的语句;

可变API与不可变API

  • 可变API:在给定的既有内存上进行操作的API
  • 不可变API:执行时需要分配新的内存才能执行的API,new关键字创建对象时就是不可变API,它为对象分配新的空间。
  • 其中,最常见的,Java的String类型没有任何的可变API,因为你对字符串的任何改变都只是创建了一个新的字符串对象。

数据交换与方法传参

  1. public class Test {
  2. public static void main(String[] args) {
  3. int a = 10;
  4. int b = 20;
  5. swap(a,b);
  6. System.out.println("main方法中a:"+a+" b:"+b);
  7. }
  8. public static void swap(int a,int b){
  9. int temp = a;
  10. a = b;
  11. b = temp;
  12. System.out.println("swap方法中a:"+a+" b:"+b);
  13. }
  14. }

程序运行结果

  1. swap方法中a:20 b:10
  2. main方法中a:10 b:20
  • 为什么main方法中的a和b值没有发生交换呢?
  • 因为Java使用的是值传递,值传递是将传入方法的实参拷贝一份交给形参,并不会对原实参产生影响。
  • 关于值传递和引用传递我在另一篇博客里有写,感兴趣的可以点击跳转
    2021/03/21Java中向方法中传入参数时遇到的问题
  • 请看内存图
    在这里插入图片描述
  • 那么如何交换数据呢?我们可以使用类对数据进行包装(注意和包装类不是一个东西)
  • 注意:本处代码中的User类和Test分别在两个java文件中

    //定义一个User类
    public class User {

    1. int a = 10;
    2. int b = 20;

    }

    //测试类
    public class Test {

    1. public static void main(String[] args) {
    2. User user = new User();
    3. swap(user);
    4. System.out.println("main方法中a:"+user.a+" b:"+user.b);
    5. }
    6. public static void swap(User user){
    7. int temp = user.a;
    8. user.a = user.b;
    9. user.b = temp;
    10. System.out.println("swap方法中a:"+user.a+" b:"+user.b);
    11. }

    }

程序运行结果

  1. swap方法中a:20 b:10
  2. main方法中a:20 b:10
  • 为什么用类对数据包装完以后,就可以实现数据交换了呢?
  • 因为我们创建一个对象的时候,Java会为对象在堆中分配内存,我们通过对象访问堆中存储的成员变量,swap方法传入的参数是对象在堆中的地址,交换的数据也是堆中的变量。
  • 请看内存图
    在这里插入图片描述

为什么不能用返回值类型来判断方法是否重载

  1. public void add(double a,double b){
  2. }
  3. public double add(double a,double b){
  4. double sum = a + b;
  5. return sum;
  6. }
  • 假如我们定义了两个方法名称相同,参数列表相同,返回值类型不同的方法。(如上代码是错误的)
  • 如果我们想要调用有返回值的方法,编译器却为我们调用了没有返回值类型的方法。那岂不是闹了笑话?
  • 编译器傻傻分不清楚

可变参数

  1. public static void show(int a,int...b){
  2. }
  • 如上代码:int…b就是一个可变参数
  • 无论你之后传入多少参数都可以接收
  • 使用规范:
  • (1)可变参数只能有一个
  • (2)可变参数必须写在参数列表的最后一个
  • (3)书写格式:数据类型…形参名称 三个点和前后的数据类型和形参名称中间有没有空格都可以
  • (4)可变参数与数组类似,也有长度:参数名称.length

    public class Test {

    1. public static void main(String[] args) {
    2. System.out.println(show(1,2,3,4,5,6,7));
    3. }
    4. public static int show(int...a){
    5. return a.length;
    6. }

    }

程序运行结果

  1. 7

普通方法与构造方法同名

  • 在Java中允许普通方法与构造方法同名,但是不推荐这么写

    public class User {

    1. String name;
    2. int age;
    3. //无参构造方法
    4. public User() {
    5. System.out.println("无参构造方法被调用");
    6. }
    7. //全参构造方法
    8. public User(String name, int age) {
    9. this.name = name;
    10. this.age = age;
    11. System.out.println("全参构造方法被调用");
    12. }
    13. //普通方法
    14. void User(){
    15. System.out.println("普通方法被调用");
    16. }

    }

    public class Test {

    1. public static void main(String[] args) {
    2. User u1 = new User();
    3. User u2 = new User("张三",20);
    4. }

    }

程序运行结果

  1. 无参构造方法被调用
  2. 全参构造方法被调用
  • 我们创建对象时只会调用构造方法,若想调用普通方法,创建好对象后,通过对象名.方法名来调用。

构造方法调用同名构造方法

  1. public class User {
  2. int number;
  3. int age;
  4. //全参构造方法
  5. public User(int number, int age) {
  6. this.number = number;
  7. this.age = age;
  8. }
  9. //无参构造方法
  10. public User() {
  11. this(0,0);
  12. }
  13. }
  • 如上代码,无参构造方法中调用了全参构造方法,实参为0和0
  • 构造方法调用同名构造方法的使用规范:this语句必须为第一句
  • 否则会出现以下错误:
    在这里插入图片描述
    错误解释:调用this()必须时构造方法中第一条语句。

this与链式编程

  • 我们用一段代码来演示链式编程的效果

    //苹果类
    public class Apple {

    1. int apple = 0;
    2. //返回值类型为本类Apple类,返回this,即返回调用此方法的对象,调用时可以连续调用。
    3. public Apple addApple(){
    4. apple++;
    5. return this;
    6. }
    7. //打印苹果的数量
    8. public void print(){
    9. System.out.println("共有苹果:"+apple+"个");
    10. }

    }

    //测试类
    public class Test {

    1. public static void main(String[] args) {
    2. Apple apple = new Apple();
    3. //一共调用了3次addApple方法,apple增加了3次
    4. apple.addApple().addApple().addApple().print();
    5. }

    }

程序运行结果

  1. 共有苹果:3

this用于传递本对象引用

  1. /* 定义父亲类和儿子类,父亲可以采摘苹果,儿子也可以采摘苹果 */
  2. public class Son {
  3. //定义苹果数量
  4. int apple;
  5. //定义一个儿子类中的摘苹果的方法
  6. public void pickApple(){
  7. //此方法中创建了一个Father类对象
  8. Father father = new Father();
  9. //将调用此方法的对象,传给父亲类中的摘苹果的方法
  10. father.pickApple(this);
  11. }
  12. }
  13. --------------------------------
  14. public class Father {
  15. //定义一个父亲类中的摘苹果的方法,参数为Son类型的对象
  16. public void pickApple(Son son){
  17. son.apple = 50;
  18. }
  19. //main方法
  20. public static void main(String[] args) {
  21. Son son = new Son();
  22. son.pickApple();
  23. System.out.println(son.apple);
  24. }
  25. }

程序运行结果

  1. 50

看上去比较乱,我们来看一下内存图
在这里插入图片描述

java的访问修饰符

在这里插入图片描述

构造方法的特点

  • 语法:public 类名(){
    }
  • 构造方法没有返回值

方法签名

  • 由方法名称和参数列表组成。方法签名常用于方法重载和重写。

方法递归及练习

  • 方法自己调用自己
  • 方法递归要有一个明确的方向,不然程序会一直进行下去,形成死循环
  • 练习题目:
    有一只猴子摘了一大堆桃子吃,它按照这样的规律吃桃子:第一天吃一半多一个,第二天吃第一天剩余的一半多一个,第三天吃第二天剩余的一半多一个…以此类推,当第七天时,恰好只剩下一个桃子。求猴子一共摘了多少个桃子?
  • 解题思路:我们可以用数学思想来解决这个问题
  • 设一个F(n),F为桃子数量 n为天数
  • 我们知道F(7)=1,第七天是第六天吃剩下的,第六天吃了一半多一个
  • 即F(7)=F(6)-F(6)/2 -1 ;
  • 换算一下,就得出 F(6) = [F(7)+1] x 2
  • 继续可以得出 F(5) = [F(6)+1] X 2
  • F(4) = [F(5)+1] X 2
  • 规律就是 F(n) = [F(n+1) + 1] X 2
  • 同时递归的终止条件为F(7) =1
  • 代码实现:

    public class Monkey {

    1. public static void main(String[] args) {
    2. System.out.println("最初有"+F(1)+"个桃子");
    3. }
    4. public static int F(int n){
    5. if(n ==7){
    6. return 1;
    7. }else{
    8. return (F(n+1)+1)*2;
    9. }
    10. }

    }

程序运行结果

  1. 最初有190个桃子

发表评论

表情:
评论列表 (有 0 条评论,374人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaSEDemo06

    文章目录 简介 显示继承与隐式继承 继承的重点 继承与构造方法 继承的优点和缺点 final关键字 多重继承时构造方法的执行情况

    相关 JavaSEDemo05

    文章目录 简介 void方法中return语句的使用规范 可变API与不可变API 数据交换与方法传参 为什么不能用返回值类型来判断方法是否