Java基础/新手入门之面向对象OPP(Part03)
关联关系
概念:对象与对象之间的连接.一个类做为另一个类的属性类型存在.(has)
关联关系分为单向关联和双向关联.
单向关联:A类关联B类
public Mobile mobile;//(一对一)
public Mobile[] mobiles;// 使用数组 一对多
**双向关联:**A类关联B类,B类关联A类
public class Phone {
private Person person;
}
public class Person {
private Phone phone;
}
依赖关系
依赖关系(use):指一个类A使用到了另一个类B.但是类B的变化会影响到类A.
public void eattwice(Dog dog){
dog.eat(); //依赖关系表现为类B作为参数被类A在某个method
}
抽象类(abstract)
抽象类(: 如果一个类中没有包含足够的信息来描绘一个具体的对象.它只有声明,而没有具体的实现.
特点:
1)抽象类不能被实例化,但可以有构造函数,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象.
2)抽象类只能用作基类.表示的是一种继承关系.继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数,返回值要和抽象类中的方法一样.否则,该类也必须声明为抽象类.
public abstract class Animal {
public abstract void eat();
public void play(){
System.out.println("出去玩");
}
}
接口(interface)
接口可以理解为abstract.用接口去实现多继承的关系
接口的特性:
1)接口不可以被实例化;
2)实现类必须重写接口的所有方法;
3)实现类可以实现多个接口;
4)接口中的变量都是静态常量.
格式:
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n] {
声明常量;
抽象方法;
}
package day13;
//interface 关键字修饰接口
/*
接口与接口的关系:
接口继承接口 一个接口可以继承多个接口
*/
public interface Animal extends InterfaceA,InterfaceB {
/*
接口:
理解为一个纯粹的抽象类, 在接口中定义抽象方法
*/
/*
接口定义的成员变量是一个常量,默认被 public static final 修饰
*/
// public static final int num = 10;
int num = 10;
/*
jdk8以后接口中声明的抽象方法默认被 public abstract 修饰
*/
public abstract void eat();
void sleep();
/*
jdk8以后加入静态方法,默认方法
*/
public static void play(){ }
//默认方法
public default void keep(){ }
}
Java中的多继承
-
实现类可以实现多个接口
-
接口中的变量都是静态常量
-
多个类可以实现同一个接口
-
一个类可以实现多个接口,但只能继承一个类
-
一个接口能继承其他多个接口
3.接口中是隐式抽象的,当使用一个接口时的时候,不必使用abstract关键字。
4.接口中每一个方法是隐式抽象的,默认为:public abstract
5.接口中声明的属性默认为: public static final
6.接口不是被类继承了,而是被类实现。
7.当类实现接口的时候,类要实现接口中所有的方法。否则,累必须声明为抽象的类。
8.接口与实现类之间存在多态性。接口不能实例化对象(无构造 方法),但可以声明对象的引用。(多态性)
多态
同一种事物,在不同时刻表现不同的状态。
多态存在的三个必要条件:
1)要有继承(包括接口的实现)(前提条件)
2)要有重写(前提条件)
3)父类引用指向子类对象
多态存在的三个必要条件:
- 要有继承关系;
- 要有方法重写;
- 父类引用指向子类对象。
/*
编译看左边,运行期间看右边
当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象。
*/
Animals dog= new Dog();// Animals的引用指向Dog的对象
Final
final关键字用于声明方法,属性,类
final关键字修饰的类,不能被继承
public class FinalDemo {
//final修饰的变量变成了常量(不能够改变了)
static final int a = 5;//直接赋值法.建议用static修饰,在内存中只有一份.
final int num;//间接赋值(在方法中赋值)
//在创建的每一个对象中都包含一个常量,必须在构造方法中赋值.
public FinalDemo(int i){
num = i;
}
//final 修饰的方法 不能被子类重写 @Override
public final void method(){
System.out.println("final修饰的方法");
}
}