《JAVA_9 类的高级特性课件》由会员分享,可在线阅读,更多相关《JAVA_9 类的高级特性课件(26页珍藏版)》请在金锄头文库上搜索。
1、1,第九章:类的高级特性,抽象类 内部类 Class类和Java反射 使用注解功能,2,第九章:类的高级特性,9.1、抽象类 抽象方法:用abstract修饰的方法。只有方法的声明,没有方法的实现。 abstract 方法名(参数列表); 抽象类:包含抽象方法的类。 abstract class 类名 类体 ,3,第九章:类的高级特性,9.1、抽象类: package com.mingrisoft; abstract class Fruit public String color; public Fruit() color = 绿色; public abstract void harvest(
2、); ,4,第九章:类的高级特性,9.1、抽象类: class Apple extends Fruit Override public void harvest() System.out.println(苹果已经收获!); public class Orange extends Fruit Override public void harvest() System.out.println(桔子已经收获!); ,5,第九章:类的高级特性,9.1、抽象类: public class Farm public static void main(String args) System.out.print
3、ln(调用Apple类的harvest()方法的结果:); Apple apple = new Apple(); apple.harvest(); System.out.println(调用Orange类的harvest()方法的结果:); Orange orange = new Orange(); orange.harvest(); ,调用Apple类的harvest()方法的结果: 苹果已经收获 调用Orange类的harvest()方法的结果: 橘子已经收获,6,第九章:类的高级特性,9.1、抽象类的规定: 抽象类不能被直接实例化,只有它的非抽象子类可以创建对象; 抽象类中不一定包含抽象
4、方法,但有抽象方法的类必定是抽象类; 抽象类中的抽象方法只是声明,不包含方法体,即不给出方法的实现; 构造方法、类方法(static)不能声明为抽象方法; 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。,抽象类与接口,从开发上讲:优先使用接口,因为接口运行多继承,第九章:类的高级特性,8,第九章:类的高级特性,9.2、内部类: 内部类:在一个类中定义了另外一个类。,9,第九章:类的高级特性,9.2.1、成员内部类: 作为外部类的一个成员存在,与外部类的属性、方法并列。 语法如下: public class OuterClass private class InnerC
5、lass ,10,9.2.1、成员内部类:,在外部类中访问内部类: 把内部类看成一个类,然后创建该类的对象,使用对象来调用内部 类中的成员。 01class Wai 02 03class Nei 04 05int i=5; 06 07public void myVoid() 08 09Nei n=new Nei(); 10int ii=n.i; 11System.out.println(内部类的变量值为:+ii); 12 13 14public class NeiBuLei2 15 16public static void main(String args) 17 18Wai w=new Wa
6、i(); 19w.myVoid(); 20 21,内部类的变量值为:5,11,9.2.1、成员内部类:,在外部类外访问内部类: 基本语法如下所示: Wai.Nei wn=new Wai().new Nei(); 该方法也是可以分为两条语句的。 Wai w=new Wai(); Wai.Nei wn=w.new Nei(); 首先是创建一个外部类的对象,然后让该外部类对象调 用创建一个内部类对象。,12,9.2.1、成员内部类:在外部类外访问内部类,class Wai class Nei int i=5; int ii=6; public class NeiBuLei3 public stati
7、c void main(String args) Wai.Nei wn1=new Wai().new Nei(); Wai w=new Wai(); Wai.Nei wn2=w.new Nei(); System.out.println(内部类中的变量i的值为:+wn1.i); System.out.println(内部类中的变量ii的值为:+wn2.ii); ,内部类中的变量i的值为:5 内部类中的变量ii的值为:6,13,9.2.1、成员内部类:,内部类中访问外部类 在内部类中访问外部类,就像所有的同一个类中成员互相访问一样,这样是没有限制的,包括将成员声明为private私有的。 cla
8、ss Wai int i=8; class Nei public void myVoid() System.out.println(外部类中的成员变量值为:+i); public class NeiBuLei5 public static void main(String args) Wai w=new Wai(); Wai.Nei wn2=w.new Nei(); wn2.myVoid(); ,外部类中的成员变量值为:8,14,9.2.1、成员内部类:,在内部类和外部类中具有同名称变量 class Wai int i=8; class Nei int i=9; Wai ww=new Wai(
9、); public void myVoid() System.out.println(内部类中的成员变量值为:+i); System.out.println(外部类中的成员变量值为:+ww.i); public class NeiBuLei6 public static void main(String args) Wai w=new Wai(); Wai.Nei wn2=w.new Nei(); wn2.myVoid(); ,内部类中的成员变量值为:9 外部类中的成员变量值为:8,两个成员变量的名称相同: 而在内部直接访问时,将访问的是内部类的成员变量。 要想访问外部类成员变量,就需要首先创
10、建一个外部类对象,然后使用该对象调用外部类成员变量。,15,第九章:类的高级特性,9.2.2、局部内部类: 局部内部类:在类的方法中定义的类。作为一个类的局部变量来定义 局部内部类的作用范围是和局部变量的作用范围相同的,即在所定义的方法体内。 在局部内部类中可以直接调用外部类的成员变量。 局部内部类中访问外部类的局部变量是不能访问普通的局部变量的,必须将该局部变量声明为final(即常量)。,16,9.2.2、局部内部类:,package com.mingrisoft; public class SellOutClass private String name; public SellOutC
11、lass() name = 苹果; public void sell(int price) class Apple int innerPrice = 0; public Apple(int price) innerPrice = price; public void price() / 方法 System.out.println(现在开始销售 + name); System.out.println(单价为: + innerPrice + 元); Apple apple = new Apple(price); apple.price(); ,17,9.2.2、局部内部类:,public stat
12、ic void main(String args) SellOutClass sample = new SellOutClass(); sample.sell(100); ,现在开始销售苹果 单价:100元,18,9.2.2、局部内部类:,class Wai public void myVoid() int i=9; class Nei public void myNeiVoid() System.out.println(外部类的局部变量值为:+i); Nei n=new Nei(); n.myNeiVoid(); public class NeiBuLei10 public static v
13、oid main(String args) Wai w=new Wai(); w.myVoid(); ,局部内部类中访问外部类的局部变量是不能访问普通的局部变量的,必须将该局部变量声明为final。,无法运行!有错误提示,19,第九章:类的高级特性,9.2.3、匿名内部类 匿名内部类:没有名字的内部类。 因为没有名字,故匿名内部类只能使用一次,通常用来简化代码编写; 前提条件:必须继承一个父类或实现一个接口。,20,9.2.3、匿名内部类,实例1:不使用匿名内部类来实现抽象方法 abstract classPerson publicabstractvoideat(); classChild e
14、xtendsPerson publicvoideat() System.out.println(eat something); publicclassDemo publicstaticvoidmain(String args) Person p = newChild(); p.eat(); ,运行结果:eat something,此处的Child类若只 使用一次,如何改写?,21,9.2.3、匿名内部类,实例2:匿名内部类的基本实现 abstractclassPerson publicabstractvoideat(); publicclassDemo publicstaticvoidmain
15、(String args) Person p = newPerson() publicvoideat() System.out.println(eat something); ; p.eat(); ,运行结果:eat something,匿名内部类还能用于接口上!,22,9.2.3、匿名内部类,实例3:在接口上使用匿名内部类 interfacePerson publicvoideat(); publicclassDemo publicstaticvoidmain(String args) Person p = newPerson() publicvoideat() System.out.pri
16、ntln(eat something); ; p.eat(); ,运行结果:eat something,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以用匿名内部类实现。,23,第九章:类的高级特性,9.2.4、静态内部类 静态内部类:用static修饰的内部类。它在外部类中扮演静态成 员的作用。 定义静态内部类语法: class Wai static class Nei /内部类成员 /外部类成员 ,24,9.2.4、静态内部类,在外部类中访问静态内部类:和在外部类中访问非静态内部类一样的, class Wai static class Nei int i=5; public void myVoid() Nei n=new Nei(); int ii=n.i; System.out.println(静态内部