收藏 分享(赏)

JAVA chapter04.ppt

上传人:dreamzhangning 文档编号:3319223 上传时间:2018-10-12 格式:PPT 页数:122 大小:1.06MB
下载 相关 举报
JAVA chapter04.ppt_第1页
第1页 / 共122页
JAVA chapter04.ppt_第2页
第2页 / 共122页
JAVA chapter04.ppt_第3页
第3页 / 共122页
JAVA chapter04.ppt_第4页
第4页 / 共122页
JAVA chapter04.ppt_第5页
第5页 / 共122页
点击查看更多>>
资源描述

1、Java程序设计电子课件,沈阳师范大学软件学院张燕丽 20112012学年第1学期,第1篇 核心基础篇,第 4 章 Java面向对象高级特征,本章内容,4.1 基本数据类型包装类 4.2 处理对象 4.3 static修饰符 4.4 final修饰符 4.5 抽象类 4.6 接口 4.7 内部类 4.8 枚举类 4.9 小结,学习目标,了解基本数据类型包装类的用途 掌握static关键词定义的类变量、类方法和初始化程序块 的用法 掌握final关键词 的用法 掌握抽象类、接口的定义和用途 了解内部类以及枚举类的用途,4.1 基本数据类型包装类,包装类的构造方法 包装类的静态工厂方法 获取包装类

2、对象中的基本类型数据 提取字符串中的基本类型数据 基本数据类型包装类中的静态toString()方法,4.1 包装类,1. 构造方法,Java中的8个包装类分别对应于基本类型byte、short、int、long、char、boolean、float和double 包装类的对象只包含一个基本类型的字段,通过该字段包装基本类型值,2. 静态工厂方法,只是一个简单的静态方法,返回的是类的一个实例。 valueOf():创建包装类对象 ,是静态的,可以直接通过类来调用。,包装类的静态工厂方法,3. 获取基本类型数据,public boolean booleanValue() public char

3、charValue() public byte byteValue() public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue(),4. 提取字符串中的基本类型数据,包装类中的静态方法public static xxx parseXxx( String s),可以将字符串中的基本类型数据提取出来,5. 静态toString()方法,每种基本数据类型包装类中都有静态的toString()方法,其定义为: p

4、ublic static String toString(xxx c) 其功能为返回一个表示指定 xxx 类型值的 String 对象。,4.2 处理对象,打印对象和toString()方法 =”与equals,4.2.1 打印对象和toString()方法,在使用System.out.println(i)语句输出变量i时,如果变量i为基本类型,则直接输出i的值 如果变量i为引用类型,则i为空引用时输出null;否则,调用变量i所指向对象的toString()方法,打印对象和toString()方法,public String toString() 每种基本数据类型的包装类中都有重写的publ

5、ic String toString()方法,它返回包装类对象中封装的基本类型数据的字符串形式。,class Square double length;double width;Square(double length,double width) this.length=length;this.width=width; ,class Triangle double a;double b;double c;Triangle(double a,double b,double c) this.a=a;this.b=b;this.c=c;public String toString() return

