面向对象(二)
类之间的关系
-
一个类作为另一类方法的参数,则称这两个类为依赖关系。(use-a)
-
一个类作为另一个类的属性,则称这两个类为组合关系。(has-a)
-
一个类的属性方法被另一个类全部继承,则称这两个类为父子关系(is-a)
继承/extends
格式:子类 extends 父类(基类、超类)
一. 访问修饰符在继承中
同包
子类可以直接访问父类中除了private修饰的,其他的属性或者方法
不同包
-
子类对象只能访问public修饰的方法
-
子类内部方法可以访问protected修饰的属性方法,但是不可以访问默认的属性方法
父类可以有多个子类,但父类不可访问子类元素的
子类只有一个父类,子类可以访问父类的元素
二.继承中的构造方法
-
子类创建时,默认调用父类的无参构造器
如果父类中没有无参数的构造器,那么会在子类类名处报错
解决办法
-
在父类中添加无参的构造方法
-
super/超:在继承中super指代父类与this相似都需要放在第一行
还可以通过super.xxx()调用父类的方法
-
三.转型
-
在继承关系中
-
应该有互相的引用
-
父类型转化为子类型,父中应该包括子的类型
//父类 Animal 子类Dog Dog d = new Dog(); Animal a = d; //以上为子、父之间的互相引用 、可以改变为 Animol a = new Dog(); Dog c = (Dog)a; //父类型转化为子类型,父中应该包括子的类型
在上述代码中,传递为引用传递,a、b、c同时指向同一个堆中的区域
Animol a = new Animol(); Dog d = (Dog)a;
上述代码错误!,编译时不报错,在运行时报错
四.Object
所有类的根父类
Object中的方法:
.toString()
System.out.println()默认调用该方法
.equals()
在object中的equals方法是比较地址是否相同
如果我们需要重写可以参照String中的equals方法
.hashCoad()
获取当前对象的哈希值
抽象类
关键字:abstract
格式:
public abstract class 类名{}
抽象类的作用:
-
被继承 2. 被实现 3. 实现多态
//A 抽象类 B实例化的子类 //通过多态的方法调用 A a = new B();
特征:
-
不可创建对象(实例化),只是为了继承,但是存在构造方法
-
abstract修饰的方法为抽象方法,以();作为结束。
public abstract void 方法名();
-
抽象方法一定在抽类中
-
抽象方法不可以用private修饰,也不可以使用static、final修饰
-
实现抽象方法,在右边会出现白色的三角。
-
接口
关键字:interface
特点:
-
内部所有的方法默认都是公开抽象方法(省略时也是public abstract),
-
Jdk 1.8之前,接口中只能有抽象方法
-
内部的所有变量都是静态常量/必须有初始值
接口继承接口 extends 一对多,通过“,”分割
类实现接口 implement 一对多,通过“,”分割