天空是蓝色的

做好软件为中国 #gcc -c helloworld.c -o helloworld.o //编译目标文件 #gcc helloworld.o -o helloworld //编译成可执行exe #helloworld //运行exe
数据加载中……
第四章 方法

第四章方法

学习目标理解和使用方法创建和调用方法理解在方法中参数的作用向方法传递基本类型参数理解方法重载认识方法抽象的概念熟悉Math类使用分治的办法扩充程序


引言

方法的结构

创建方法
方法的结构:
修饰符返回值类型方法名(参数列表)
{
//方法体
}
方法头指定方法的修饰符、返回值类型、方法名和参数。


创建方法修饰符是可选的,它指定了方法的属性并且告诉编译器该方法可以如何调用。
方法可以返回一个值。返回值类型是方法要返回的值的数据类型。若方法不返回值,则返回值类型为关键字void。除构造方法外,所有的方法都要求有返回值类型。
方法可以有一个参数列表,按方法的规范称为形式参数。当方法被调用时,形式参数用变量或数据替换,这些变量或数据称为实际参数。参数是可选的。
方法体包括一个定义方法做什么语句集合。


创建方法例如:
public static intmax(intnum1, intnum2)
{
if (num1 > num2)
return num1;
else
return num2;
}
修饰符修饰符用于类和类的成员(方法和数据),但final修饰符也可以用在方法中的局部变量上。public、private和默认修饰符:public:用它定义的类、方法和数据,所有程序都能访问。private:用它定义的方法或数据,只能用定义该方法和数据的类访问,其他类不能访问。private只用于数据或方法,不用于类。默认修饰符:public和private都没有用,那么默认为类、方法和数据可以被同一个包中的任何类访问。static:用它修饰的方法可以被类名直接调用。

 

调用方法


调用方法

例4.1 测试max方法
这个例子演示怎样创建和调用max方法。
源程序:TestMax.java


方法的参数列表参数可选。多个参数之间用逗号连接。
应对每一个参数进行独立的数据类型说明,如(intnum1,num2)应换为(intnum1,intnum2) 

方法的返回值在其他某些语言中,方法被称为过程和函数。返回值非空的方法称为函数,返回值为空的方法称为过程在java中,返回值类型非void的方法也可以当作语句调用,这种情况下,调用函数简单的忽略了返回值方法的返回值,是把调用方法后得到的结果返回到方法调用处

return语句返回值类型为void的方法也可以使用return语句,用来终止方法并返回该方法的调用者。执行return语句后方法终止。


参数传递方法的威力是它处理参数的能力。调用方法时,需要提供实参,它们必须在类型、次序和数量上与方法中所对应的形参匹配,这叫做参数顺序匹配。

参数传递例如:void nPrintln(String message, intn){ for (inti=0; i<n; i++)System.out.println(message);}语句nPrintln(“Hello”,3)把实参“Hello”传给形参message,把3传给n,然后打印3遍“Hello”。语句nPrintln(3,”Hello”)就是错误的,因为实参和形参不匹配。

参数按值传递
在调用带参数的方法时,实参的值复制到方法中称为按值传递。无论方法中的形参怎样变化,方法外的实参不受影响。例4.2 测试按值传递本程序证实方法中的参数传递是按值传递的。源程序:TestPassByValue.java


重载方法
方法重载就是指,两个方法具有相同名称和不同的参数形式。方法名与参数形式合称方法头标志。调用方法时,Java运行系统能够根据方法头标志决定调用哪个方法。重载方法可使程序清晰易读。执行相似任务的方法应该给予相同的名称。被重载的方法必须具有不同的参数形式。不能基于不同的修饰符或返回值类型重载方法。

重载方法例4.3 重载max方法double max(double num1, double num2) { if (num1 > num2)return num1;elsereturn num2;}与前面的max方法同名,但参数形式不同。

方法抽象
方法抽象是把方法的应用同实现分离开来。在不知道方法如何实现的情况下,用户也可以使用方法。如果要改变方法的实现,只要不改变方法头标志,提供给用户的程序就不受影响。

方法抽象我们可以把方法看作包含方法详细实现的一个黑匣子:

抽象方法用abstract声明,有方法头没有方法体;例:所有的图形类都会有一个方法画图abstract void paint();
由该类的子类来实现该方法;
所有的抽象方法只能存在于抽象类中;
区别于方法的抽象方法的抽象,指一种概念
抽象方法,是一种具体的可以使用的方法的类型

