java复习笔记——面向对象(二)
- this与super
- override与overload
- Interface与abstract类
- final与static
- 多态
- 枚举、内部类
接口与抽象类
类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。
在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
抽象类和接口的区别:
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是** public static final **类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
注: 抽象类和接口都可以有实体方法。接口中的实体方法,叫做默认方法;接口里也可以有静态方法和方法体了。(均为JDK 1.8新特性)
抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
public abstract class A {
String name;
// A的子类会被要求实现抽象方法move
public abstract void move();
}
public class B extends A {
// B作为A的子类实现抽象方法move
public abstract void move(){
System.out.println("B move");
}
}
接口
接口的作用就是把定义接口的人和实现接口的人分开,实现接口的人不必要关心谁去定义,而定义接口的人也不用关心谁实现的接口。简单、规范性、易维护、易拓展。
interface A {
public void play();
public void eat();
}
interface B {
public void move();
}
//在Java中,类的多继承不合法,但接口允许多继承。
interface AB extends A, B{
}
//C有A,B两个接口
public class c implements A, B{
public void play(){
System.out.println("C play");
}
public void eat(){
System.out.println("C eat");
}
public void move(){
System.out.println("C move");
}
}
final与static
final修饰符
final修饰 | 作用 |
---|---|
类 | 被修饰的类不能够被继承 |
方法 | 被修饰的方法不能够被重写 |
变量 | 被修饰的变量只有一次赋值机会 |
引用 | 被修饰的引用只有1次指向对象的机会 |
static修饰符
-
静态变量:
static 关键字用来声明独立于对象的静态变量,即类没有实例化时就可直接使用。无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。 -
静态方法:
static 关键字用来声明独立于对象的静态方法,即类没有实例化时就可直接使用。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后给出数据运行结果。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
例如:同一个接口,使用不同的实例而执行不同操作;+ 符号可以作为算数运算,也可以作为字符串连接;父类的引用可以指向子类对象。
多态的优点:1. 消除类型之间的耦合关系。2. 可替换性。3. 可扩充性。4. 接口性。5. 灵活性。6. 简化性。
//接口的多态
public interface A {
public void eat();
}
public class B implements A {
public void eat(){
System.out.println("B eat");
}
}
public class C implements A {
public void eat(){
System.out.println("C eat");
}
}
//类的多态
public class Ball {
public void play(){
System.out.println("Play");
}
}
public class BasketBall extend Ball{
public void play(){
System.out.println("Play Basketball");
}
}
public class FootBall extend Ball{
public void play(){
System.out.println("Play Football");
}
}
运行代码:
public static void main(String[] args) {
//接口的多态
A b = new B()
A c = new C()
b.eat(); //输出b eat
c.eat(); //输出c eat
//类的多态
Ball basketball = new BasketBall();
Ball football = new Football();
basketball.play(); //输出Play Basketball
football.play(); //输出Play Football
}
枚举、内部类
枚举
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
enum Color {
RED, GREEN, BLUE;
}
public class Test {
public static void main(String[] args) {
// 调用 values(),返回枚举类中所有的值。
Color[] arr = Color.values();
// 迭代枚举
for (Color col : arr) {
// 可以找到每个枚举常量的索引,就像数组索引一样。
System.out.println(col + " at index " + col.ordinal());
}
// 使用 valueOf() 返回枚举常量,不存在的会报 IllegalArgumentException
System.out.println(Color.valueOf("RED"));
}
}
内部类
内部类分为四种:非静态内部类、静态内部类、匿名类、本地类
主要记录下匿名类和本地类
-
内部类:
内部类指在已有的类中成员位置再声明一个类。 -
匿名类:
匿名类指的是在声明一个类的同时实例化它,在Android代码中较为常用。 -
本地类:
本地类可以理解为有名字的匿名类
代码示例:
public abstract class A {
public abstract void eat();
public static void main(String[] args) {
//匿名类
A a = new A(){
//实现A的抽象方法eat
public void eat() {
System.out.println("A Eat");
}
};
a.eat(); //输出A Eat
//本地类
class B extends A{
//实现A的抽象方法eat
public void eat() {
System.out.println("B Eat");
}
}
B b = new B();
b.eat(); //输出B Eat
}
}
参考连接:
https://www.runoob.com/java/java-polymorphism.html
https://how2j.cn/k/interface-inheritance/interface-inheritance-interface/289.html