(六)方法和智能工具

来源:互联网 发布:小草网管软件 编辑:程序博客网 时间:2024/06/14 17:06

方法和智能工具

方法(Method)

1、定义

将一段逻辑或者功能提取出来,这种提取的形式就是方法,也叫函数。

为了实现某段代码的重复利用,将这段代码进行封装,这种封装的形式就是方法,也叫函数。

两个概念差不多,任选其一就行。

2、格式

修饰符 返回值类型 方法名(参数列表){
方法体;
return 返回值;
}

明确返回值类型。方法执行完成之后,返回值的数据类型是什么方法的返回值类型就是对应的类型。
例如:求整型数组的元素之和,确定返回值类型是int。
明确是否需要参数。如果方法执行过程中需要一些未知量参与运算,而未知量在方法中不能自动产生,那么这个时候需要以参数的形式体现。
声明一个参数实际上就是声明了变量,形式参数,也叫形参。

// 方法签名---add(int[])public static int add(int[] arr){    int sum = 0;    for(int i : arr){        sum += i;    }    return sum;}

在调用函数传入的实际值叫实际参数,也叫实参。

int[] arr = {1,2,3,4};//调用上面的方法add(arr);

注意:
1.如果方法执行完成之后没有返回值,那么返回值类型就是void。
2.return之后的代码就执行不到了,一个函数一旦return,那么后续代码就不再执行了。
3.任何一个实体方法内都可以写return语句。

3、方法的重载

1.定义

当同一个类内出现了方法名一致而参数列表不同的方法的时候,构成了方法的重载。
方法名一致而参数列表不同,方法名+参数列表叫做方法签名,和修饰符、返回值类型、异常等无关,是一种编译时多态。

public static int add(int i,int j){ code }public static double add(int i ,double d){ code }public static double add(double d,int i){code}public static int add(int i,int j,int k){ code }

方法在调用的时候会进行最优匹配。找参数类型最符合的进行匹配。
如果进行方法的重载,尽量重载所有的情况,以防出现调用混乱的情况。

4、方法的重写

1.定义

当父子类中产生了方法签名完全一致的非静态方法的时候,构成了方法的重写/覆盖。
重写的标志注解:@Override。

2.规则

注意:方法的重写需要遵循 “两等两小一大”
1.父子类中方法签名必须一致。
方法重写的前提,父子类中可以出现方法名称一样签名不一样的方法。

2.如果父类中方法的返回值类型是基本类型/void/最终类,那么子类重写的方法的返回值类型必须一致。
注意:八种基本类型之间没有继承关系。

class A {    public void m(){}}class B extends A {    public void m(){}}

3.如果父类方法的返回值类型是引用数据类型,那么子类重写的方法的返回值类型是父类方法返回值类型的子类或者是本身。

