Download presentation
Presentation is loading. Please wait.
1
Java 第12讲:static与方法重载 主讲教师:李焱 讲师
2
内容简介 内容简介: 1.本讲的位置,教材的3章第1.3、1.4节的内容。
2.本讲的主要内容:掌握static关键字的特性,学习、使用方法重载。
3
重点和难点 本讲内容的重点和难点 重点是掌握static特性与方法重载的依据。 难点在于学会使用方法重载。
4
第三章(1.4节)static关键字 static用来修饰类的成员变量和成员方法,同时也可以修饰代码块,表示静态的代码块。静态的成员变量和方法独立于类的对象,被类的所有实例共享。因此可不生成类的任何对象,直接通过类实现对静态成员的访问。当类加载后,Java虚拟机能根据类名在运行时数据区的方法区内找到它们。
5
3.1.4 static 访问类的静态变量和静态方法时,可以直接通过类名访问,语法如下: 类名.静态方法名(形参列表); 类名.静态变量名;
当Java虚拟机(JVM)加载类时,静态代码块被一次性执行,称为加载时执行。若类中有多个静态代码块,JVM将按照它们出现的顺序依次执行,且每个代码块只被执行一次。
6
3.1.4 static示例 public class StaticTest { static int i = 5;
static int j; static void f(int j) { System.out.println("j= " + j); System.out.println("i = " + i); System.out.println("static j = "+StaticTest.j); } static { System.out.println("static block, initializing static class parameter j="+j); j = i * 4; // 初始化类的静态变量j public static void main(String args[]) { f(8); // f()为静态方法,可被静态的main()方法直接调用 System.out.println("j="+j);
7
3.1.4 static特性 前面的例子给出了类的static方法、static变量以及static 代码块的定义 。
如果main()方法和静态的方法或属性在同一个类里面,那么main()方法就可以直接调用静态方法或属性,而无需通过类名来访问它们,更不需要通过创建对象来调用。 static 成员最常见的例子是main()方法,因为在程序开始执行时必须调用主类的main()方法,JVM在运行main()方法时可以直接调用而不用创建主类实例,所以该方法被声明为static。
8
3.1.4 static的方法 类的方法可以相互调用,但当一个方法定义为静态方法时,它可以直接访问类的静态变量,调用类的静态方法,但不能直接访问类的非静态的变量及调用类的非静态的方法,只能通过生成类的对象,并通过该对象访问相应的变量或调用相应的方法。 同时静态的方法不能以任何方式引用this 或super。因为静态方法独立于类的任何对象,因此静态方法必须被实现,而不能定义静态抽象的方法(抽象的方法就是没有方法体的方法,后面有讲解)。
9
3.1.3 方法重载 在Java类中不允许定义两个方法名相同,并且参数列表也完全相同的方法。如果存在这样的方法,将无法通过编译,Java虚拟机无法决定到底执行哪个方法。 对于类的方法(包括从父类中继承的方法),如果有两个方法的名称相同,但参数列表不一致,可以说一个方法是另一个方法的重载。 方法重载的定义:在Java中,同一个类中的两个或两个以上的方法可以有同一个名字,只要参数列表不同,就称为“重载”。 方法重载是Java实现多态性的一种方式。
10
方法重载的依据1 当一个重载方法被调用时,Java用参数的类型、数量或顺序来表明实际调用的重载方法的版本,因此每个重载方法的参数类型、数量或顺序必须不同。 虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法时,参数与调用参数匹配的方法被执行。
11
方法重载的依据2 以下几种类型的方法都可以构成重载方法: func() {……} //参数个数不同
func(dataType num) {……} //参数类型不同 func(dataType1 num1,dataType2 num2){…… } //参数个数不同 func(dataType2 num1,dataType2 num2,dataType3 num3){//参数个数不同 …… } func(dataType2 num1, dataType1 num2){//参数顺序不同
12
重载方法必须满足的条件 1 (1) 方法名相同; (2) 方法的参数类型、个数及顺序至少有一项不同。顺序必须是两个或两个以上不同数据类型的参数之间的顺序; func(int a, double b){//参数个数相同 } func(double a, int b){//相对于调用语句来说,参数顺序不同
13
重载方法必须满足的条件 2 只有参数变量名称不同是错误的重载: func(int a, double b){ //参数个数相同 } func(int b, double a){ //相对于调用语句来说,参数顺序相同
14
重载方法必须满足的条件3 (4) 方法的修饰符可以不同。 牢记一句话:同名不同参
(3) 方法的返回类型可以不同,但不能用于区分重载的方法。如下语句不能区分重载: int func( int a, double b){} boolean func( int a, double b){} 下面语句是可以的: int func(){} boolean func( int a){} (4) 方法的修饰符可以不同。 牢记一句话:同名不同参
15
方法重载示例-程序3.1 class OverloadTest{ void add(){
System.out.println("重载方法add()"); } void add(int a){ System.out.println("int a="+a); } void add(int a,int b){ System.out.println("a+b="+(a+b)); } void add(double a){ System.out.println("double a="+a); }
16
程序3.1 public class Test{ public static void main(String args[]){
OverloadTest ob=new OverloadTest(); ob.add();//调用无参的重载方法 ob.add(10); ob.add(10,20); ob.add(10d);//传递double参数 } }//运行结果如下 重载方法add() int a=10 a+b=30 double a=10.0
17
方法重载示例-程序3.2 class OverloadTest1{ void add(){
System.out.println("重载方法add()"); } void add(int a,int b){ System.out.println("a+b="+(a+b)); void add(double a){ System.out.println("double a="+a);
18
程序3.2 class Test1{ public static void main(String args[]){
OverloadTest1 ob=new OverloadTest1(); ob.add();//调用无参的重载方法 ob.add(10);//自动匹配方法add(double ) ob.add(10,20); } }//运行结果如下 重载方法add() double a=10.0 a+b=30
19
就近原则-自动匹配 在如上语句的OverloadTest1类中没有定 义add(int)方法,因此在测试类Test的
main()方法内带整数参数调用add()时找 不到匹配的方法。但是Java可以自动地 将整数转换为double类型,这种转换就 可以解决这个问题。因此在找不到 add(int)后,Java将int扩大到double类 型,然后调用add(double)。如果定义了 add(int),则首先调用add(int),而不会调 用add(double)。只有在找不到精确匹配 时,Java的自动转换才会起作用。
20
自动匹配的弊端 思考下面的程序,执行时有问题么? class OverTest{
static void f(int a, double b){ System.out.println(a+b);} static void f(double a, int b){ System.out.println(a*b);} public static void main(String[] args){ f(1,2); } 从方法重载的语法上看,重载的方法没有问题,参数的顺序不同;但是,编译时会报错,因为系统不知道该调用哪个f()方法。原因,就是自动匹配的弊端。
21
方法重载的目的 方法重载是多态性的基本表现,允许同一个方法名访问不同功能的方法。在不支持方法重载的语言中,每个方法必须有一个惟一的名字,但是经常希望实现数据类型不同而本质上相同的方法。 方法重载允许了同名方法的产生,这样直接的好处就是大大减少了程序员对库函数即系统类里方法的记忆负担。比如,我们只需要记住Math.abs(),就可以求int、float、double等各类型数据的绝对值。 目的:使用方便,提高可读性
22
小结 本节讲了方法重载的定义、示例及注意事项,希望大家在解题实践中能熟练使用方法重载。
23
习题 1 编写程序,使用方法重载求三角形的面积。
24
谢谢!!再见!!
Similar presentations