哈工程JAVA课件第5章JAVA类的高级特性.ppt_第1页
哈工程JAVA课件第5章JAVA类的高级特性.ppt_第2页
哈工程JAVA课件第5章JAVA类的高级特性.ppt_第3页
哈工程JAVA课件第5章JAVA类的高级特性.ppt_第4页
哈工程JAVA课件第5章JAVA类的高级特性.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 Java类的高级特性,OOP,主要内同,5.1 访问控制 5.2 方法重载 5.3 构造方法 5.4 初始化块 5.5 内部类和匿名类,5.1 成员访问控制,成员访问控制是用来控制类中成员的访问范围,由修饰符声明。下表列出了常见的成员访问控制修饰符。,public class Hello public int i=10; private int j=20; protected int k=30; public void f() System.out.println(this is f(); private void g() System.out.println(this is g();

2、 protected void h() System.out.println(this is h();,public static void main(String arg) Hello h=new Hello(); System.out.println(h.i); System.out.println(h.j); System.out.println(h.k); h.f(); h.g(); h.h(); ,在一个类中, public, private, protected修饰的成员变量和方法都是可以访问的.,public class A public int i=10; private in

3、t j=20; protected int k=30; public void f() System.out.println(this is f(); private void g() System.out.println(this is g(); protected void h() System.out.println(this is h(); ,public class Hello2 public static void main(String arg) A a=new A(); System.out.println(a.i); System.out.println(a.j); Syst

4、em.out.println(a.k); a.f(); a.g(); a.h(); ,在不同类中, public:该成员变量和方法是共有的,能在任何情况下被访问. private:该成员变量和方法是不能类外成员访问的; protected:必须在同一包中才能被访问.,public class Father public int i=10; private int j=20; protected int k=30; ,public class Son extends Father void f() i=100; j=200; k=300; public static void main(Stri

5、ng arg) Son s=new Son(); s.i=100; s.j=200; s.k=300; ,子类与父类在同一包中 父类中只有声明为private的变量与方法不能子类被访问。,package test1; public class Father public int i=10; private int j=20; protected int k=30; void f_getValue() System.out.println(j); protected void p_getValue() System.out.println(k); ,package test2; import t

6、est1.Father; public class Son extends Father void f() i=100; j=200; k=300; f_getValue(); p_getValue(); public static void main(String arg) Son s=new Son(); s.f(); ,子类与父类不在同一包中此时private与friendly均不能被继承(访问), protected与public可以,5.2 方法的重载(overloading),wash the shirtwash the carwash the dog我们通过判断被wash的物体知

7、道该用哪种方法来wash 早期语言,比如C语言,不同的函数不能通明,导致shirtWash(shirt)carWash(car)dogWash(dog),例: class Wash void wash(Cloth shirt) return shirt; ,参数的不同体现在类型和个数上的不同,一个类中可以有多个方法具有,相同的名字,,相同的类型,,不同的参数,这种情况叫,void wash (Auto car) return car ,void wash (Animal dog,int n) return n; ,重载,5.2 方法的重载(overloading),要注意到重载的方法参数必须有

8、所区别: 参数的类型不同。 参数的顺序不同。这里是指一个方法有多个不同类型参数的情况,改变参数的顺序,也算是一种区分方法。 参数的个数不同。如例子中的三个重载的方法参数的个数分别是一个、两个和三个。,例:Overloading.java,class Tree int height; Tree() prt(Planting a seedling); height = 0; Tree(int i) prt(Creating new Tree that is + i + feet tall); height = i; static void prt(String s) System.out.prin

9、tln(s); ,void info() prt(Tree is +height+feet tall); void info(String s) prt(s+: Tree is +height+feet tall); public class Overloading public static void main(String args) for(int i = 0; i 5; i+) Tree t = new Tree(i); (); (overloaded method); / Overloaded constructor: new Tree(); ,主要内同,5.

10、1 访问控制 5.2 方法重载 5.3 构造方法 5.4 初始化块 5.5 内部类和匿名类,5.3构造方法,也叫构造器,是一种特殊的方法,其作用是用来构造并初始化对象。 它的名字必须与它所在的类名字相同 且类型为void,但可以有参数,并且可以重载。,5.3构造方法,例: class Rock Rock() / This is the constructor System.out.println(Creating Rock); public class SimpleConstructor public static void main(String args) for(int i = 0; i

11、 10; i+) new Rock(); ,例 2 class Student private double score; private String name; public Student (String n, double s) name =n; score =s; public string getName() return name; ,当用某一个类创建一个对象时,这个类的构造方法将自动被执行,构造方法也常常用来为成员变量赋初值,2、调用另一个构造器 当成员变量与局部变量同名时,可用关键字指向隐式参数,完成对成员变量的引用 如果构造器第一个语句为 this (.); 此处表示调用此

12、类中的另一个构造器,第二种用法,当调用new Student (628) 时, Student ( double s) 构造器首先调用 Student (string s, double n)构造器,例: class Student public Student (String n, double s) name =n; score =s; public Student ( double s) this (no.4: wanghong,s); ,public class b b() this(12); System.out.println(bbb); b(int x) System.out.p

13、rintln(ccc“+x); public static void main(String args) new b(); ,使用关键字this很有用,只需对公共的类定 义一次,例:b.java,This的用法:1.调用全局变量 2.调用本类中其它构造方法 3.对当前对象的引用 (Leaf.java) 4.用当前类作监听器,public class Leaf int i = 0; Leaf increment() i+; return this; void print() System.out.println(i = + i); public static void main(String a

14、rgs) Leaf x = new Leaf(); x.increment().increment().increment().print(); ,结果:i=3,5.3.1 默认构造器,如果编写了一个没有构造器的类,则系统会自动为该类提供一个默认的构造器,其名字为类名,无参,方法体为空。 用该类创建对象时,实例变量将被初始化为默认值。,主要内同,5.1 访问控制 5.2 方法重载 5.3 构造方法 5.4 初始化块 5.5 内部类和匿名类,普通初始化,静态初始化,初始化就是用 括起的Java语句,例: int x=0; float pi=3.14.59; ,5.4 初始化块,为成员变量初始化可

15、用如下方法: *在构造器中赋初值 *声明的同时赋值 *用初始化块,初始化块分为,class Student private double score; private String name;,/ object initialization block score=0; name=; ,5.4 初始化块,执行顺序:,b(int x);,初始化块;,Main;,b(),b(int x) System.out.println(ccc“x); ,System.out.println(“init);,public static void main(String args) System.out.pri

16、ntln(main); new b(); ,public class b b() this(12); System.out.println(bbb); ,调用重载的构造,初始化,Main Init Ccc12 bbb,1、静态初始化块常用来初始化静态值 例:static int nextid; static Random gen =new Random(); nextid=gen.nextInt(1000); ,不管是哪个构造器构造了一个对象,首先运行静态初始化块,然后运行初始化块,最后构造器的主体部分被执行。,不管创建几个对象,静态初始化块只被执行一次;而初始化块会被执行多次,public

17、class ConstructerTest1 ConstructerTest1 () this(12); System.out.println(no parameter construct); ConstructerTest1 (int x) System.out.println( one parameter construct); System.out.println(init); static System.out.println( static init); public static void main(String args) new ConstructerTest1 (); new

18、 ConstructerTest1 (); ,运行结果: static init init one parameter construct no parameter construct init one parameter construct no parameter construct,class Employee private String name = ; private double salary; private int id; private static int nextId; / three overloaded constructors public Employee(St

19、ring n, double s) name = n; salary = s; System.out.println( two parameters 222); public Employee(double s) / calls the Employee(String, double) constructor this(Employee # + nextId, s); System.out.println( one parameter 111); / the constructor without paramater public Employee() System.out.println(

20、no parameter 000); ,/ object initialization block System.out.println( initalization); nextId+; / static initialization block static System.out.println(static initalization); Random generator = new Random(); nextId = generator.nextInt(10000); public String getName() return name; public double getSala

21、ry() return salary; public int getId() return id; ,public class ConstructerTest public static void main(String args) / fill the staff array with three Employee objects Employee staff = new Employee3; staff0 = new Employee(Harry, 40000); staff1 = new Employee(60000); staff2 = new Employee(); / print

22、out information about all Employee objects for (int i = 0; i staff.length; i+) Employee e = staffi; System.out.println(name= + e.getName() + ,id= + e.getId() + ,salary= + e.getSalary(); ,主要内同,5.1 访问控制 5.2 方法重载 5.3 构造方法 5.4 初始化块 5.5 内部类和匿名类,5.5 内部类,5.5.1 内部类的声明 5.5.2 匿名内部类声明 5.5.3 内部类的程序设计举例,5.5.1 内部

23、类的声明,嵌套在其它类里面的类称为内部类(inner class)。 内部类主要用于事件处理。,5.5.1 内部类的声明,内部类的声明格式如下: 修饰符 class outerClass 修饰符 class innerClass ,5.5.2 匿名内部类声明,匿名内部类:是指定义的内部类没有类名,所以当程序中使用匿名内部类时,在定义匿名内部类的地方创建该类的一个对象。匿名内部类的声明格式如下: new ClassName() 通过以上格式直接创建ClassName类的一个对象。ClassName后面的小括号表示调用这个匿名内部类的默认构造函数。 而小括号后面的一对大括号中的内容为该匿名内部类的

24、定义。,5.5.3 内部类的程序设计举例,下面通过实例来说明嵌套类的程序设计。该程序包含两个文件Time.java文件和TimeTestWindow.java文件。 Time.java文件定义了一个Time类。在TimeTestWindow.java文件中定义了一个内部类ActionEventHandler和一个匿名内部类。 通过内部类和匿名内部类来处理用户对时间的设置事件。 例Time.java 嵌套类的程序设计示例,5.5.3 内部类的程序设计举例,在声明和使用嵌套类时,应该注意以下事项: (1)包含嵌套类的类在编译时,将为每个类产生单独的.class文件。 嵌套类文件名为OuterCla

25、ssName$InnerClassName.class。 匿名内部类的文件名为OuterClassName$#.class,#从1开始,编译时,每遇到一个匿名内部类,#递增1。,5.5.3 内部类的程序设计举例,在声明和使用嵌套类时,应该注意以下事项: (2)带有名称的内部类可以声明为public、protected、包访问或private,并且它们的使用限制与其他类成员相同。 (3)内部类能以OuterClassName.this的形式访问其外部类的this引用。,5.5.3 内部类的程序设计举例,在声明和使用嵌套类时,应该注意以下事项: (4)外部类负责创建内部类的对象。为创建另一个类的内

26、部类对象,首先创建该外部类的一个对象,并将该对象的引用赋给外部类类型的变量(我们假设它是outref)。然后使用如下形式创建内部类的对象: OuterClassName.InnerClassName innerRef=outref.new InnerClassName(); (5)静态嵌套类不需创建外部类的对象,静态嵌套类不能访问外部类的非静态成员。,import java.text.DecimalFormat; public class Time private int hour; private int minute; private int second; private static

27、DecimalFormat twoDigits = new DecimalFormat( 00 ); public Time() this( 0, 0, 0 ); public Time( int h ) this( h, 0, 0 ); public Time( int h, int m ) this( h, m, 0 ); public Time( int h, int m, int s ) setTime( h, m, s ); public Time( Time time ) this( time.getHour(), time.getMinute(), time.getSecond(

28、) ); public void setTime( int h, int m, int s ) setHour( h ); setMinute( m ); setSecond( s ); public void setHour( int h ) hour = ( ( h = 0 ,public int getHour() return hour; public int getMinute() return minute; public int getSecond() return second; public String toUniversalString() return twoDigit

29、s.format( getHour() ) + : + twoDigits.format( getMinute() ) + : + twoDigits.format( getSecond() ); public String toString() return ( ( getHour() = 12 | getHour() = 0 ) ? 12 : getHour() % 12 ) + : + twoDigits.format( getMinute() ) + : + twoDigits.format( getSecond() ) + ( getHour() 12 ? AM : PM ); ,T

30、ime.java,import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TimeTestWindow extends JFrame private Time time; private JLabel hourLabel, minuteLabel, secondLabel; private JTextField hourField, minuteField, secondField, displayField; private JButton exitButton; public TimeTe

31、stWindow() super( Inner Class Demonstration ); time = new Time(); Container container = getContentPane();/容器 container.setLayout( new FlowLayout() );/布局 hourLabel = new JLabel( “Set Hour” );/小时标签 hourField = new JTextField( 10 );/小时文本框 container.add( hourLabel ); container.add( hourField ); minuteLa

32、bel = new JLabel( Set Minute ); minuteField = new JTextField( 10 ); container.add( minuteLabel ); container.add( minuteField ); secondLabel = new JLabel( Set Second ); secondField = new JTextField( 10 ); container.add( secondLabel ); container.add( secondField ); displayField = new JTextField( 30 );

33、 displayField.setEditable( false );/不能编辑 container.add( displayField ); exitButton = new JButton( “Exit” );/按钮 container.add( exitButton );,/ create an instance of inner class ActionEventHandler ActionEventHandler handler = new ActionEventHandler(); hourField.addActionListener( handler ); /为小时文本框设置监听器 minuteField.addActionListener( handler ); /为分钟文本框设置监听器 secondField.addActionListener(/创建一个匿名类,为秒文本框设置监听器 new ActionListener() public void actionPerformed(ActionE

温馨提示

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

评论

0/150

提交评论