1、3.1 Java 的类的类3.2 对象的创建与引用对象的创建与引用3.3 变量的作用域变量的作用域 3.4 类变量和静态方法类变量和静态方法3.5 类的组织类的组织-包包3.1.1 3.1.1 系统定义的类系统定义的类 Java API-Java API-常用包常用包java.lang java.lang 包包java.io java.io 包包java.util java.util 包包java.awt java.awt 包包java.applet java.applet 包包 包包java.awt.event java.awt.event 包包java.sql java.sql 包包.使用
2、某个类必须指出类所在包的信息使用某个类必须指出类所在包的信息 通过指定绝对路径来使用类通过指定绝对路径来使用类 java.util.Date x=new java.util.Date();java.util.Date x=new java.util.Date();先通过先通过importimport引入类,然后在代码中直接访问类引入类,然后在代码中直接访问类 import java.util.Date;import java.util.Date;Date x=new Date();Date x=new Date();3.1.23.1.2 用户自定义类用户自定义类 修饰符修饰符 class cl
3、ass 类名类名 /类头类头 /类体类体 修饰修饰 类型类型 属性属性1=1=初值初值11 ;修饰修饰 类型类型 属性属性2=2=初值初值2 2;././其他属性其他属性 修饰修饰 类型类型 方法方法1 1(参数列表)(参数列表)方法体方法体 ././其他方法其他方法 例例3-1 3-1 表示人员信息的表示人员信息的PersonPerson类(未完)类(未完)public class Person /public class Person /类头、类名为类头、类名为PersonPersonprivate String address;/private String address;/籍贯籍贯p
4、rivate String name;/private String name;/姓名姓名private int age;/private int age;/年龄年龄 public String getName()/public String getName()/获取人名获取人名 return name;return name;public int getAge()/public int getAge()/获取年龄获取年龄 return age;return age;public void changeName(String new_name)/public void changeName(S
5、tring new_name)/改名改名 name=new_name;name=new_name;public void incAge()/public void incAge()/增加增加1 1岁岁 age+;age+;例例3-1 3-1 表示人员信息的表示人员信息的PersonPerson类类 (续)续)public void setAge(int new_age)/public void setAge(int new_age)/设置年龄设置年龄 age=new_age;age=new_age;public String getAddress()/public String getAddr
6、ess()/获取籍贯获取籍贯 return address;return address;public void setAddress(String x)/public void setAddress(String x)/设置籍贯设置籍贯 address=x;address=x;public String toString()public String toString()/读对象信息读对象信息 String s=Name:+name+n;String s=Name:+name+n;s+=Age:+age+n;s+=Age:+age+n;s+=Address:+address+n;s+=Add
7、ress:+address+n;return s;return s;3.2.13.2.1 创建对象及访问对象成员创建对象及访问对象成员 public static void main(String args)public static void main(String args)Person p1=new Person();/Person p1=new Person();/创建一个创建一个PersonPerson对象对象 Person p2=new Person();/Person p2=new Person();/创建另一个创建另一个PersonPerson对象对象p1.changeName
8、(John);p1.setAge(23);p1.setAddress(江西江西);(北京北京);System.out.println();p2.setAddress姓名姓名=+p1.getName()+,地址地址=+p1.getAddress();System.out.println p1.incrementAge();p2.changeName(Mary Ann);p2.setAge(22(姓名姓名=+p2.getName()+,地址地址=+p2.getAddress();3.2.23.2.2 对象的初始化和构造方法对象的初始化和构造方法 如果定义属性成员时没有指定初值,则系统自动指如果定义
9、属性成员时没有指定初值,则系统自动指定初值。定初值。在定义属性成员时也可以指定初值。在定义属性成员时也可以指定初值。public class Person public class Person private String address;/private String address;/籍贯籍贯 private String private String name=“name=“无名氏无名氏”;”;/姓名姓名 private int private int age=100age=100;/;/年龄年龄 指定初值的另一种办法是通过初始化块来指定初值的另一种办法是通过初始化块来设置对象的初值。
10、设置对象的初值。public class Person public class Person private String address;/private String address;/籍贯籍贯private String name;/private String name;/姓名姓名private int private int age=12age=12;/;/年龄年龄 /初始化代码块初始化代码块 name=name=无名氏无名氏;age=100;age=100;思考:思考:ageage的初值是什么?的初值是什么?更为常用的给对象设置初值的方式是通过构造更为常用的给对象设置初值的方式是
11、通过构造方法方法 -Person-Person类的一个构造方法类的一个构造方法 public Person(String myname,int myage)public Person(String myname,int myage)name=myname;name=myname;age=myage;age=myage;Person p3=new Person(John,20);使用该构造方法可以创建一个使用该构造方法可以创建一个Person对象对象 构造方法的特点构造方法的特点构造方法的名称必须构造方法的名称必须与类名同名与类名同名;构造方法构造方法没有返回类型没有返回类型;通常通常一个类可提
12、供多个构造方法一个类可提供多个构造方法,这些方法的参数不同。,这些方法的参数不同。如果一个类未指定构造方法,则只能使用系统自动如果一个类未指定构造方法,则只能使用系统自动提供的提供的无参构造方法无参构造方法创建对象,形式如下:创建对象,形式如下:public Person()例例3-2 Person3-2 Person类添加子女属性类添加子女属性 public class Person public class Person private String name;private String name;private int age;private int age;private priva
13、te Person childrenPerson children=null;=null;public Person(String myname,int myage)/public Person(String myname,int myage)/无子女构造方无子女构造方法法 name=myname;name=myname;age=myage;age=myage;public String toString()public String toString()String s=Name:+name+n;String s=Name:+name+n;s+=Age:+age+n;s+=Age:+age+
14、n;return s;return s;例例3-2 Person3-2 Person类添加子女属性类添加子女属性 (续(续1 1)public public Person(String name1,int age1,Person chs)Person(String name1,int age1,Person chs)/有子女构造方法有子女构造方法 name=name1;name=name1;age=age1;age=age1;children=chs;children=chs;public Person getChildren()public Person getChildren()retur
15、n children;return children;public void setChildren(Person mychildren)public void setChildren(Person mychildren)children=mychildren;children=mychildren;例例3-2 Person3-2 Person类添加子女属性类添加子女属性 (续(续2 2)public static void main(String args)public static void main(String args)Person p1=new Person(John,20);Pe
16、rson p1=new Person(John,20);Person p2=new Person(Mary,18);Person p2=new Person(Mary,18);Person c1=p1,p2;Person c1=p1,p2;Person p3=new Person p3=new Person(Smith,50,c1);Person(Smith,50,c1);System.out.println(father:+p3+have following children System.out.println(father:+p3+have following children););P
17、erson mychild=p3.getChildren();Person mychild=p3.getChildren();for(int k=0;kmychild.length;k+)for(int k=0;kmychild.length;k+)System.out.println(child+System.out.println(child+(k+1k+1)+:+mychildk);+:+mychildk);/类结束类结束不同类型变量的作用域不同类型变量的作用域 (1 1)成员变量成员变量的作用域是整个类体。的作用域是整个类体。(2 2)局部变量局部变量也称自动变量,是在方法中定义或者在
18、一段代码也称自动变量,是在方法中定义或者在一段代码块中定义的变量。在声明的代码块中有效。块中定义的变量。在声明的代码块中有效。注意,注意,局部变量在定义时系统不会赋默认初值局部变量在定义时系统不会赋默认初值,因此在引,因此在引用变量时要保证先赋值。用变量时要保证先赋值。(3 3)方法参数方法参数的作用域是整个方法。参数值由方法调用时实参的作用域是整个方法。参数值由方法调用时实参决定。决定。(4 4)异常处理参数异常处理参数跟方法参数的作用很相似,差别在是前者是跟方法参数的作用很相似,差别在是前者是传递参数给异常处理块而后者是传递给方法。传递参数给异常处理块而后者是传递给方法。例例3-3 3-3
19、 各类变量的作用域各类变量的作用域 public class Scope public class Scope int int x=2x=2;int int y=1y=1;public void method(public void method(int aint a)int int x=5x=5;for(for(int iint i =1;ia;i+)=1;ia;i+)x=x+i;x=x+i;System.out.println(x=+x+,y=+y+,a=+a);System.out.println(x=+x+,y=+y+,a=+a);public static void main(Str
20、ing a)public static void main(String a)Scope xScope x=new Scope();=new Scope();x.method(6);x.method(6);3.4.1 3.4.1 类变量类变量-类变量的访问形式类变量的访问形式在本类中直接访问:在本类中直接访问:count count 通过类名访问:通过类名访问:User.count User.count 通过类的一个对象访问,如:通过类的一个对象访问,如:x1.count x1.count 给类变量赋初值给类变量赋初值-用静态初始化代码块用静态初始化代码块 static static coun
21、t=100;count=100;理解类空间与对象空间理解类空间与对象空间public class User public class User static int count=0;static int count=0;String username;String username;int age;int age;类空间类空间对象空间张三0countx1usernameage20李四x2usernameage16大家大家共享共享一份一份每个每个对象对象有各有各自的自的【思考思考】如果将程序中的如果将程序中的countcount变量改为实例变量,变量改为实例变量,程序输出结果如何程序输出结果如何
22、?public class User public class User static int count=0;static int count=0;void login()void login()count+;count+;System.out.println(you are no+count+user);System.out.println(you are no+count+user);public static void main(String args)public static void main(String args)User x1=new User();User x1=new
23、User();x1.login();x1.login();User x2=new User();User x2=new User();x2.login();x2.login();3.4.2 3.4.2 静态方法静态方法 用用 staticstatic修饰的方法称为静态方法,也叫类方法修饰的方法称为静态方法,也叫类方法在在staticstatic方法中只能处理类变量,也可访问其它方法中只能处理类变量,也可访问其它staticstatic方法,方法,但绝不能直接访问任何归属对象空间的变量或方法但绝不能直接访问任何归属对象空间的变量或方法 例例3-5 3-5 求求1010100100之间的所有素数之
24、间的所有素数public class findPrime public class findPrime public static boolean prime(int n)public static boolean prime(int n)if(n=0|n=1|n=2)if(n=0|n=1|n=2)return false return false;for(int k=2;k=Math.sqrt(n);k+)for(int k=2;k=Math.sqrt(n);k+)if(n%k=0)if(n%k=0)return false;return false;return true;return t
25、rue;public static void main(String args)public static void main(String args)for(int m=10;m=100;m+)for(int m=10;m=100;m+)if(prime(m)if(prime(m)System.out.print(m+,);System.out.print(m+,);【思考思考】如果将如果将primeprime方法设计为非静态方法,方法设计为非静态方法,则如何在则如何在mainmain方法中调用。方法中调用。public static void main(String args)public
26、 static void main(String args)findPrime x=new findPrime();findPrime x=new findPrime();for(int m=10;m=100;m+)for(int m=10;m0&theMonth0&theMonth=12)month=theMonth;month=theMonth;else else month=1;month=1;year=theYear;year=theYear;day=checkDay(theDay);day=checkDay(theDay);3 3、对定义包程序的编译、对定义包程序的编译 方法方法1
27、1:创建一个:创建一个testtest子目录,将源程序文件存放到该目录,在子目录,将源程序文件存放到该目录,在该目录下利用该目录下利用javacjavac编译源代码,或者在别处编译完程序后将编译源代码,或者在别处编译完程序后将字节码文件拷贝到该目录即可。字节码文件拷贝到该目录即可。方法方法2 2:采用带路径指示的编译命令:采用带路径指示的编译命令:格式:格式:javac javac d destpath filename.java d destpath filename.java 编译器将自动在编译器将自动在destpathdestpath指定的目录下建一个指定的目录下建一个testtest子
28、目录,子目录,并将产生的字节码文件保存到该子目录下并将产生的字节码文件保存到该子目录下 典型用法是源程序放在当前目录下,用如下命令编译典型用法是源程序放在当前目录下,用如下命令编译 javac d .Date.java javac d .Date.java 编译后将在当前目录自动创建编译后将在当前目录自动创建testtest子目录子目录当前目录1 1、引用其它包的类的方法、引用其它包的类的方法 (1)(1)在引用类时使用包名作前缀。在引用类时使用包名作前缀。例例 :new java.util.Date()new java.util.Date()(2)(2)用用importimport语句加载需
29、要使用的类。语句加载需要使用的类。例例:import java.util.Date;:import java.util.Date;然后在程序中可以直接通过类名创建对象然后在程序中可以直接通过类名创建对象 如:如:new Date();new Date();(3)(3)用用importimport语句加载整个包语句加载整个包-用用“*”号代替类名位置。号代替类名位置。它将加载包中的所有的类。例如:它将加载包中的所有的类。例如:import java.util.import java.util.*;例例3-6 3-6 给给PersonPerson类中加入出生日期属性类中加入出生日期属性 impor
30、t test.import test.*;public class Person public class Person private String name;private String name;private int age;private int age;private Date birthDay;private Date birthDay;public Person(String myname,int myage,int year,int public Person(String myname,int myage,int year,int month,int day)month,i
31、nt day)name=myname;name=myname;age=myage;age=myage;birthDay=birthDay=new Date(year,month,day);new Date(year,month,day);/其它代码其它代码 2 2、设置环境变量、设置环境变量CLASSPATH CLASSPATH 通过设置环境变量通过设置环境变量CLASSPATHCLASSPATH指明字节码文件路指明字节码文件路径。径。例:例:SET CLASSPATH=.;C:jdk1.4lib;SET CLASSPATH=.;C:jdk1.4lib;importimport语句指定的包路径
32、也首先在语句指定的包路径也首先在classpathclasspath路径下路径下查找查找 例如:例如:javax.swing.javax.swing.*是在是在jdkjdk的的liblib目录的目录的dt.jardt.jar中。中。所以,要在所以,要在classpathclasspath中包括:中包括:c:jdk1.4libdt.jar c:jdk1.4libdt.jar 课堂练习课堂练习-写出程序输出结果写出程序输出结果public class test public class test static int x=4;static int x=4;public static void ma
33、in(String a)public static void main(String a)for(int x=2;x5;x+);for(int x=2;x5;x+);System.out.println(x);System.out.println(x);写出程序输出结果写出程序输出结果 public class Static public class Static static int x=5;static int x=5;static int x,y;static int x,y;public static void main(String args)public static void m
34、ain(String args)x-;myMethod();x-;myMethod();System.out.println(x+y+x);System.out.println(x+y+x);public static void myMethod()public static void myMethod()y=x+x;y=x+x;实验安排实验安排1)1)利用随机函数定义利用随机函数定义1010对对(x,y)(x,y)值,由此创建的值,由此创建的PointPoint类实类实例存入一个数组中,按与原点(例存入一个数组中,按与原点(0 0,0 0)的距离由小到大的)的距离由小到大的顺序输出所有的点及
35、到原点的距离。顺序输出所有的点及到原点的距离。2 2)编写一个三角形类,能根据)编写一个三角形类,能根据3 3个实数构造三角形对象,个实数构造三角形对象,如果三个实数不满足三角形的条件,则自动构造以最小值如果三个实数不满足三角形的条件,则自动构造以最小值为边的等边三角形。输入任意三个数,求构造的三角形面为边的等边三角形。输入任意三个数,求构造的三角形面积。积。3)3)定义一个复数类定义一个复数类,其中封装有复数的加其中封装有复数的加,减方法减方法,利用随机利用随机函数产生数据构造出两复数函数产生数据构造出两复数,利用前面定义的复数计算方法利用前面定义的复数计算方法计算两复数的和以及差计算两复数
36、的和以及差.例:设有三角形例:设有三角形t t,有三条边,有三条边a,b,c a,b,c 求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法1 1public double area()public double area()double p=(a+b+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);方法设计与调用的思考举例方法设计与调用的思考举例设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的
37、比较求三角形面积的几个方法的比较 方法方法2 2public double area(double a,double b,double public double area(double a,double b,double c)c)double p=(a+b+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法3 3publi
38、c static double area(double a,double public static double area(double a,double b,double c)b,double c)double p=(a+b+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法4 4public static double
39、 area(Triangle t)public static double area(Triangle t)double p=(t.a+t.b+t.c)/2;double p=(t.a+t.b+t.c)/2;return Math.sqrt(p return Math.sqrt(p*(p-t.a)(p-t.a)*(p-t.b)(p-t.b)*(p-t.c);(p-t.c);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法5 5public void area()public void area()double
40、p=(t.a+t.b+t.c)/2;double p=(t.a+t.b+t.c)/2;double s=Math.sqrt(p double s=Math.sqrt(p*(p-t.a)(p-t.a)*(p-t.b)(p-t.b)*(p-(p-t.c);t.c);System.out.println(System.out.println(“面积面积=“+s);+s);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法1 1public double area()public double area()double
41、p=(a+b+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);调用方式:double s=t.area();设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法2 2public double area(double a,double b,double public double area(double a,double b,double c)c)double p=(a+b
42、+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);double s=t.area(t.a,t.b,t.c);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法3 3public static double area(double a,double public static double area(double a,double b,double c)b,double c
43、)double p=(a+b+c)/2;double p=(a+b+c)/2;return Math.sqrt(p return Math.sqrt(p*(p-a)(p-a)*(p-b)(p-b)*(p-c);(p-c);double s=Triangle.area(t.a,t.b,t.c);行否行否?double s=Triangle.area(3,4,5);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法4 4public static double area(Triangle t)public stati
44、c double area(Triangle t)double p=(t.a+t.b+t.c)/2;double p=(t.a+t.b+t.c)/2;return Math.sqrt(p return Math.sqrt(p*(p-t.a)(p-t.a)*(p-t.b)(p-t.b)*(p-t.c);(p-t.c);double s=Triangle.area(t);设有三角形设有三角形t t,有三条边,有三条边a,b,ca,b,c求三角形面积的几个方法的比较求三角形面积的几个方法的比较 方法方法5 5public public voidvoid area()area()double p=(t.a+t.b+t.c)/2;double p=(t.a+t.b+t.c)/2;double s=Math.sqrt(p double s=Math.sqrt(p*(p-t.a)(p-t.a)*(p-t.b)(p-t.b)*(p-(p-t.c);t.c);System.out.println(System.out.println(“面积面积=“+s);+s);t.area();不能赋值不能赋值