Java面向对象
- Java 类的继承格式
- implements类继承接口
- super 与 this 关键字
- final 关键字
- 构造方法
- 重写
- 多态
Java 类的继承格式
class 父类 {
}
class 子类 extends 父类 {
}
注: Java 不支持多继承,但支持多重继承
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object
,当一个类没有继承的两个关键字,则默认继承 Object
(这个类在 java.lang 包中,所以不需要 import)祖先类。
implements类继承接口
使用 implements
关键字可以变相的使 Java 具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
super 与 this 关键字
super关键字:通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:
//注: final 定义的类,其中的属性、方法不是 final 的。
final class 类名 {
//类体
}
public/private/default/protected final 返回值类型 方法名(){
//方法体
}
构造方法
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
若父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
若父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
重写
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
//之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。
b.bark();//编译错误,因为b的引用类型Animal没有bark方法。
}
}
————————————————————————————————————
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
^
重写规则:
- 参数列表与被重写方法的参数列表必须完全相同。
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 声明为 static 的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
- 类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
多态
同一个事件发生在不同的对象上会产生不同的结果。
多态存在的三个必要条件:继承、重写、父类引用指向子类对象:Parent p = new Child();
例子:
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
public class testJava {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
//show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
}
else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
________
吃鱼
抓老鼠
吃鱼
抓老鼠
【Python基础】Python 面向对象