250 likes | 369 Views
第 3 讲 使用类和对象编程(一). 基本数据类型和表达式的 3 个实例 创建类 成员变量与方法. 目标. 理解类和对象的基础知识 掌握类和对象的创建与应用. 实例 1. 请将一个四位正整数的个、十、百、千位 4 个数的和求出,并分别输出这四个数及它们的和。 分析:采用自顶向下、逐步求精的方法,先给出总的框架,再分析问题,然后逐步细化。 1 .总体步骤 (1) 输入一个四位数: 3587 ; (2) 分别求出个、十、百、千位,并将这四个数相加; (3) 输出四个数及和。 2 .逐步细化及分析.
E N D
第3讲 使用类和对象编程(一) 基本数据类型和表达式的3个实例 创建类 成员变量与方法
目标 • 理解类和对象的基础知识 • 掌握类和对象的创建与应用
实例1 请将一个四位正整数的个、十、百、千位4个数的和求出,并分别输出这四个数及它们的和。 • 分析:采用自顶向下、逐步求精的方法,先给出总的框架,再分析问题,然后逐步细化。 1.总体步骤 (1) 输入一个四位数:3587; (2) 分别求出个、十、百、千位,并将这四个数相加; (3) 输出四个数及和。 2.逐步细化及分析 定义int变量s,并赋值3587;定义其它变量 根据数学运算方便,从高位开始,先分别求出四位上的数,再进行相加。千位=s/1000,百位=(s-千位*1000)/100,十位=(s%100)/10,个位=s%10,和=千位+百位+十位+个位
class Ex2_10 { public static void main(String args) { int a,b,c,d,add; int s=3587; a=s/1000; b=(s-a*1000)/100; c=(s%100)/10; d=s%10; add=a+b+c+d; System.out.println(“千位数是”+a+“\t 百位数是”+b); System.out.println(“十位数是”+c+“\t 个位数是”+d); System.out.println(“这个四位”+s+“的各位数字的和是:”+add); } }
实例2 从键盘输入一个整数,进行除法运算 • 分析:从键盘输入一个整数,应用命令行参数的方法可以获得。然而进行除法运算时,由于除数可能为零,会产生运行错误。需采用异常处理的方法解决。 • i=Integer.parseInt(args[0]), 意思是将从命令行接收的第一个参数(存放在数组元素args[0]中),转换成整数送给变量i。
import java.io.*; public class Ex2_11 { public static void main(String args[]) { int i; System.out.println("Input a integer or character:"); i=Integer.parseInt(args[0]); //从命令行接收一个数 try { int j=10/i; System.out.println("The input is \'"+i+"\'"+"j="+j); } catch (ArithmeticException e) { System.out.println("the exception is :"+e); } } }
实例3 已知年利率、贷款年数和贷款金额,计算月偿还金额和总偿还金额,并将它们显示。 • 分析: 1.给出月偿还金额和总偿还金额的公式 • 月偿还金额=(贷款金额*月利率)/(1-1/(1+月利率)贷款年数*12) • 总偿还金额=月偿还金额*年数*12 2.由第1步看到,只要知道月利率即可求出结果。而已知年利率,因此,月利率=年利率/12 。 3.输入其他参数,代入第1步公式,计算出结果,最后输出结果。
public class Ex2_12{ public static void main(String args[]) { double nln; int years; double dj; System.out.println("Enter yearly rate,for example 2.25:"); nln=DefInput.readDouble(); double yln=nln/1200; System.out.println("Enter number of years,for example 8:"); years=DefInput.readInt(); System.out.println("Enter load ammount,for example 30000:"); dj=DefInput.readDouble(); double monthlyPay=dj*yln/(1-1/(Math.pow(1+yln,years*12))); double totalPay=monthlyPay*years*12; System.out.println("The monthly pay is:"+monthlyPay); System.out.println("The total pay is:"+totalPay); } } 程序中的定义的变量都必须进行说明,并根据存储的数据定义合适的类型。例如,年份为整型,金额定义为双精度型。从键盘上读入数据用DefInput类的方法readInt()和readDouble()。但要保证DefInput类与Ex2_12.class类在一个目录下,才能这样用上面两个方法。
import java.io.*; public class DefInput{ public static String readString(){ BufferedReader br=new BufferedReader( new InputStreamReader(System.in),1); String string=“ ”; try{ string=br.readLine(); } catch(IOException ex){ System.out.println(ex); } return string; } public static int readInt(){ return Integer.parseInt(readString()); } public static double readDouble(){ return Double.parseDouble(readString()); } }
创建类(引例) • 例题2.1 “已知三角形的三条边,计算它的周长与面积。” 在其逐步求精的过程中,并没有很好的体现面向对象的特点,现将其作如下的修改。 • 分析:可以用逐步求精的方法逐步逼近问题的解决方案,Java程序是由类组成的,可以将问题转化为“设计一个计算三角形周长与面积的类”。
(1)定义一个计算三角形周长与面积的类Triangle 引入标准类 声明类 确定三角形属性(定义三条边) 计算周长(定义方法side) 计算面积(定义方法area) (2) 定义主类 引用标准类 声明主类及main方法 定义三条边的具体值 调用计算周长方法 调用计算面积方法 输出结果 引例求精分析 引例代码Ex3_1
类的定义 • 类是一种复杂数据类型,定义对象的结构。 • 将属性和方法封装在一个类中,在Java类中,属性以数据来描述,方法用来实现对象的行为。 • 类的基本格式如下: class 类名 //类说明 {//花括号中为类体部分 <类的数据> <类的方法> } • 数据值表示存储在每个对象里的结果,而方法则表示对象可以提供的功能。数据和方法统称为类的成员,数据成员也称为实例变量。
class是关键字,用来定义类,命名与标识符的命名一致。class是关键字,用来定义类,命名与标识符的命名一致。 类名的单词首字母都大写,类名最好能体现类的功能或作用。 class People { int age; //数据域 String name; //数据域 int aged() { //方法 ……} } class Desk { int length, width, height; float price; float cubage(){ ……} } Desk类的属性是length、width、height以及price,方法cubage()应用变量length、width、height的数值计算体积。 类的定义举例
类声明的完整格式 [修饰符] class <类名> [extends<父类名>] [implements <接口名>] • public:说明该类为公共类,它可以被本类和其他任何类及成员方法所使用。Java程序中至多有一个类是public类。 • default:如果类名前不用修饰符,指的就是默认访问情形,只能被本类和同一个包中的其他类、接口及成员方法引用。 • abstract:用该修饰符修饰的类称为抽象类。它是一种没有具体对象的概念类,是它所有公共子类的公共属性集合。 • final:用该修饰符修饰的类不能有子类,称为最终类。
成员变量的定义 • 成员变量位于类体中,在方法定义之外所定义的变量,方法内定义的变量称为方法变量或局部变量。成员变量和方法变量可以是简单类型,也可以是类等引用类型。 • 成员变量定义的格式为: [访问权限符] [static] [final] 类型变量名1[,变量名2,…] • 例如,类ExampleClass中定义了成员变量d、i和j,在类体的方法method()中定义的变量f、g是方法变量。 class ExampleClass{ public double d; //成员变量d,i,j private int i,j; method() { float f,g; //方法变量f,g } }
成员变量访问权限符 • public:由此修饰的成员变量称为公共变量,可以被程序中任何类访问。 • protected:由此修饰的成员变量可以被本类、同一包中该类的子类及其他包中的该类的子类访问。 • private:由此修饰的成员变量只能被本类访问。用private修饰成员变量可以实现数据隐藏机制 • default:如果定义成员变量时,没有修饰符,它的访问属性就是默认的,表示它可以被本类及同一包中的其他类访问。
static和final • 除访问权限符外,成员变量还可以被static及final修饰。static 和final是非访问修饰符。 • 被static修饰的成员变量称为静态变量。 • 被final修饰的叫最终变量,最终变量的值在程序的整个执行过程中是不会改变的,即Java语言中的符号常量。 • 最终变量通常被说明为static的。
1.成员变量定义后,如果没有赋值,则其初值是它的默认值。例如byte、short 、int和long类型的默认值为0,float的默认值为0.0f,double类型为的默认值为0.0,boolean类型的默认值为false,char 类型默认值为’\u0000’,引用类型默认值为null 2.如果需要变量具有其他初值,那么可以在定义的同时给变量赋值 public class Circle{ float radius=10.0f; float getRadius() { return radius; } } public class Ex3_2 { public static void main(String[] args){ Circle ci=new Circle(); // ci.radius=9.0f; System.out.println(ci.getRadius()); } } 成员变量的初始化
方法的创建 • 方法操作类所定义的数据,以及提供对数据的访问的代码. • 创建方法的格式为: [修饰符][abstract][static][final] 返回值类型 方法名([参数列表]) //方法头 { 方法体} • 方法体可以包含一个或多个语句,每个方法执行一项任务。每个方法只有一个名称,通过使用这个名称,方法才能被调用。 • 修饰符是可选的,与成员变量的修饰符相同 ,功能类似。abstract、static和final分别指所修饰的方法为抽象方法、静态方法和最终方法。
方法的创建(续) [修饰符][abstract][static][final] 返回值类型 方法名([参数列表]) //方法头 { 方法体 } • 返回值类型是方法返回值的数据类型。若方法不返回任何值,则返回值类型为关键字void。方法的参数列表是可选的,如果没有,说明没有直接调用的参数。参数列表也称为形式参数,简称形参。 • 如果希望方法有返回值,则在方法的最后一条语句使用return,终止方法并返回该方法的调用者。在返回值为void的方法中,如果有return语句,则执行到这条语句后方法会终止。
方法的调用 • 创建的方法指明了方法的作用,通过调用方法,方法才能发挥它的作用。调用方法的途径有两种: (1)如果方法有返回值,对方法的调用通常就当作处理一个值,通过点 . 运算符实现。 • 调用格式为:对象名.方法名([参数列表]) • 例如,类Triangle的方法setSide(),设置三角形的三边,结果为给变量d1、d2和d3赋值,语句 tri.setSide(a,b,c); 意思是对象tri调用方法setSide()。 (2)直接使用方法的值,不再返回给另一个变量。 System.out.println(tri.area()); 变量名
成员变量和方法的两种形式 • 类体中定义的成员变量和方法均有两种形式: • 用static修饰的称为类变量和类方法,也常称之为静态变量和静态方法; • 未用static修饰的变量和方法称为实例变量和实例方法。 • 类的每一个对象都拥有自己的实例变量,每个对象的变量拥有不同的内存空间,所以每个对象的实例变量也是不同的。
对象占用内存图示 静态变量 静态方法 • Triangle t1=new Triangle(); • Triangle t2=new Triangle(); 实例变量 实例方法 ci 实例变量 实例方法 sj
成员变量和方法的两种形式(续) • 实例变量和实例方法是指每个变量和方法唯一的与一个对象相关联,即在创建某个对象时,同时为这个对象创建所有实例变量的副本,关联所有的实例方法。不同的对象对应不同的实例变量副本,即不同的内存空间。 • 静态变量不再重新分配内存,所有的对象共享静态变量,即所有对象的静态变量使用相同的内存空间。 • 当类体被装入内存时,静态方法就被分配了内存单元,同时分配了相应的入口地址,从而静态方法可以被类创建的任何对象调用执行,也可以在未创建对象时直接通过类名调用。
小结 • 基本数据类型和表达式的3个实例 • 类的定义 • 对象的创建 • 成员变量和成员方法