面向对象的特征--继承
概念
什么是继承?
通俗地来讲呢,就是子类继承父类。运用extends关键字来实现继承。
为什么用继承?
子类继承父类以后,子类就可以使用父类所有地功能,不需要重复定义了,大大提高了代码地复用性,这就叫做代码重用。
而子类在自己内部也可以扩展自己特有地功能,不影响其他类,这就叫做代码扩展。
具体语法:
基类(把共有的属性和行为定义在基(父)类中,让其他类去继承即可),从而派生出新的类。
注:子类extends父类,就拥有了父类的行为和属性,但是子类不能访问父类私有的。
继承中的传递性:可以实现多层继承,但是不允许一个类直接继承多个类。
object类是Java中所有类的基类,当一个类没有使用extends继承其他类时,这个类就默认继承object类。
继承的要求:要满足is-a关系,这是代码重用的根基。
继承中的构造方法
创建子类对象,调用子类的构造方法时,会先调用父类的构造方法;默认调用无参构造方法。
使用super();关键字来调用父类的构造方法,必须要放在构造方法体的第一行,因为先要确保父类中的属性初始化;
public Animals(String name,int age){
super();//必须在构造方法体中的第一行
System.out.println("Animals类中的有参构造方法");
this.name = name;
this.age= age;
}
使用super表示父类,对父类中的成员(构造方法,成员变量,成员方法)进行访问;
注:使用super调用父类构造方法时,不会创建父类对象,只会把父类中的信息加载到子类中进行存储。
创建对象时,类的初始化顺序是,会先对父类初始化,然会才是子类。
this与super
this表示访问自己类中的成员;
super表示访问父类中的成员。
方法重写
应用场景:当父类中的方法实现(功能)不能满足子类的需求时,可以在子类中对父类的方法进行重写。
方法重写的要求:方法的结构与父类保持一致,方法名,参数,返回值均保持一致,且访问权限大于等于父类权限。
父类中的方法,原封不动的在子类中进行定义,称为子类重写父类方法;@Override是注解标签,表示此方法是从父类中重写而来的,在编译期间就会进行语法上的校验。
注:构造方法,静态方法不能重写,成员变量不存在重写。
抽象类
首先先了解以下抽象方法,在Java中有一种方法没有方法体(没有具体的实现),主要用来定义功能,定义规范,且用abstract关键字修饰的方法就是抽象方法。
public abstract void eat();
而一个类中有不完整的,没有实现的抽象方法,那么这个类也就必须是一个抽象类,用abstract修饰。
抽象类除了不能创建对象外,类的其他功能都有;抽象类一般作为基类,被其它类继承,然后让子类去重写它里面所有的抽象方法去实现功能,否则也要将其定义为抽象类。
面向对象的特征--多态
概念
多态:同一种事物,在不同时刻表现出不同状态
存在条件:1.要有继承(包括接口的实现,前提条件),2.要有重写(前提条件),3.父类引用指向子类对象;
Animal d = nwe Dog();//向上转型,子类转为父类类型,这样父类类型就可以表示任意子类类型
注:由于有了继承关系,才可以用父类类型指向子类对象
多态语法下使用父类类型进行访问时特点:
非静态方法:编译看左边,执行看右边;
静态成员方法:编译和运行都看左边;
成员变量:编译和运行都看左边。
优点:子类默认向上转为父类类型,提高程序扩展性;
缺点:上升为父类类型后,不能访问子类中的特有方法
解决方法:将父类类型向下转型为子类类型
Dog dog = (Dog)animal;//向下转型
注:向下转型需要注意判断类型是否是指定类型,否则会出现不能转换的问题;使用instanceof关键字判断animal运行时,所表示的对象类型是否为指定类型;
if(Animal instanceof Dog){
Dog dog = (Dog)animal;//向下转型
}
final关键字
修饰类:是不能被其他类继承的,Java中提供的许多类,都是被final修饰的;
修饰方法:不能被子类重写;
修饰局部变量(包括形参):一旦被赋值,值就不能改变;
修饰成员变量:
static final int n = 0;//在定义之初就将值给定,值就不能改变;直接在类能赋值,只用1份。
final int n;//在类中进行定义时,不进行赋值操作,必须在构造方法中进行初始化赋值操作,表示 // 在每个对象中都有一份常量。
//有参构造方法
public A(int count){
n = count;
}
接口
使用interface关键字来定义接口,用来定义功能,规则和规范,它是一种更彻底的抽象。所有接口与抽象类一样是不能创建对象的,不同的是接口也不能有成员变量,构造方法;成员方法是抽象的,默认的,静态的。
接口可以定义那些内容呢?
可以定义抽象方法,静态常量,默认方法(通过子类对象进行访问),静态方法(通过接口名访问);
public interface MyInterface {
//public static final int a = 10;
int a = 10; //静态常量
//public abstract void eat();
void eat();//抽象方法
/*
默认方法,通过子类对象进行方法
*/
public default void test1(){
System.out.println("default test1");
}
/*
静态方法, 通过接口名访问
*/
public static void test2(){
System.out.println("static test2");
}
}
接口与类之间:类实现(implement)接口,要么重写接口中所有的抽象方法,要么将此类声明为抽象类。
接口也接口之间:Java中的接口可以一次继承多个接口。
总结:
接口的特性
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
接口中方法可以是抽象的,静态的,默认的
接口中声明的属性默认为 public static final 的
接口不是被类继承了,而是要被类实现
接口不能创建对象
与继承关系类似,接口与实现类之间存在多态性(满足多态的三个条件)
Fly fly = new Bird();//与继承关系类似,接口与实现类之间存在多态性
一个接口能继承其它多个接口
当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须
声明为抽象的类