最终方法用final修饰符修饰;不能被子类重载的方法;
所有被private修饰的方法被默认为最终方法;
所有final类的方法也被默认为最终方法。
抽象方法和终极方法,与类的继承有关。

Math类Math类包含了执行基本数学运算所需要的方法类常量:
PIE(自然对数的底)
类方法:
三角函数方法
指数函数方法
其它辅助方法

三角函数方法Math类包含下述三角函数方法:
public static double sin(double a)
public static double cos(double a)
public static double tan(double a)
public static double acos(double a)
public static double asin(double a)
public static double atan(double a)
其中参数表示以弧度计量的角度,1度等于∏/180弧度。

指数函数方法Math类中有四个与指数函数有关的方法:
public static double exp(double a)//返回e的a次方(ea)
public static double log(double a)//返回a的自然对数(ln(a)=loge(a))
public static double pow(double a, double b)//返回a的b次方(ab)
public static double sqrt(double a)//返回平方根(√a)
方法min、max、abs、round和randommax(a, b)和min(a, b)返回两个数(int、long、float或double)的最小值和最大值abs(a)返回一个数(int、long、float或double)的绝对值round(a)round方法有两个重载版本,一个是float值四舍五入为int值,另一个是double值四舍五入为long值random()返回大于等于0.0小于1.0的double型随机数

Math类的使用例4.4 计算平均值和标准差本例中,编写程序生成10个随机数,并利用下列公式计算这些数的均值和标准差。

实例学习例
4.5 显示日历本程序创建一个显示给定年月的日历。程序提示用户输入年和月,然后显示该月的日历。源程序:PrintCalendar.java
设计结构图

使用对象和类编
写程序
5.1 引言 
5.2对象和类
5.1对象和类——面向对象编程面向对象程序设计(oop)就是使用对象进行程序设计。
对象:代表世界中可以明确标识的任何事物。对象有自己的状态和行为。
对象的状态是属性或域以及它们的当前值构成的集合。
对象的行为是方法的集合。

类类是定义对象的结构。
在java的类中,只有两个部分:数据和方法。
数据用来描述属性,方法用来定义行为。
对象的类包含一系列数据和方法的定义。
类是定义一个对象的数据和方法的蓝本。
对象是类的实例。

举例人类和具体的每个人
电话卡和不同种类、不同公司出的电话卡
苹果派的配方和具体的苹果派

面向对象编程理念(OOP)面向对象的概念 – 对象,类举例:
–public class TelCard
–{
–    String id;
–    double price;
–    ……–    public void telephone(){……}
–}
–……–TelCard card1 = new TelCard(“1921 1821 9980 0001”, 100);
–TelCard card2 = new TelCard(“1921 1821 9981 0021”, 50);
–……

面向对象的概念 – 对象的要素现实中:–具有状态,行为,标志(独一无二)程序设计中:
–具有属性变量,方法和对象名

面向对象的概念 –对象和类的关系类是对象的抽象,是抽象的东西
对象是对类的实例化,是具体的东西
程序是按类来组织的
程序中处理的是具体的对象
对象使用前,必须用某个类来实例化
对象之间通过消息传递来进行交互
具体到java:对象是运行时要占用内存的,而类不是(静态方法和对象除外)。

面向对象的概念 – 实质具体到抽象
抽象到具体
从实际问题中抽象出封装了数据和操作的对象,通过定义类(属性变量和操作)来表述它们的特征和功能(类的定义过程)
通过类的实例化创建对象,对象之间通过消息传递进行交互完成它们的功能. (对象的创建过程)

类和对象类的定义
class Circle
{
  double radius = 1.0;
  double findArea()
  {
    return radius*radius*3.14159;
  }
}


类的数据成员和方法类的数据成员描述对象的属性(或状态)。
类的方法描述对象的行为。
在一个类中,数据成员和方法可以按任何顺序声明


对象声明
1.类名 对象名;  
Circle myCircle;
2.变量声明的同时系统创建了这个变量并为它分配了适当的内存空间。也就是说变量的声明和创建是同时进行的。但是对象变量的声明和创建是两个分离的步骤。对象的声明只是简单地把对象和类联系起来,使对象成为该类地一个实例。

