Java课程复习之面向对象(下)
一、this与super
1.this的用法
- 表示当前对象引用,常用于形参或局部变量与类的成员变量同名的情形,使用this.成员名表示当前对象的成员
例如:this.name = name; - 表示当前对象
- 调用当前类的构造方法
class AddClass { public int x=0,y=0,z=0; AddClass (int x) { this.x = x; } AddClass (int x,int y) { this(x); this.y = y; } AddClass (int x,int y,int z) { this(x,y); this.z = z; } public int add() { return x+y+z; } }
2.super的用法
- super访问当前类的直接父类
- 子类的数据成员或成员方法与父类的数据成员或成员方法名字相同时,当要调用父类的同名方法或同名函数成员时用super来指明,即super.数据成员;super.成员方法;
- super(参数),表示显示调用父类的构造方法
3.继承情形下构造方法的调用
- 父类含参构造方法,子类可以在自己的构造方法中使用super来显示调用,但必须时子类构造方法的第一个可执行语句
- 若子类构造方法中没有显示调用父类的构造方法,则在产生子类的对象时,系统在调用子类的构造方法时,默认调用父类的无参构造方法。
- 子类的构造方法必定调用父类的构造方法。如果不显示用super方法,必然隐含调用super();
4.子类对象实例化的过程
- 1为子类对象分配空间,对成员变量进行默认的初始化
- 2绑定子类构造方法,将new中的参数传递给构造方法的形式参数
- 3调用this或super语句(二者必居其一,不能同时存在),对从父类继承来的实例变量进行初始化。
- 4按照定义顺序执行实例变量初始化操作。
- 5执行子类构造方法的剩余代码。
二、抽象类
1.定义
- 用abstract修饰的类称为抽象类,用abstract修饰的成员方法称为抽象方法。
- 抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。只要有一个抽象方法,类前就必须有abstract修饰
- 抽象类不能创建对象,创建对象由具体子类来实现,但可以有声明,声明能引用所有具体子类的对象。
- 对于抽象方法,在抽象类中只指定方法名及类型,而不写实现代码。抽象类必定要派生子类,若派生的子类是具体类,则具体子类中必须实现抽象类中定义的所有抽象方法(覆盖)
- 在抽象类中,非抽象方法可以调用抽象方法。
- abstract不能与final修饰同一个类
- abstract 不能与private,static(因为static修饰的方法必然被直接调用),final或native并列修饰同一个方法
2.抽象类的应用
- 抽象类和具体类的关系就是一般类和特殊类之间的关系,在继承体系中对外提供抽象的子类公共行为
- 采用抽象类重构程序,消除冗余
抽取共同行为接口,抽取可复用的变量
3.抽象类设计注意
- 在设计抽象类的具体子类时,追求它们在实现抽象方法方面所表现的不同性。
子类是抽象类的具体实现者 - 在确定抽象类的抽象方法时,一定要确保这些抽象方法就是同类对象共同行为的抽取
三、接口
1.含义
- 可以被引用调用的方法(public方法或同包中的protected方法或默认方法)
- 专有概念interface
interface是方法说明的集合
2.interface声明格式
- [public] interface 接口名 [extends 父接口名列表]
3.接口定义注意事项
- 接口定义用关键字interface, interface前的修饰符要么为public,要么为缺省。
- 在类中,用implements关键字来实现接口。一个类可以实现多个接口,在implements后用逗号隔开多个接口的名字。一个接口也可被多个类来实现。
- 接口具有继承性,可通过extends关键字声明接口的父接口列表。
- 接口定义的数据成员全是public final static(静态常量)。存储在该接口的静态存储区域内,使用接口名.字段或实现类.字段均可访问。
- 接口中没有构造方法;所有的抽象方法都是public abstract 方法(与抽象类有所不同)注:方法前不能修饰为final。
- 如果实现某接口的类不是abstract修饰的抽象类,则在类的定义部分必须实现接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致。
- 如果实现接口的类是abstract类,则它可以不实现该接口的所有方法。但对于抽象类的任何一个非抽象的子类而言,接口中的所有抽象方法都必须实现。
- 类在实现接口的抽象方法时,必须显式使用public修饰符,否则将被警告为缩小了接口中定义的方法的访问控制范围。
4.接口的角色
- 接口扮演将实现者和使用者有机联系到一起的角色。
- 接口的设计用途:通用可拓展代码,多态体现
5.抽象类与接口
- 相同点:二者都可具有抽象方法,都不能实例化,但都可以有自己的声明,并能引用子类或实现类对象。
- 不同点:
特性 接口 抽象类 组合 新类可以组合多个接口 只能继承单一抽象类 状态 不能包含属性(除了静态属性,不支持对象状态) 可以包含属性,非抽象方法可能引用这些属性 默认方法和抽象方法 不需要在子类中实现默认方法,默认方法可以引用其他接口的方法 必须在子类中实现抽象方法 构造器 没有构造器 可以有构造器 可见性 隐式public 可以是protected或友元
四、引用
1.引用要点
- 先声明,后初始化(将对象赋给引用)
- 抽象类声明进行引用的特点:
抽象类声明可以引用所有具体子类对象 - 引用可以替换,但是替换是有原则的:父类引用可以指向子类对象,子类声明不能引用平行级别的其它类的对象,也不能引用父类对象。
- 父类声明和子类声明引用同一个子类对象的区别
//子类声明引用子类实例 Rect rect = new Rect(25,25); //父类声明引用子类实例,子类类型转到父类类型,向上转型 Shape s = new Rect(10,30); s = rect; //通过子类引用可以调用只存在于子类的方法 rect.drawRect(); //通过父类引用只能调用父类可见的方法,即子类共有的方法 s.getArea(); //向下转型,获得子类引用类型,需显式类型转换 Rect rect1 = (Rect)s; rect1.drawRect();
2.引用比较
1.equals方法
- equals方法是Object类的方法,比较本引用和参数指明的某个引用是否相等,即是否指向同一对象。返回true或false。
- 自定义类通常需要覆写equals方法和hashcode方法
2.使用“==”比较
- 如果两边是对象引用则比较的是它们的引用是否相同
- 如果两边是数值,则比较的是它们的值
如果值类型不同,有可能发生类型转化,例如10==10.0将返回true - 如果一边是引用,一边是值,则编译错误。
3.instanceof
- 二元运算符,判断对象是否为特定类的实例
- 用法:boolean result = object instanceof class
五、内部类
1.定义
- 内部类就是在某个类的内部又定义了一个类
- 内部类可以直接访问外部类的所有成员
- 常用场景:隐藏底层实现细节
2.分类
- 静态内部类
- 抽象内部类
3.匿名对象
- 匿名对象就是在产生对象时没有显式地为这个对象建立引用。
例如 Person p1 = new Person();p1.shout();
如果改为new Person().shout();就是匿名对象了。 - 匿名对象在两种情况下经常使用:
如果对一个对象只需要进行一次方法调用。
将匿名对象作为参数传递给一个函数调用。
4.匿名内部类
- 匿名内部类就是在类中需要实例化这个类的地方,通常为方法内,定义一个没有名称的类
- 实现格式:
- new 类A() { 方法体} 此时产生的对象是类A的子类对象
- new 接口A() { 方法体} 此时产生的对象是类A的实现类对象



