成员方法(方法)
基本介绍
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名…),我们人类还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用成员方法才能完成。
public static void main(String[] args) { // ——main方法
//方法使用
//1. 方法写好后,如果不去调用(使用),不会输出
//2. 先创建对象 ,然后调用方法即可
Person p1 = new Person();
p1.speak(); //调用方法p1.cal01(); //调用 cal01 方法
p1.cal02(5); //调用 cal02 方法,同时给 n = 5
p1.cal02(10); //调用 cal02 方法,同时给 n = 10
//调用 getSum 方法,同时 num1=10, num2=20
//把 方法 getSum 返回的值,赋给 变量 returnRes int
returnRes = p1.getSum(10, 20);
System.out.println("getSum 方法返回的值=" + returnRes);
}
class Person {
String name;
int age;
//方法(成员方法)
//添加 speak 成员方法,输出 “我是一个好人”
//老韩解读
//1. public 表示方法是公开
//2. void : 表示方法没有返回值
//3. speak() : speak 是方法名, () 形参列表
//4. {} 方法体,可以写我们要执行的代码
//5. System.out.println("我是一个好人"); 表示我们的方法就是输出一句话
public void speak() {
System.out.println("我是一个好人");
}
//添加 getSum 成员方法,可以计算两个数的和
public int getSum(int num1, int num2) {
int res = num1 + num2;
return res;
}
}
方法的调用机制原理:(重要!-示意图!!!)
程序执行过程[getSum]+说明
成员方法的好处
1)提高代码的复用性
2)可以将实现的细节封装起来,然后供其他用户来调用即可
成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..) {//方法体
语句;
return 返回值;
1)形参列表:表示成员方法输入 cal(int n) , getSum(int num1, int num2)
2)返回数据类型:表示成员方法输出, void 表示没有返回值
3)方法主体:表示为了实现某一功能代码块
4)return 语句不是必须的。
**注意事项和使用细节**
细节: 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数
细节: 实参和形参的类型要一致或兼容、个数、顺序必须一致
细节: 方法不能嵌套定义
public void f4() {
//错误
// public void f5 () {
// }
}
1.访问修饰符 (作用是控制 方法使用的范围)
有四种: public, protected, 默认, private
2.返回数据类型
1)一个方法最多有一个返回值 [思考,如何返回多个结果 返回数组 ]
(int[] array)
return array;
2)返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
3)如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和 return 的值类型一致或兼容
4)如果方法是 void,则方法体中可以没有 return 语句,或者 只写 return ;
3.方法名
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如 得到两个数的和 getSum, 开发中按照规范
成员方法传参机制(非常非常重要)
基本数据类型的传参机制
引用数据类型的传参机制
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
方法递归调用(非常非常重要,比较难)
基本介绍
简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁
递归能解决什么问题?
递归举例
列举一个小案例,来理解递归调用机制:打印问题
public class test {
public static void main(String[] args) {
T t1 = new T();
t1.test(4);//输出 n=2 n=3 n=4
}
}
class T {
//分析
public void test(int n) {
if (n > 2) {
test(n - 1);
}
System.out.println("n=" + n);
}
}
递归重要规则
递归调用应用实例-汉诺塔
汉诺塔传说
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着 64 片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假如每秒钟移动一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。
真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭
public class test {
public static void main(String[] args) {
Tower tower = new Tower();
tower.move(5, 'A', 'B', 'C');
}
}
class Tower {
//方法
//num 表示要移动的个数, a, b, c 分别表示 A 塔,B 塔, C 塔
public void move(int num, char a, char b, char c) {
//如果只有一个盘 num = 1
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);
}
}
}
方法重载(OverLoad)
基本介绍
java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致!
重载的好处
1)减轻了起名的麻烦
2)减轻了记名的麻烦
举例
方法:calculate
1)calculate(int n1, int n2) //两个整数的和
2)calculate(int n1, double n2) //一个整数,一个 double 的和
3)calculate(double n2, int n1)//一个 double ,一个 Int 和
4)calculate(int n1, int n2,int n3)//三个 int 的和
注意事项和使用细节
方法重写/覆盖(override)
基本介绍
注意事项和使用细节
方法重写也叫方法覆盖,需要满足下面的条件
对方法的重写和重载做一个比较
public class test {
public static void main(String[] args) {
//演示方法重写的情况
Dog dog = new Dog();
dog.cry();//小狗汪汪叫..
dog.eat();//蛋糕
System.out.println(dog.m1());//AAA
}
}
class Dog extends Animal {
//1. 因为Dog 是 Animal子类
//2. Dog的 cry方法和 Animal的 cry定义形式一样(名称、返回类型、参数)
//3. 这时我们就说 Dog的cry方法,重写了Animal的cry方法
@Override
public void cry() {
System.out.println("小狗汪汪叫..");
}
//细节: 子类方法的返回类型和父类方法返回类型一样,
// 或者是父类返回类型的子类比如 父类 返回类型是 Object ,
// 子类方法返回类型是String
@Override
public String m1() {
return "AAA";
}
//细节: 子类方法不能缩小父类方法的访问权限 【演示】
//public > protected > 默认>private
@Override
public void eat() {
System.out.println("蛋糕");
}
}
class Animal {
public void cry() {
System.out.println("动物叫唤..");
}
public Object m1() {
return "aaa";
}
protected void eat() {
System.out.println("鸡蛋");
}
}