对象声明
ClassName objectName;例如:
Circle myCircle;

创建对象objectName = new ClassName();例如:
myCircle = new Circle();


将声明和创建对象写在一条语句中
ClassName objectName = new ClassName();
例如:
Circle myCircle = new Circle();

简单数据类型和对象类型的区别
1.每个变量名代表一个存储值的内存地址。
2.一个简单类型变量存放简单类型的值。
3.一个对象类型变量存放指向对象在内存中存储位置的引用。

简单数据类型变量和对象数据类型变量的异同tu10


简单数据类型和对象数据类型的赋值简单数据类型和对象类型的复制
1.将一个对象复制到另一个对象变量不是复制对象;
2.它仅仅是将一个对象变量的引用值赋给另一个对象变量。


访问对象通过对象的数据域访问对象:
   objectName.data        myCircle.radius通过对象的方法访问对象:
   objectName.method         myCircle.findArea()


例5.1对象的使用目标:声明并创建一个具体的对象,获取数据并使用对象中的方法.

类和对象的小结类——抽象  对象——具体
类中只有两部分:数据部分定义属性

方法部分定义行为对象是类的使用方法,要想使用类,必须声明出对象来。
通过对象来调用类中规定的属性和方法。
可以修改对象的属性、可以调用对象的方法来实现某些操作


垃圾回收
1.Java运行系统监测垃圾并自动收回垃圾对象占用的空间。这个过程叫做垃圾回收(garbage collection)。
2.如果认为一个对象已经不再需要,可以将该对象的引用变量明确赋值为null,Java虚拟机将自动收回那些不被任何变量引用的对象所占的空间。
3.例:Circle c1,c2;               
       c1=new Circle();               
        c2=new Circle();               
        c1=null;
        c1=c2; 


5.3 构造方法
(构造器)

构造方法
Circle(double r)

  radius = r;
}
Circle()
{
  radius = 1.0;
}
myCircle = new Circle(5.0);


例:构造函数的使用
用构造函数创建对象

构造函数使用规则总结无构造,参数必无
有构造,参数可选
选参数,和构造一致

给方法传递对象引用传递
值传递
类似于指针的思想


可见性修饰符与访问器方法
默认情况下,类、变量或数据可以被同一包中的任何类访问。       
public        用它定义的类、方法和数据,所有程序都可以访问。
private         用它定义的方法和数据,只能有定义该方法和数据的类访问,而其他类不能访问。
       

例5.4
使用private修饰符和访问器方法

第五章 第四讲修饰符
类变量与实例变量
实例变量必须依赖于一个特定的对象
类变量被同一类中的所有实例共享。

总结:类变量:让一个类中的所有实例都可以共享的数据,用static修饰,由该类的各个对象共用。
类变量的引用:不用创建实例也可以引用,创建了实例后,则是各个实例共用的一块空间,其值被所有实例共享


类变量与实例变量的区别类变量, 常量和类方法class Vb{        int i=0;       
static int j=0;       
Vb()       
{                i=i+1;
                j=j+1;        }

        public static void main(String[] args)
       
{
        Vb v=new Vb();
        System.out.println("j is"+j);

        System.out.println("i is"+v.i);
        Vb b=new Vb();
        System.out.println("j is"+j);
        System.out.println("i is"+b.i);       
        }
}


例 5.5 使用类变量,  常量和类方法变量的作用域实例变量和类变量的作用域是整个类。它们能够在一个类中的任何地方声明。
局部变量的作用域从它的声明开始延续到包含它的块尾。局部变量必须先声明后使用。

变量的作用域不要在块内声明一个变量,而在块外使用。
例:for(int i=0;i<10;i++){}  int j=i;
在一个方法互不嵌套的块中,可以用同一个名字多次声明局部变量,但是不能在嵌套的块中声明多次。

在一个方法互不嵌套的块中,可以用同一个名字多次声明局部变量public void correctMethod
{
        int x=1;
        int y=1;
        for(int i=1;i<10;i++)
        {
                x+=i;
        }
        for(int i=1;i<10;i++)
        {
                y+=i;
        }
}

不能在嵌套的块中声明多次
public void incorrectMethod
{
        int x=1;
        int y=1;
        for(int i=1;i<10;i++)
        {
                int x=0;
                x+=i;
        }
}