Class A{    Public void m(){}}Class B extends A{    Public void m(){}    Public void mb(){}}Class C{    Public B mc(){return new B();}}Class D extends C{    Public A mc(){    return new A ();    }    //D类的mc方法没有C类的大,如果使用向上造型创建C类对象,使用会有范围的冲突。B类的东西比A类多有写东西实现不了。}

4.子类重写的方法的编译时异常必须是父类方法异常的子类或者本身。子类不能抛出比父类更多的异常,范围不能更大,而且指的是编译时异常。对于运行时异常不做限定。
5.子类重写的方法的权限修饰符的范围必须大于等于父类。

class A{    public void m(){}}class B extends A {    private void m(){}}A a = new B(); // a对象使用A类来声明的,A类告诉a对象身上有一个m方法,而且这个m方法是用public修饰的;等到具体使用的时候要看子类,子类是用B类来创建的,使用的时候发现B类中把这个方法声明为了private。产生来范围冲突。

总结

方法和重载的异同?

方法的重载和重写都是一种行为多态。
重载是指在同一个类中存在来方法名一致而参数列表不同的方法的现象。方法的重载只和参数列表中对应位置参数的参数类型是否一致有关,和其他的元素无关;方法的重载是一种编译时多态。
重写是指在父子类中存在来方法签名完全一致的方法的现象。方法的重写是基于继承和实现存在的。方法的重写要求方法签名必须一致;在重写的过程中,如果父类方法的返回值类型是基本类型、void、最终列的时候,那么子列对应方法的返回值类型要一致;如果父类方法的返回值类型是其他引用类型,这个时候子类对应方法的返回值类型要是父类方法返回值类型的子类或者是本身。在重写过程中,如果父类方法抛出来异常并且该异常是编译时异常的时候,子类重写的方法可以不抛出异常,或者是在父类编译时异常的范围下抛出,而对于运行时异常没有限制。在重写的过程中,要求子类方法的权限修饰符要大于等于父类。重写本身是一个运行时多态。所以对于静态方法而言不存在重写,但是父子类中允许存在方法签名一致的静态方法。

5、方法的递归

1.定义

函数调用自己本身就形成了递归。

//从1+到number的和。public static int sum(int number){    if(number <= 0){        return 0;    }    return number + sum(--number );//函数调用自己本身。}

练习

用递归求阶乘
n! = n * (n - 1)(n-2)…1
5 = 5 * 4 * 3 * 2 * 1 = 120

public static long factorial(int number){if(number == 0){return 1;}return number * factorial( -- number);}

递归的效率会低一些。
控制好结束条件,如果递归层数太深,会出现栈溢出错误(StackOverFlowError)。
StackOverFlowError :栈溢出错误,说明方法/函数在栈内存中执行。
这里写图片描述

注意:在传递参数的时候,对于基本类型而言,传递的实际值;对于引用类型而言,传递的是地址。只要地址不发生改变,函数中一切变化会作用于原数组。

6、作用

1.提高代码的复用性。
2.代码的结构更加清晰。
3.便于模块化(团队)开发
练习:
1.判断质数(prime)。

import java.util.Scanner;public class MethodExer1 {    public static void main(String[] args){        Scanner s = new Scanner(System.in);        int number = s.nextInt();        boolean b = isPrime(number);        System.out.println(b);    }    public static boolean isPrime(int number){        if(number <= 1){            return false;        }        for(int i = 2; i <= number / 2; i++){            if(number % i == 0){                return false;            }        }        return true;    }}
  1. 亲密数。
    A的所有因子(包含了1而不包含本身)之和等于B,并且B的所有因子(包含1而不包含本身)之和等于A,那么A和B就是一对亲密数。1000以内。
public class MethodExer2 {    public static void main(String[] args){        for(int i = 1; i <= 5000; i++){            int b = sumAllFact(i);            int c = sumAllFact(b);            if(c == i && i < b){                System.out.println(i + "," + b);            }        }    }    public static int sumAllFact(int number){        int sum = 0;        for(int i = 1; i <= number / 2; i++){            if(number % i == 0){                sum += i;            }        }        return sum;    }}
  1. 任何一个大于等于6的偶数都可以分解为两个质数之和。
    6= 3 + 3; 14 = 3 + 11 = 7 + 7 18 = 5 + 13 = 7 + 11
import java.util.Scanner;public class MethodExer3 {    public static void main(String[] args){        Scanner s = new Scanner(System.in);        int number = s.nextInt();        while(number < 6 || number % 2 == 1){            number = s.nextInt();        }        for(int i = 3; i <= number / 2; i+=2){            if(isPrime(i) && isPrime(number - i)){                System.out.println(number + "=" + i + "+" + (number - i));            }        }    }    public static boolean isPrime(int number){        for(int i = 2; i <= number / 2; i++){            if(number % i == 0){                return false;            }        }        return true;    }}

智能开发工具(IDE)

IDE:智能开发工具。

1、Eclipse – 日食

Luna–Mars–Neon
1.绿色的。
2.基于插件的。
3.免费的。
4.开源的。
Src:source源头。
快捷键
Ctrl + / —— 单行注释/取消单行注释
Ctrl + shift + / —— 多行注释
Ctrl + shift + \ —— 取消多行注释
Alt + / —— 提示键
Alt + up / down —— 向上或者向下移动
Ctrl + d —— 删除一行
Ctrl + shift + o —— 导包
Ctrl + 1 —— 错误提示键

2、IDEA – Intelli J

1.比较耗费内存。
2.收费。
3.功能比Eclipse强大。

3、MyEclipse

1.收费。

原创粉丝点击