82-多态和重载
多态性是面向对象的重要部分。通常使用方法的重载和重写实现类的多态性。
- 重写的多态性:重写后子类和父类的方法体不同,功能也不一样。
- 重载:在一个类中出现多个方法名相同,但参数的个数、类型不同的方法,称为方法的重载。
示例:定义一个加法器类,重载Add方法
public class Calculator {
public int Add(int a, int b) {
return a + b;
}
public float Add(float a, float b) {
return a + b;
}
// 返回值不作为重载的条件
public int Add(float a, float b) {
return 1;
}
public int Add(int a, float b) {
return a;
}
public float Add(float a, int b) {
return a + b;
}
}Code language: PHP (php)
注意:方法的返回值类型不作为重载的条件,只有参数列表(个数、类型、顺序)不同才算重载。
83-抽象类
介于接口和类之间的特殊产物。所谓抽象类就是只声明方法而不去具体实现它的类。抽象类不能被实例化,也就是不能new对象。定义抽象类需要在class前面加上abstract关键字。
抽象类和抽象方法
package cn.bamn;
public abstract class Fruit {
public String color; //抽象类可以有成员变量
public String getColor() {
return color;
}
//抽象方法 使用abstract修饰 没有方法体 不能是static或者private
public abstract String getColor2();
}Code language: PHP (php)
- 抽象方法只能定义在抽象类中
- 抽象方法不能使用
private和static修饰 - 抽象类中可以有抽象方法,也可以有非抽象方法
非抽象类不能含有抽象方法,因为非抽象类可以
new,如果调用抽象方法就会出问题。
继承抽象类
package cn.bamn;
public class Apple extends Fruit {
@Override
public String getColor2() {
// TODO Auto-generated method stub
return null;
}
}Code language: PHP (php)
84-内部类
在一个类中再定义一个类,里面的这个类称为内部类。内部类分为:成员内部类、局部内部类、匿名内部类。
成员内部类
内部类作为类的成员,和成员方法、成员变量同一级别。内部类可以随意使用外部类的成员方法和成员变量,就算这些成员是private。内部类的实例一定要绑定在外部类的实例上。
public class Apple extends Fruit {
private int count = 100;
public void Pick() {
int m = new SubApple().num; //通过对象访问内部类成员
}
class SubApple { //内部类的定义
int num;
int scount = count * 100; //内部类可以访问外部类的成员 就算是private
}
}Code language: PHP (php)
在外部类之外使用内部类
public static void main(String[] args) {
Apple a = new Apple();
Apple.SubApple sb = a.new SubApple(); //通过外部类的对象.new来创建内部类对象
}Code language: JavaScript (javascript)
85-使用this获取内部类与外部类的引用
如果内部类和外部类有同名的成员,内部类中可以使用this来区分:
class SubApple {
int num;
SubApple() {
this.num = num; //this.num是内部类的num,后面的num是外部类的同名num
}
}Code language: JavaScript (javascript)
86-局部内部类
局部内部类是指定义在方法中的类,它的作用范围就是方法体内。
public void Eat() {
class Bug {
Bug() {
num--;
System.out.println("一条虫子吃掉一个苹果:剩下:" + num);
}
}
new Bug();
new Bug();
new Bug();
new Bug();
}Code language: JavaScript (javascript)
输出结果示例:
一条虫子吃掉一个苹果:剩下:99
一条虫子吃掉一个苹果:剩下:98
一条虫子吃掉一个苹果:剩下:97
一条虫子吃掉一个苹果:剩下:96
87-匿名内部类
不一定要给内部类一个名字,可以直接以对象名来代替。匿名内部类的所有实现代码需要在大括号之间进行编写。在图形化编程的事件监听器代码中经常用到大量的匿名类。
88-静态内部类
在内部类前添加修饰符static。静态内部类里面可以定义静态成员,非静态内部类不能定义静态成员。静态内部类不可以使用外部类的非静态成员,但可以有非静态成员。
public static class Helper {
public static int Add(int a, int b) {
return a + b;
}
}Code language: PHP (php)
调用静态内部类:
Helper.Add(1, 2);Code language: CSS (css)