6、“Trianglea=“+a+“,b=“+b+“,c=“+c+“; ,public class ToStringTest public static void main(String args) Square s=new Square(3.4,7.9);System.out.println(s.toString(); System.out.println(s); Triangle t=new Triangle(1.3,4.6,9.2);System.out.println(t); ,Squarec17164,Squarec17164,Trianglea=1.3,b=4.6,c=9.2,4.2.

7、2 =与equals,“=”可以比较两个基本类型数据,也可以比较两个引用类型变量 当对两个引用类型变量进行比较时,如果两个引用指向同一个对象,则比较结果为true;否则,比较结果为false,4.2.2 =与equals,equals是Object类中的方法,其定义为: public boolean equals(Object obj) Object类中的equals方法只能比较引用类型变量,class MyDate int year;int month;int day;MyDate(int year,int month,int day) this.year=year;this.month=m

8、onth;this.day=day; ,MyDate md1=new MyDate(2009,2,10);MyDate md2=new MyDate(2009,2,10);if(md1=md2) System.out.println(“md1=md2“);else System.out.println(“md1!=md2“);if(md1.equals(md2) System.out.println(“md1=md2“);else System.out.println(“md1!=md2“);,md1!=md2,md1!=md2,4.3 static修饰符,类变量和实例变量 类方法和实例方法

9、静态初始化程序,4.3.1 类变量和实例变量,用static修饰的成员变量称为静态变量或类变量 ; 实例变量属于对象,而类变量却属于类。不同对象的实例变量有不同的存储空间,而该类所有对象共享同一个类变量空间。,class Student static int count; /类变量int sno; /实例变量Student(int sno) this.sno=sno;count+; ,System.out.println(“类变量为:“+Student.count); Student s1=new Student(10010);Student s2=new Student(10011);Stu

10、dent s3=new Student(10012);System.out.println(“实例变量为:“);System.out.println(“s1.sno=“+s1.sno);System.out.println(“s2.sno=“+s2.sno);System.out.println(“s3.sno=“+s3.sno);System.out.println(“类变量为:“+Student.count); System.out.println(“s1.count=“+s1.count);System.out.println(“s2.count=“+s2.count);System.o

11、ut.println(“s3.count=“+s3.count);,类变量为:0,s1.sno=10010,s2.sno=10011,s3.sno=10012,类变量为:3,s1.count=3,s2.count=3,s3.count=3,4.3.2 类方法和实例方法,在类中用关键词static修饰的方法称为类方法,而没有static修饰的方法称为实例方法; 类方法依赖于类而不依赖于对象,故类方法不能访问实例变量,只能访问类变量,而实例方法可以访问类变量和实例变量。,public class StaticMethodTest int i=9;public static void main(St

12、ring args) System.out.println(i); ,编译错误!,4.3.3 静态初始化程序,static关键词还可以修饰类中的代码块,该代码块为静态代码块; 静态代码块在类加载时执行并且只执行一次,它可以完成类变量的初始化,对象中实例变量的初始化可以分为四步: 用new运算符给实例变量分配空间时的默认初始化; 类定义中的显式初始化; 非静态代码块的初始化; 执行构造方法进行初始化。,int i=2;static int is;/ 静态初始化代码块static System.out.println(“in static block!“);is=5;System.out.prin

13、tln(“static variable is=“+is);/ 非静态初始化代码块System.out.println(“in non-static block!“);i=8; ,in static block! static variable is=5,StaticBlockTest() i=10;public static void main(String args) System.out.println(“in main()“);StaticBlockTest sbt1=new StaticBlockTest();System.out.println(sbt1.i); ,in main(

14、),in non-static block!,10,4.4 final修饰符,final修饰类 如果用 final来修饰类,则这样的类为“最终”类。 最终类不能被继承,不能有子类。 JDK类库中的一些类被定义成final类,例如:Math、Boolean、Integer。,2. final修饰符,final修饰成员变量 用final修饰的成员变量则要求一定要明确地赋初始值,否则编译错误。 对于final类型的实例变量,其明确赋初始值的位置有三处: 一是定义时的显式初始化;二是非静态代码块;三是构造方法。,final int i=5;final double d;final boolean b;

15、d=3.6;FinalNonStaticTest() b=true;,class MyDate int year;int month;int day; public class FinalTest final int i;final MyDate md;FinalTest() i=4;md=new MyDate();,public static void main(String args) FinalTest ft=new FinalTest();System.out.println(ft.i);System.out.println(“md:“+ft.md.year+“,“ +ft.md.mo

16、nth+“,“+ft.md.day);/ft.i=8; 编译错误!ft.md.year=2009;ft.md.month=2;ft.md.day=20;System.out.println(“md: ”+ft.md.year +“,“+ft.md.month+“,“+ft.md.day);/ ft.md=new MyDate(); md指向新的对象,编译错误!,4,md:0,0,0,md:2009,2,20,4.5 抽象类,抽象类的定义 抽象类的作用,4.5.1 抽象类的定义,抽象类的定义如下: abstract class modifiers:访问限制修饰符可以为public,或者什么都不写

17、,如果抽象类定义成public,则文件名要与类的名字完全相同。 abstract class:抽象类。 class_name:类名。,在抽象类中可以定义抽象方法,抽象方法也是用abstract来标识。抽象方法的语法格式为: abstract methodName(param_list); 抽象方法只包含方法的声明部分,而不包含方法的实现部分。,abstract class Student abstract void isPassed() ; public class AbstractClassTest public static void main(String args) Student s

18、;s=new Student(); ,编译错误!,编译错误!,抽象类中可以有抽象方法,也可以有非抽象方法。如果一个类中所有的方法都是非抽象方法,也可以定义成抽象类。 一个类中如果有一个方法是抽象方法,则该类必须声明为抽象类,否则会出现编译错误。当一个类继承抽象类时,一定要实现抽象类中的所有抽象方法,否则该类为抽象类。,/抽象类AbstractClass1中有两个抽象方法 abstract class AbstractClass1 abstract void amethod1();abstract void amethod2(); /继承抽象类AbstractClass1,但没实现其抽象方法,所

19、以要定义成抽象类 abstract class AbstractClass2 extends AbstractClass1 ,class Class3 extends AbstractClass1 void amethod1() System.out.println(“重写之后的amethod1方法。“);void amethod2() System.out.println(“重写之后的amethod2方法。“); ,public class AbstractClassExtendsTest public static void main(String args) AbstractClass1

20、 c3=new Class3();c3.amethod1();c3.amethod2(); ,重写之后的amethod1方法。,重写之后的amethod2方法。,4.5.2 抽象类的作用,多态 增强程序的可维护性,abstract class Shape abstract double getArea(); abstract String getShapeInfo(); class Triangle extends Shape double a;double b;double c;Triangle(double a,double b,double c) this.a=a;this.b=b;th

21、is.c=c;,double getArea() double p=(a+b+c)/2;return Math.sqrt(p*(p-a)*(p-b)*(p-c);String getShapeInfo() return “Triangle: “; ,class Rectangle extends Shape double a;double b;Rectangle(double a,double b) this.a=a;this.b=b;double getArea() return a*b;String getShapeInfo() return “Rectangle: “; ,public

22、class AbstractOverridingTest public void printArea(Shape s) System.out.println(s.getShapeInfo()+s.getArea(); public static void main(String args) AbstractOverridingTest aot=new AbstractOverridingTest();Shape s=new Triangle(3,4,5);aot.printArea(s); s=new Rectangle(5,6);aot.printArea(s); ,Triangle: 6.

23、0,Rectangle: 30.0,class Square extends Shape double a;Square(double a) this.a=a;double getArea() return a*a;String getShapeInfo() return “Square: “; ,public class AbstractOverridingTest public void printArea(Shape s) System.out.println(s.getShapeInfo()+s.getArea();public static void main(String args

24、) AbstractOverridingTest aot=new AbstractOverridingTest();Shape s=new Triangle(3,4,5);aot.printArea(s); s=new Rectangle(5,6);aot.printArea(s);s=new Square(8);aot.printArea(s); ,Square: 64.0,4.6 接口,接口的定义 接口的实现 多重继承 接口与抽象类,4.6.1 接口的定义,在Java中,接口实现了多重继承,又很好地解决了C+多重继承在语义上的复杂性。 接口与类属于同一个层次,在接口中也有变量和方法,但接口

25、中的变量和方法有特定的要求。,接口的定义, abstract interface extends super_interfaces ,例4-18,interface Flyer interface Sailer public interface InterfaceExtendTest extends Flyer, Sailer ,一个接口可以同时继承多个接口,注意: 接口中定义的成员变量默认都具有public、static、final属性,并且这些常量在定义时必须要赋值,赋值后其值不能改变。 接口中所定义的成员方法默认都具有public、abstract属性。,interface Inter1

26、 int i=8;double d=2.3;void m1(); public class InterfaceDefiTest public static void main(String args) System.out.println(Inter1.i); System.out.println(Inter1.d); Inter1.d=Inter1.i+3; ,编译错误!,4.6.2 接口的实现,接口实现的定义如下:class extends implements , * * ,说明:,接口列表中的接口之间用逗号分隔。 一个类实现接口时,就要将接口中的所有抽象方法都实现;否则这个类必须定义为

27、抽象类。 接口中抽象方法的访问限制属性默认为public,则在类中实现后的非抽象方法其访问限制属性只能是public。,interface Interface1 void amethod1();void amethod2(); abstract class C1 implements Interface1 public void amethod1() ,class C2 implements Interface1 public void amethod1() System.out.println(“实现抽象方法1“);public void amethod2() System.out.prin

28、tln(“实现抽象方法2“); public class InterfaceImpleTest public static void main(String args) Interface1 cim=new C2();cim.amethod1();cim.amethod2(); ,4.6.3 多重继承,Java中类是单继承,而多重继承可以通过实现多个接口来完成。 当类实现多个接口时,该类的对象可以被多个接口类型的变量来引用。,interface I1 void aa(); interface I2 void aa();void bb(); abstract class A abstract v

29、oid cc(); ,class C extends A implements I1, I2 public void aa() System.out.println(“aa“);public void bb() System.out.println(“bb“); void cc() System.out.println(“cc“); ,public class MultiInterfactTest public static void main(String args) I1 ic1=new C(); ic1.aa();I2 ic2=new C(); ic2.aa();ic2.bb();A a

30、=new C();a.cc(); ,aa,aa bb,cc,4.6.4 接口与抽象类,抽象类中可以有抽象方法,也可以没有,但接口中的方法只能是抽象方法。 抽象类中的抽象方法必须用abstract来修饰,而且访问限制修饰符可以是public、protected和默认的三种中任意一种;而接口中的方法其默认属性为abstract和public。,抽象类中的成员变量定义与非抽象类相同;而接口中的成员变量其默认属性为public、static、final。 类只能继承一个抽象类,而可以同时实现多个接口。 通过接口也可以实现多态。,interface Flyer void fly(); class Bir

31、d implements Flyer public void fly() System.out.println(“鸟在空中飞翔!“); class Airplane implements Flyer public void fly() System.out.println(“飞机在空中飞行!“); ,public class InterfacePolymorTest public static void main(String args) Flyer fy=new Bird();fy.fly();fy=new Airplane();fy.fly(); ,鸟在空中飞翔!,飞机在空中飞行!,ins

32、tanceof,通过接口类型的变量来引用具体对象时,只能访问接口中定义的方法。而要访问具体对象中定义的方法时,则需要将接口类型引用强制转换成具体对象类型的引用。 转换之前要使用instanceof测试:instanceof ,interface Flyer void fly(); class Bird implements Flyer public void fly() System.out.println(“鸟在空中飞翔!“);public void sing() System.out.println(“鸟在歌唱!“); ,class Airplane implements Flyer pu

33、blic void fly() System.out.println(“飞机在空中飞行!“);public void land() System.out.println(“飞机在着落!“); public class InstanceofTest public static void main(String args) Flyer fy=new Bird();testType(fy);fy=new Airplane();testType(fy);,public static void testType(Flyer fy) if(fy instanceof Flyer) System.out.p

34、rintln(“引用所指向的对象可以看作是Flyer类型“);fy.fly();/fy.sing();/fy.land();,引用所指向的对象可以看作是Flyer类型 鸟在空中飞翔!,引用所指向的对象可以看作是Flyer类型 飞机在空中飞行!,if(fy instanceof Bird) System.out.println(“引用所指向的对象是Bird类型“);(Bird)fy).sing(); if(fy instanceof Airplane) System.out.println(“引用所指向的对象是Airplane类型“);(Airplane)fy).land();,引用所指向的对象

35、是Bird类型 鸟在歌唱!,引用所指向的对象是Airplane类型 飞机在着落!,4.7 内部类,内部类的定义 内部类的使用内部类的特性,4.7.1 内部类的定义,一个类被嵌套定义于另一个类中,称为内部类,也称为嵌套类,包含内部类的类为外部类。 与外部类一样,内部类也可以有成员变量和成员方法,通过创建内部类对象可以访问其成员变量和调用其成员方法。,/定义外部类 class Outter int oi;/定义内部类private class Inner int ii;Inner(int i) ii=i;void outIi() System.out.println(“内部类对象的成员变量的值为:

36、“+ii); ,class Outter int oi;/定义内部类private class Inner int ii;Inner(int i) ii=i;void outIi() System.out.println(“内部类对象成员变量的值为:“+ii);,/在外部类方法中创建内部类对象,并调用内部类对象方法void outOi() Inner in=new Inner(5);in.outIi(); public class InnerClassDeTest public static void main(String args) Outter ot=new Outter();ot.ou

37、tOi(); ,内部类对象成员变量的值为:5,4.7.3 内部类的特性,内部类定义的位置外部类的一个成员,或外部类的方法中; 非静态内部类 静态内部类 局部内部类 匿名内部类,1. 非静态内部类,非静态内部类与外部类中的其它非静态成员一样,它是依赖于外部类对象的,所以要先创建外部类对象之后才能创建内部类对象。 内部类对象既可以在外部类的成员方法中创建(如上例所示),也可以在外部类之外创建。,在外部类外创建内部类对象的语法: . 引用变量=.new; . 引用变量=new .new;,class Outter int oi;class Inner int ii;Inner(int i) ii=i

38、;void outIi() System.out.println(“内部类对象成员变量的值为:“+ii); ,/在外部类之外创建非静态内部类对象 public class InnerClassObjTest public static void main(String args) /先创建外部类对象Outter ot=new Outter();/通过外部类对象再创建内部类对象Outter.Inner oti1=ot.new Inner(8);/调用内部类对象的方法oti1.outIi();/第二种方法创建非静态内部类对象Outter.Inner oti2=new Outter().new In

39、ner(10);oti2.outIi(); ,说明:,非静态内部类可以访问外部类中的所有成员,即使外部类的成员定义成private也可以访问。 反之,在外部类中也可以访问内部类的所有成员,但访问之前要先创建内部类对象。,class Outter private int oi=4;private class Inner private int ii;/static double di; 不能声明静态成员,否则编译错误Inner(int i) ii=i;/访问外部类中的私有成员变量private void outIo() System.out.println(“外部类中私有成员变量的值为:“+oi

40、);private void outIi() System.out.println(“内部类中私有成员变量的值为:“+ii); ,/在外部类方法中创建非静态内部类对象并访问私有方法void outO() Inner in=new Inner(7);in.outIo();in.outIi(); public class OutterInnerClassTest public static void main(String args) Outter ou=new Outter();ou.outO(); ,外部类中私有成员变量的值为:4 内部类中私有成员变量的值为:7,说明:,非静态内部类中不能定义

41、静态属性、静态方法、静态初始化块。 在定义内部类时,内部类类名不能与外部类的类名相同,但内部类中成员的名字可以与外部类中成员的名字相同。,class Outter int i;class Inner int i;Inner(int i) this.i=i;void outI() int i=8;System.out.println(“内部类中方法的局部变量的值为:i=“+i);System.out.println(“内部类中成员变量的值为:this.i=“+this.i);System.out.println(“外部类中成员变量的值为:Outter.this.i=“+Outter.this.i

42、);,Outter(int i) this.i=i; public class OutterInnerVarNameTest public static void main(String args) Outter ou=new Outter(2);Outter.Inner in=ou.new Inner(4);in.outI(); ,内部类中方法的局部变量的值为:i=8 内部类中成员变量的值为:this.i=4 外部类中成员变量的值为:Outter.this.i=2,2. 静态内部类,作为外部类成员的内部类定义时加上关键词static就成为静态内部类。 在创建静态内部类对象时不用先创建外部类对

43、象。 静态内部类里不能访问外部类的非静态成员。,class Outter static int i=3;double d=5.6; static class Inner /静态内部类double id=8.9;static double sid=7.2;void out() System.out.println(“外部类中的静态成员变量的值为:“+i);/在静态内部类中不能访问外部类中的非静态成员/System.out.println(“外部类中的非静态成员变量的值为:“+d); ,public class StaticInnerClassTest public static void mai

44、n(String args) /不产生外部类对象,直接创建静态内部类对象Outter.Inner oi=new Outter.Inner();oi.out();System.out.println(“内部类中的静态成员变量的值为:“+Outter.Inner.sid); ,外部类中的静态成员变量的值为:3 内部类中的静态成员变量的值为:7.2,4.8 枚举类,枚举类的定义 实现接口的枚举类 包含抽象方法的枚举类,枚举类,J2SE 5,Java引进了关键词enum用来定义一个枚举类型。 在J2SE 5之前,对枚举类型的描述是用整型静态常量方式,但这种方式存在一定弊端。 J2SE 5提供的枚举类型

45、很好地解决了上述问题。,枚举类的作用? 任何使用常量的地方,例如用 switch 代码切换常量的地方。如果只有单独一个值,那么还是用常量。 如果定义了一组值, 而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。,4.8.1 枚举类的定义,枚举类定义的语法格式如下:enum 枚举选项列表 枚举类型变量的取值只能是枚举类型中定义的值。,enum TrafficSignalsEnum RED,YELLOW,GREEN ,public class TrafficSignalsEnumTest public static void main(String args) Tra

46、fficSignalsEnum ts1= TrafficSignalsEnum.RED;/枚举类型变量取值为非枚举类型定义的值时会出现编译错误/TrafficSignalsEnum ts2= TrafficSignalsEnum.BLUE;,switch(ts1) case RED:System.out.println(“现在是红灯“);break;case YELLOW:System.out.println(“现在是黄灯“);break;case GREEN:System.out.println(“现在是绿灯“);break;/出现编译错误/case BLUE:/System.out.pri

47、ntln(“现在是蓝灯“);break;,class Student /定义成员枚举类enum Grade FRESHMAN, SOPHOMORE, JUNIOR, SENIOR int sno;String sname;Grade sgrade;,Student(int sno, String sname, Grade sgrade) this.sno=sno;this.sname=sname;this.sgrade=sgrade; public class StudentGradeEnumTest public static void main(String args) Student s

48、=new Student (10011,“zhanghong“,Student.Grade.JUNIOR);System.out.println(“学号为:“+s.sno);System.out.println(“姓名为:“+s.sname);,学号为:10011,姓名为:zhanghong,System.out.print(“年级为:“); switch(s.sgrade) case FRESHMAN:System.out.println(“大学一年级“);break;case SOPHOMORE:System.out.println(“大学二年级“);break;case JUNIOR:System.out.println(“大学三年级“);break;case SENIOR:System.out.println(“大学四年级“);break;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报