JAVA学习--第6章高级类特性.ppt_第1页
JAVA学习--第6章高级类特性.ppt_第2页
JAVA学习--第6章高级类特性.ppt_第3页
JAVA学习--第6章高级类特性.ppt_第4页
JAVA学习--第6章高级类特性.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

江苏大学计算机学院 Version 2.0,第6章 高级类特性,Page 2,本章内容,Static 关键字 创建 final 类、方法和变量 创建和使用枚举的类型 使用静态导入语句 创建抽象类和方法 创建和使用接 字符串相关类(String、StringBuffer、StringBuilder) Math类(不重要) File类 Date类、Calendar类,Page 3,static 关键字,在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所以对象来说,static成员变量只有一份。 public class Count private int serialNumber; public static int counter = 0; public Count() counter+; serialNumber = counter; public class TestCounter public static void main (String args) Count. counter=100; Count C1 = new Count(); Count C2 = new Count(); static变量在某些方面与其他语言的全局变量类似,Java编程语言中没有全局变量,但是static变量是一个可以被类的任何实例访问的变量,Page 4,static 关键字,用static声明的方法为静态方法(又称类方法),在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。 静态的方法不再是针对某个对象调用,所以不能访问非静态成员 class Count private int serialNumber; public static int counter = 0; public Count() counter+; serialNumber = counter; public static int getCounter() return counter; public class TestCounter public static void main (String args) System.out.println(Count.getCounter(); Count C1 = new Count(); System.out.println(Count.getCounter(); ,可以通过对象引用或类名(不需要实例化)访问静态成员。,Page 5,Static 属性: public static class 属性可没有类的实例从类的外部进行访问。 Static 方法: Static 方法无需创建类的实例即可被调用。 Static 方法不能访问实例变量。 Static 初始化程序: 类可在 static 块中包含在方法主体中不存在的代码。 Static 块代码在类被加载时仅执行一次。 通常,static 块用来初始化 static(类)属性。,static 关键字(续),Page 6,final 关键字,final 关键字用于安全性原因。 它用来创建充当标准的类。 它实现了以下限制: 不能获取 final 类的子类,即final类不能被继承。 不能覆盖 final 方法。 final 变量是常量。 在 final 类中的所有方法和数据成员是显式的。 引用类型的final变量,不能引用任何其他变量,Page 7,空 final 变量,final 变量不在其声明中被初始化;其初始化被延迟: 空 final 实例变量必须在构建器中被赋值。 空 final 本地变量可在方法的主体内随时被设置。 它仅可设置一次。,Page 8,枚举的类型,enum 类型字段由一组固定的常量组成。 可使用 enum 关键字来定义 enum 类型。例如,指定一周每一天的 enum 类型: public enum Day SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY enum 类型 只能取特定值的一个。 所有 enums 从 java.lang.Enum 显示扩展。因为 Java 不支持多重继承,enum 不能扩展为任何别的内容。,Page 9,静态导入,J2SE 5.0提供静态导入功能,能够不受限制的访问静态成员,而不必使用类的名字限制它们。 从类中导入静态成员: import static ; 或import static *; 单个或集中导入成员: import static cards.domain.Suit.SPADES; 或import static cards.domain.Suit.*; 无需确定静态常量的资格: PlayingCard card1 = new PlayingCard(SPADES, 2); 过度使用静态导入功能,使程序不可读或者无法维持,而且会破坏其命名空间和所有导入的静态成员,Page 10,抽象类,用abstract关键字来修饰一个类时,这个类叫做抽象类; abstract class classname 成员变量; 成员方法; 用abstract来修饰一个方法时,该方法叫做抽象方法。是只声明首部没有方法体的成员方法 abstract returnType abstractMethod(paramlist) 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。如果重写不了,应该声明自己为抽象。 抽象方法只需声明,而不需实现,而且不允许使用final修饰abstract方法 抽象类不能被实例化。但是它们可以被子类化。,Page 11,抽象类,抽象类定义其他类的通用属性和行为。 它用作基类来获取相同类型的特定类。例如: abstract class Animal private String name; Animal(String name) = name; public abstract void enjoy(); Abstact class Cat extends Animal private String eyesColor; Cat(String n,String c) super(n); eyesColor = c; public Abstact void enjoy() ; 上述抽象方法 enjoy 由 Animal 类的子类来继承。子类 Cat、Dog和 Monkey 以不同的方式实现此方法。 enjoy方法在Cat类中已被覆盖,class Dog extends Animal private String furColor; Dog(String n,String c) super(n); furColor = c; public void enjoy() System.out.println(“狗叫声“); class Monkey extends Animal private String head; Monkey(String n,String c) super(n);head = c; public void enjoy() System.out.println(“猴叫声“); ,abstract类不能用new运算创建对象 对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象,如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。 一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,抽象类中的抽象方法可以强制子类必须给出这些方法的具体实现。,抽象类,Page 13,接 口,接口(interface)是抽象方法和常量值的定义的集合。 公共接口是在客户端代码和实现该接口的类之间的一种约定。 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。 抽象类仅用于在类之间有一种关系的情况。 接口定义举例:,public interface Runner public static final int id = 1; public void start(); public void run(); public void stop(); ,Page 14,接口特性,接口可以多重实现; 接口中声明的属性默认为 public static final 的;也只能是 public static final 的; 接口中只能定义抽象方法,而且这些方法默认为public的、也只能是public的; 接口可以继承其它的接口,并添加新的属性和抽象方法。,Page 15,接 口,多个无关的类可以实现同一个接口。 一个类可以实现多个无关的接口。 与继承关系类似,接口与实现类之间存在多态性。 定义Java类的语法格式: class extends implements ,* * ,Page 16,接 口 举 例,interface Singer public void sing(); public void sleep(); class Student implements Singer private String name; Student(String name) = name; public void study() System.out.println(“studying“); public String getName()return name; public void sing() System.out.println(“student is singing“); public void sleep() System.out.println(“student is sleeping“); ,Page 17,接 口 举 例,interface Singer public void sing(); public void sleep(); interface Painter public void paint(); public void eat(); class Student implements Singer private String name; Student(String name) = name; public void study()System.out.println(“studying“); public String getName()return name; public void sing() System.out.println (“student is singing“); public void sleep() System.out.println (“student is sleeping“); ,Page 18,接 口 举 例,class Teacher extends Object implements Singer,Painter private String name; public String getString() return name; Teacher(String name) = name; public void teach()System.out.println(“teaching“); public void sing()System.out.println (“teacher is singing“); public void sleep()System.out.println (“teacher is sleeping“); public void paint()System.out.println (“teacher is painting“); public void eat()System.out.println (“teacher is eating“); ,Page 19,接 口 举 例,public class Test public static void main(String args) Singer s1 = new Student(“le“); s1.sing(); s1.sleep(); Singer s2 = new Teacher(“steven“); s2.sing(); s2.sleep(); Painter p1 = (Painter)s2;/也可以当作Painter来看 p1.paint(); p1.eat(); ,输出结果:,student is singing student is sleeping teacher is singing teacher is sleeping teacher is painting teacher is eating,testI/Test.java,接口回调,接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法 . Interface ShowMassage void showInfo(String s); class TV implements ShowMassage public void showInfo(String s) System.out.println(s); Public class Test public static void main (String args) ShowMassage m; /声明接口 m=new TV(); /接口变量中存放对象的引用 m. showInfo(“长虹电视机”); /接口回调 ,Page 21,接口的使用: 声明期望实现一个或更多的类的方法 确定对象的编程接口而无需显示类的实际主体 捕捉非相关类之间的相似性而无需强制类的关系 通过声明实现几个接口的类来模拟多重继承,接口,Page 22,接口用法总结,通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。(就像人拥有一项本领) 通过接口可以指明多个类需要实现的方法。(描述这项本领的共同接口) 通过接口可以了解对象的交互界面,而不需了解对象所对应的类。 使用接口?还是抽象类? interface同时赋予了接口和抽象类的好处 如果父类可以不带任何函数定义,或任何成员变量,那么优先使用接口。,内部类,Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类称为外部类。 内部类可以有自己的成员变量和方法 使用内部类必须先了解内部类与包围它的外部类之间的关系,以及它们的成员之间如何实现相互访问 内部类的类体中不可以声明类变量(静态成员变量)和类方法(静态成员方法)。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。,在内部类中访问外部类,外部类把内部类看做它的一个成员,内部类的身份如同外部类的其他成员变量和成员方法一样。内部类如同外部类的其他成员一样可以用public,private,protected和default修饰。 一个类内部的内部成员之间可以相互访问,由于外部类把内部类看做它的一个成员,所以内部类也可以可以访问外部类的所有成员变量和成员方法,包括外部类的private成员和private方法;外部类通过创建内部类对象访问内部类的成员。 外部类的main方法或者其他类中引用内部类必须使用内部类完整的类标识,在外部类中访问内部类,定义内部类的目的之一是为了实现封装,实现信息的隐藏。因为内部类的类名只能出现在外部类中,或者外部类方法的语句块内。内部类隐藏于外部类内。外部类的方法可以通过创建内部类对象来引用内部类成员。 public class OuterClass /外部类 class GetYear /内部类 private int i=2008; public void showYear( )System.out.println(i); class GetInfor /内部类 private String inf; GetInfor (String inf) this.inf = inf; public void showInfor( ) System.out.println(“Welcom to ”+inf); public void userOuter(String information) /外部类方法 GetYear y = new GetYear( ); /创建内部类对象 y.showYear( ); GetInfor d = new GetInfor(information); /创建内部类对象 d.showInfor( ); public static void main (String args) OuterClass u = new OuterClass(); u.useOuter(“Beijing”); ,静态内部类的应用,如果一个内部类是静态的,那么这个类就自动成为顶级类,没有父类 静态内部类的方法(不管是静态方法还是非静态方法)只能直接访问外部类中静态成员,要访问外部类中非静态成员则必须在内部类创建外部类对象,通过对象名访问外部静态成员。而且非静态内部类不能声明静态成员。 由于内部类被声明为静态后无法正常访问外部类非静态成员,这收到了很大的限制。一般情况下,当一个内部类不需要访问外部类成员,或者是需要声明静态成员,或者是仅仅为了隐藏在外部类内时,可以把内部类声明为静态的 。 静态内部类的使用主要有几个方面原因: 需要在内部类定义静态成员 希望隐藏内部类 避免类名重复。在开发大型的应用程序的时候需要设计大量的类,类存在重名的可能。为了避免这种情况,可以把可能重名的类设置为static、public的内部类。其他类在引用的时候要是有完整的内部类名标识(外部类名.内部类名),这样就可以避免重复。,静态内部类的应用,public class staticInclass public static class Person private int age; private String name; static int count=0; Person(String n,int a) name=n; age=a; count+; public void dis() System.out.println(“count= “+count+“t“+name+“t“+age); public static void main (String args) staticInclass.Person p1=new staticInclass.Person(“John“,20); p1.dis(); staticInclass.Person p2=new staticInclass.Person(“Jone“,22); p2.dis(); staticInclass.Person p3=new staticInclass.Person(“Jim“,21); p3.dis(); ,静态内部类的特殊用处,在开发应用程序的时候要编写大量的类,并需要对类进行调试。根据静态内部类的特点,编写一个类时,在类中可以定义一个静态内部类以提供一个独立的、可选的辅助功能,如用在代码测试和演示,这个方便而有效。 public class Outer /外部类 private int i,j; static int s=1; Outer(int a,int b)i=a;j=b; public void dis()System.out.println(i+ “ ”+j); public static class TestOuter /含有静态main方法的静态内部类 public static void main (String args) /测试外部类 Outer t= new Outer(10,100); /创建外部类对象 t.dis();System.out.println(s) /静态内部类可以访问外部类的静态成员 为了测试外部类而定义的内部类必须是静态的,因为只有静态内部类才可以定义静态的main方法,在该方法完成对外部类的测试,String 类,java.lang.String 类代表不可变的字符序列。 “xxxxx” 为该类的一个对象。 String类的常见构造方法: String(String original) 创建一个String对象为original的拷贝。 String(char value) 用一个字符数组创建一个String对象 String(char value,int offset,int count) 用一个字符数组从offset项开始的count个字符序列创建一个String对象,String 类举例(1),public class Test public static void main(String args) String s1 = “hello“; String s2 = “world“; String s3 = “hello“; System.out.println(s1 = s3); /true s1 = new String (“hello“); s2 = new String(“hello“); System.out.println(s1 = s2); /false System.out.println(s1.equals(s2); /true char c= s,u,n, ,j,a,v,a; String s4 = new String(c); String s5 = new String(c,4,4); System.out.println(s4); /sun java System.out.println(s5); /java ,String 类常用方法(1),public char charAt(int index) 返回字符串中第index个字符。 public int length() 返回字符串的长度。 public int indexOf(String str) 返回字符串中出现str的第一个位置 public int indexOf(String str,int fromIndex) 返回字符串中从fromIndex开始出现str的第一个位置 public boolean equalsIgnoreCase(String another) 比较字符串与another是否一样(忽略大小写) public String replace(char oldChar,char newChar) 在字符串中用newChar字符替换oldChar字符,String 类举例(2),public class Test public static void main(String args) String s1 = “sun java“,s2 = “Sun Java“; System.out.println(s1.charAt(1);/u System.out.println(s2.length();/8 System.out.println(s1.indexOf(“java“);/4 System.out.println(s1.indexOf(“Java“);/-1 System.out.println(s1.equals(s2);/false System.out.println(s1.equalsIgnoreCase(s2); /true String s = “我是程序员,我在学java“; String sr = s.replace(我,你); System.out.println(sr); /你是程序员,你在学java ,String 类常用方法(2),public boolean startsWith(String prefix) 判断字符串是否以prefix字符串开头 public boolean endsWith(String suffix) 判断字符串是否以prefix字符串结尾 public String toUpperCase() 返回一个字符串为该字符串的大写形式 public String toLowerCase() 返回一个字符串为该字符串的小写形式 public String substring(int beginIndex) 返回该字符串从beginIndex开始到结尾的子字符串 public String substring(int beginIndex,int endIndex) 返回该字符串从beginIndex开始到endIndex结尾的子字符串 public String trim() 返回将该字符串去掉开头和结尾空格后的字符串,String 类举例(3),public class Test public static void main(String args) String s = “Welcome to Java World!“; String s1 = “ sun java “ ; System.out.println(s.startsWith(“Welcome“); /true System.out.println(s.endsWith(“World“); /false String sL = s.toLowerCase(); String sU = s.toUpperCase(); System.out.println(sL); /welcome to java world! System.out.println(sU); /WELCOME TO JAVA WORLD! String subS = s.substring(11); System.out.println(subS);/Java World! String sp = s1.trim(); System.out.println(sp);/sun java ,String 类常用方法(3),静态重载方法 public static String valueOf()可以将基本类型数据转换为字符串;例如: public static String valueOf(double d) public static String valueOf(int i) b + “”; 方法 public String split(String regex)可以将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。,String 类举例(4),public class Test public static void main(String args) int j = 1234567; String sNumber = String.valueOf(j); /j+” System.out.println (“j 是“+sNumber.length()+“位数。“); String s = “Mary,F,1976“; String sPlit = s.split(“,“); for(int i=0;isPlit.length;i+) System.out.println(sPliti); ,StringBuffer 类,java.lang.StringBuffer 代表可变的字符序列。 StringBuffer和String类似,但StringBuffer可以对其字符串进行改变。 StringBuffer类的常见构造方法: StringBuffer() 创建一个不包含字符序列的“空”的StringBuffer对象。 StringBuffer(String str) 创建一个StringBuffer对象,包含与String对象str相同的字符序列。,StringBuffer常用方法(1),重载方法 public StringBuffer append() 可以为该StringBuffer 对象添加字符序列,返回添加后的该StringBuffer对象引用,例如: public StringBuffer append(String str) public StringBuffer append(StringBuffer sbuf) public StringBuffer append(char str) public StringBuffer append (char str,int offset,int len) public StringBuffer append(double d) public StringBuffer append(Object obj) ,StringBuffer常用方法(2),重载方法 public StringBuffer insert()可以为该StringBuffer 对象在指定位置插入字符序列,返回修改后的该StringBuffer对象引用,例如: public StringBuffer insert (int offset,String str) public StringBuffer insert (int offset,double d) 方法 public StringBuffer delete(int start,int end) 可以删除从start开始到end-1为止的一段字符序列,返回修改后的该StringBuffer对象引用。,StringBuffer常用方法(3),和 String 类含义类似的方法: public int indexOf(String str) public int indexOf(String str,int fromIndex) public String substring(int start) public String substring(int start,int end) public int length() 方法 public StringBuffer reverse()用于将字符序列逆序,返回修改后的该StringBuffer对象引用。,StringBuffer类举例,public class Test public static void main(String args) String s = “Mircosoft“; char a = a,b,c; StringBuffer sb1 = new StringBuffer(s); sb1.append(/).append(“IBM“) .append(/).append(“Sun“); System.out.println(sb1); StringBuffer sb2 = new StringBuffer(“数字“); for(int i = 0;i=9;i+)sb2.append(i); System.out.println(sb2); sb2.delete(8,sb2.length().insert(0,a); System.out.println(sb2); System.out.println(sb2.reverse(); ,输出结果:,Mircosoft/IBM/Sun 数字0123456789 abc数字012345 543210字数cba,Math类,java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。 abs 绝对值 acos,asin,atan,cos,sin,tan sqrt 平方根 pow(double a, double b) a的b次幂 log 自然对数 exp e为底指数 max(double a, double b) min(double a, double b) random() 返回 0.0 到 1.0 的随机数 long round(double a) double型的数据a转换为long型(四舍五入) toDegrees(double angrad) 弧度-角度 toRadians(double angdeg) 角度-弧度,File 类,java.io.File类代表系统文件名(路径或文件名)。 File类的常见构造方法: public File(String pathname) 以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论