关键字this 用关键字this可以访问隐藏的实例变量。
也可以在构造方法中使用关键字this。this()语句必须出现在构造方法中任何其他方法之前。

用关键字this访问隐藏的实例变量class Foo
{
int i=5;
void setI(int i)
{
this.i=i;    
}
}


在构造方法中使用关键字thispublic class Circle
{
private double radius;
public Circle(double radius)
{
this.radius=radius;
}
public Circle()
{
this(1.0);

}


对象关系分析关联
聚集
继承

关联
关联是描述两个类相互作用的一般二元关系。

聚集
聚集是一种特殊的关联形式, 表示两个类的关联形式。
  聚集模拟这样的关系:具有(has-a)、包含(part-of)、拥有(own)、雇佣(employed-by),等等。

继承
继承模拟两个类之间“是(is-a)”的关系。

类抽象
   类抽象意味着将类的实现和使用分离。 类的创建者提供了类的描述,让使用者明白如何使用类,而使用者不需要知道类是如何实现的。实现的细节经过封装,对用户隐藏起来

类的设计
1. 设计、标识系统的类
2. 描述每个类的属性和方法
3. 建立类之间的关系
4. 创建类

例5.6抵押贷款例5.6抵押贷款
The following is a test program that uses the classes Name, Address, Borrower, and Mortgage.

例 5.7tu7
Using the Rational Class
Objective: Define a class for rational numbers that provides constructors and addition, subtraction, multiplication, and division methods.

Java API 和核心类java.lang包含Java的核心类。
每个Java程序隐含地导入该包。
java.awt
包含图形类。
java.applet
包含支持applet的类

Java API 和核心类java.io
包含用于输入输出数据流和文件的类
java.util
包含许多工具,如日期等
java.net
包含支持网络通讯的类

Java API 和核心类java.awt.image
Contains classes for managing bitmap images.
java.awt.peer
Platform-specific GUI implementation.
Others:        java.sql        java.rmi


String类构造一个字符串–String message = "Welcome to Java!"
–String message = new String("Welcome to Java!“);
–String s = new String();字符串比较
字符串连接
子串
字符串长度
获取字符串的单个字符

字符串比较equals
        String s1 = "Welcome";
        String s2 = "welcome";
       
  if (s1.equals(s2))
  {  // s1和s2有相同的内容  }

  if (s1 == s2)
  {
    // s1和s2是否指向同一对象
  }

子串
String 是一个不可变的类。一个字符串创建后,它的值不能部分的改变。
String s1 = "Welcome to Java";
String s2 = s1.substring(0,10) + "HTML";

字符串连接
String s3 = s1.contact(s2);String s3 = s1 + s2;

获取字符串长度
message = "Welcome";
message.length() (returns 7)

获取字符串单个字符Do not use message[0]Use message.charAt(index)Index starts from 0

例5.8验证回文串
检查一个字符串是否为回文串:是否从前读它和从后读它都是一样的。

StringBuffer 类
StringBuffer类是String类的一个替代品。一般来说,不管一个字符串用在何处,都要使用字符串缓冲区。
StringBuffer类比String类更灵活,可以在字符串缓冲区中添加、插入或追加新内容。
一个字符串一旦创建它的值就固定了

StringBuffer Constructorspublic StringBuffer()        No characters, initial capacity 16 characters. public StringBuffer(int length)        No characters, initial capacity specified by the length argument. public StringBuffer(String str)        Represents the same sequence of characters
as the string argument. Initial capacity 16
plus the length of the string argument.

Appending New Contents
into a String Buffer
StringBuffer strBuf = new StringBuffer();
strBuf.append("Welcome");
strBuf.append(\' \');
strBuf.append("to");
strBuf.append(\' \');
strBuf.append("Java");

The StringTokenizer Class Constructors
StringTokenizer(String s, String delim, boolean returnTokens)
StringTokenizer(String s, String delim)
StringTokenizer(String s)

The StringTokenizer Class Methods
boolean hasMoreTokens()
String nextToken()
String nextToken(String delim)

Example 5.10
Testing StringTokenizer
Objective: Using a string tokenizer, retrieve words from a string and display them on the console.

posted on 2005-12-12 11:06 bluesky 阅读(517) 评论(0)  编辑  收藏 所属分类: 工作总结


只有注册用户登录后才能发表评论。


网站导航: