类之间的关系
继承
方法重写与重载
this & super
访问控制
Object
类之间关系
横向关系
依赖关系
关联关系
组合关系
聚合关系
纵向关系
继承关系
实现关系
依赖关系
某个对象在执行指定方法时需要其他类的对象参与完成
public class Cup { private int cno; //编号 private String color; //颜色 private double capacity;//容量 } class People { public void p(String msg){ System.out.println(msg); } public void drink(Cup c){ } }
继承
继承是面向对象语言的三大特征之一,通过继承关系可以实现方法和属性的复用,从而提高类的可扩展性,子类继承父类之后,可以不受限制的使用父类中的非私有(private)元素继承语法:
class A extends B{
}
public class Animal{ public void bark(){ System.out.println("emmmmmmm........"); } } public class Dog extends Animal{ public void eat(){ System.out.println("吃骨头"); } } public class Test{ public static void main(String[] args){ Dog d = new Dog(); d.eat(); //Dog对象除了可以调用自身的eat方法外还能调用父类的bark方法 d.bark(); } }
继承注意事项
java只能存在单继承,即:一个子类只能有一个直接父类
可以通过多重继承的方式实现多个父类方法复用
java中的类可以同时被多个子类继承
子类继承父类后可以使用父类中的方法和属性,但是构造器不允许继承
在构造子类对象时,先调用父类构造器
访问权限
public
protected
default(默认不写)
private
关于访问修饰符:
对外部类只能使用public或者默认的方式修饰,不予许使用private或者protected(内部类除外)
类,方法常用public修饰
属性常用private修饰
继承关系中方法常用protected,public修饰
多态实现策略-方法的重写(Override)与重载(Overload)
重写
在某些情况下父类中的方法不一定能够完全满足子类需求,此时,子类中可以通过对父类的方法覆盖从而完成另一种方法实现,这个操作就称之为方法重写(override)
public class Animal{ public void bark(){ System.out.println("emmmmm....."); } } public class Dog extends Animal{ //当父类方法不能完全满足子类需求时可以通过重写的方式对父类方法覆盖 public void bark(){ System.out.println("汪汪汪...."); } }
方法重写
方法的重写发生在存在继承关系的两个类中子类
子类在重写方法时方法名称必须保持与父类一致(包括大小写)
子类重写父类方法时返回值类型必须保持跟父类一致
子类重写父类方法时参数列表必须保持与父类方法参数列一致
子类重写父类方法时,方法的访问权限范围不能小于父类方法
重载
<待续>
Object类
所有的Java类都直接或者间接继承了Object,Object类中为子类提供了一些用于重写的方法(比如,toString、equals、hashcode等),以实现子类对象之间的操作
==和equals区别
==是一个比较运算符,在进行基本数据类型比较时,比较的是两个数据的值,在比较两个引用时,比较的是两个对象的内存地址;equals是Object类的一个方法,默认的实现使用的是==,可以在子类中通过对equals方法重写以达到自定义的比较目的;在比较基本类型数据是否相等时使用:==,在比较引用类型是否相等时需要重写equals方法,并用其实现比较(一般在重写equals方法时同时应该对hashcode方法重写,以保证两个对象的hash值一致)
this&super
this:
在java中每一个类都存在一个this对象,该this对象表示为当前类的一个实例,可以在类的内部通过this调用当前类自身的其他构造器,方法以及属性,this关键字只允许出现在普通方法(实例方法)和构造器中;
public class Dog{ private String name; //null public Dog(){ this("旺财"); System.out.println("子类构造器被调用"); } public Dog(String name) { this.name = name; System.out.println("调了没??"); } public void labianbian(){ System.out.println("拉便便"); } public void eat(){ System.out.println(this.name+"吃骨头"); this.labianbian(); } }
super:
super表示父类的实例,在子类中可以通过super关键字调用父类中的属性,构造器与方法
public class Father{ double money; public void makeMoney(){ System.out.println("makeMoney...."); double = 88888; } } public class Son extends Father{ private String name; public Son(String name){ //调用父类的无参构造器 super(); this.name = name; } public void sumMoney(){ //调用父类中的方法 super.makeMoney(); //调用父类中的属性 System.out.println("消费:"+super.money); } }