4 Java基础09-面向对象【多态】( 四 )


课堂练习-
定义一个接口用来实现两个对象的比较 。interface CompareObject{public int compareTo(Object o); //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小}定义一个Circle类,声明redius属性,提供getter和setter方法定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口 。在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小 。定义一个测试类InterfaceTest,创建两个ComparableCircle对象,调用compareTo方法比较两个类的半径大小 。思 考 : 参 照 上 述 做 法 定 义 矩 形 类 Rectangle 和 ComparableRectangle 类 ,在ComparableRectangle类中给出compareTo方法的实现,比较两个矩形的面积大小 。
5.4 接口的改进
Java 8中,可以为接口添加静态方法和默认方法 。从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念 。
6 内部类
内部类:在一个类的内部定义得类
6.1 概述
分类:
成员内部类作为类的成员的角色:
成员内部类作为类的角色:
注意
非的成员内部类中的成员不能声明为的,只有在外部类或的成员内部类中才可声明成员 。
外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
成员内部类可以直接使用外部类的所有成员,包括私有的数据
当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
示例代码
class Outer {private int s;public class Inner {public void mb() {s = 100;System.out.println("在内部类Inner中s=" + s);} }public void ma() {Inner i = new Inner();i.mb();} }public class InnerTest {public static void main(String args[]) {Outer o = new Outer();o.ma();} }
6.2 内部类的使用语法
如何实例化成员内部类
如何在成员内部类中调用外部类的结构
//创建Dog实例(静态的成员内部类):Person.Dog dog = new Person.Dog();dog.show();//创建Bird实例(非静态的成员内部类)://Person.Bird bird = new Person.Bird();//错误的Person p = new Person();Person.Bird bird = p.new Bird();bird.sing();
1.在外部类的内部结构中使用 //在外部方法中new()
?= car.new ();
2.在外部类 //在外部main中new();
//如果内部类是一个非静态的结构,那么就不能直接在外部直接实例化
? Car car = new Car() ;
?= car.new ();
//如果内部类是一个静态()的结构,那么就不能直接在外部直接实例化
? Car.= new Car.( );
?. start();
6.3 匿名内部类
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例 。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类 。
格式:
new 父类构造器(实参列表)|实现接口(){ //匿名内部类的类体部分 }new Animal(){// 方法重写}
匿名内部类的特点
示例代码
interface A{public abstract void fun1();}public class Outer{public static void main(String[] args) {new Outer().callInner(new A(){//接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名public void fun1() {System.out.println(“implement for fun1");}});// 两步写成一步了}public void callInner(A a) {a.fun1();}}
1.具名类的具名对象
? Cat cat=new Cat();
2.具名类的匿名对象