方法回顾及加深
方法一定是定义在类中的,属于类的成员。
方法的定义
格式: 修饰符 返回类型 方法名(参数列表)异常抛出类型{...}
修饰符
public、static、abstract、final等等都是修饰符,一个方法可以有多个修饰符。例如程序入口 main方法,就使用了public static这个俩个修饰符
注:如果一个方法或者属性有多个修饰符,这多个修饰符是没有先后顺序的
返回类型
方法执行完如果有要返回的数据,那么就要声明返回数据的类型,如果没有返回的数据,那么返回类型就必 须写void.
只有构造方法(构造器)不写任何返回类型也不写void
【示例】
public String sayHello(){
return "hello";
}
public int max(int a,int b){
return a>b?a:b;
}
public void print(String msg){
System.out.println(msg);
}
思考:声明返回类型的方法中一定要出现return语句,那么没有返回类型(void)的方法中,能不能出现return语句?
注意:break和return的区别
return 语句的作用
(1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行。
(2) return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一 致。
(3) return后面也可以不带参数,不带参数就是返回空,其实主要目的就是用于想中断函数执行,返回 调用函数处。
break语句的作用
(1)break在循环体内,强行结束循环的执行,也就是结束整个循环过程,不在判断执行循环的条件是否 成立,直接转向循环语句下面的语句。 (2)当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体
方法名
遵守java中标示符的命名规则即可.
参数列表
根据需求定义,方法可以是无参的,也可以有一个参数,也可以有多个参数
异常抛出类型
如果方法中的代码在执行过程中,可能会出现一些异常情况,那么就可以在方法上把这些异常声明并抛出, 也可以同时声明抛出多个异常,使用逗号隔开即可
方法调用
在类中定义了方法,这个方法中的代码并不会执行,当这个方法被调用的时候,方法中的代码才会被一行一行顺序执行。
非静态方法
没有使用static修饰符修饰的方法,就是非静态方法.
调用这种方法的时候,是"一定"要使用对象的。因为非静态方法是属于对象的。(非静态属性也是一样的)
【例子】
public class Student{
public void say(){}
}
main:
Student s = new Student();
s.say();
静态方法
使用static修饰符修饰的方法,就是静态方法.
调用这种方法的时候,"可以"使用对象调用,也"可以"使用类来调用,但是推荐使用类进行调用,因为静态 方法是属于类的。(静态属性也是一样的)
【例子】
public class Student{
public static void say(){}
}
main:
Student.say();
类中方法之间的调用
假设同一个类中有俩个方法,a方法和b方法,a和b都是非静态方法,相互之间可以直接调用
public void a(){
b();
}
public void b(){
}
a和b都是静态方法,相互之间可以直接调用.
public static void a(){
b();
}
public static void b(){
}
a静态方法,b是非静态方法,a方法中不能直接调用b方法,但是b方法中可以直接调用a方法. 静态方法不能调用非静态方法!
public static void a(){
//b();报错
}
public void b(){
a();
}
另外:在同一个类中,静态方法内不能直接访问到类中的非静态属性
总结:类中方法中的调用,两个方法都是静态或者非静态都可以互相调用,当一个方法是静态,一个方法是非静态的时候,非静态方法可以调用静态方法,反之不能。
调用方法时的传参
形参和实参
【例子】
// a = x;
public void test(int a){
//..
}
main:
int x = 1;
t.test(x);
参数列表中的a是方法test的形参(形式上的参数)
调用方法时的x是方法test的实参(实际上的参数)
值传递和引用传递
调用方法进行传参时,分为值传递和引用传递两种。
如果参数的类型是基本数据类型,那么就是值传递。
如果参数的类型是引用数据类型,那么就是引用传递。
【示例:值传递】
//值传递
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);//1
Demo04.change(a);
System.out.println(a);//1
}
//返回值为空
public static void change(int a){
a = 10;
}
}
【示例:引用传递】
//对象和内存
public class Demo05 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
Demo05.change(person);
System.out.println(person.name);//老八
}
public static void change(Person person){
//person是一个对象:指向的是 Person person = new Person();这是一个具体的人,可以改变属性!
person.name = "老八";
}
}
//定义一个Person类,有一个属性:name
class Person{
String name; //null
}
this关键字
在类中,可以使用this关键字表示一些特殊的作用。
this在类中的作用
【区别成员变量和局部变量】
public class Student{
private String name;
public void setName(String name){
//this.name表示类中的属性name
this.name = name;
}
}
【调用类中的其他方法】
public class Student{
private String name;
public void setName(String name){
this.name = name;
}
public void print(){
//表示调用当前类中的setName方法
this.setName("tom");
}
}
注:默认情况下,setName(“tom”)和this.setName(“tom”)的效果是一样的.
【调用类中的其他构造器】
public class Student{
private String name;
public Student(){
//调用一个参数的构造器,并且参数的类型是String
this("tom");
}
public Student(String name){
this.name = name;
}
}
注:this的这种用法,只能在构造器中使用.普通的方法是不能用的.并且这局调用的代码只能出现在构造器中的第一句.
public class Student{
private String name;
//编译报错,因为this("tom")不是构造器中的第一句代码.
public Student(){
System.out.println("hello");
this("tom");
}
public Student(String name){
this.name = name;
}
}