赞
踩
类与类的关系有以下几种:
A is-a B 继承、实现===>统称泛化
A has-a B 组合、聚合、关联===>统称包含
A use-a B 依赖(need)
继承:
子类、父类
1.子类继承父类,通过关键字“extends”;
2.子类的对象可以调用父类的(public、protected)属性和方法,当作自己的去使用,增强了复用性;构造方法不算是继承过来的,只是在子类调用构造方法时默认调用父类的构造方法;代码块也是同理,默认在子类调用构造方法的时候调用父类的构造方法,而在调用父类构造方法前会先自动运行父类中的代码块;以上两种子类是调用不到的;
3.子类可以添加自己独有的方法和属性;
4.子类从父类继承来的方法不能满足子类的要求,可以在子类中重写(覆盖)父类的方法--->方法重写 override,重写主要是内容,结构一般相同;
5.每一个类都有继承类,如果不写extens关键字,那么就继承Object类,如果写了extends关键字,那么就继承后者;如果子类继承了父类,而父类继承了Object,那么子类也是Object的子类,即继承是可以传递的,所以Object类是任何引用类型的父类,Object类是没有父类的。
6.Java中继承是单个存在的(单继承),每一个类只能有一个继承类,即extends关键字后面只能写一个类;目的是为了让类更安全;但是可以通过传递的方式实现都继承的效果,后续还会有多实现;
7.继承在内存中的储存形式:
8.this:代替的是当前执行方法/属性时的那个对象,不一定是当前类(也有可能是他的子类);如果子类里进行了方法重写,又在父类里用this.调用了这个方法,那么如果执行的时候用的是子类里的对象去执行这个父类里的this.,那么这个this表示的是子类中的对象,那么执行的也就是子类中重写的那个方法;
super:那如果就是要调用父类里的原方法呢?super代替的是执行方法/属性时的那个对象所属类的父类中的对象;也就是指向储存形式里面的父类对象;空间那么super就没法写在父类里面了,只能写在子类里面;
super和this都可以调用一般属性和方法,
都可以放置在类成员的任意位置,
可以调用构造方法(写在构造方法的首行),构造方法不可以来回调用===>第一行都被占了,父类的构造方法没有位置写了(这是一行隐藏的方法),那么就没法调用父类的构造方法了;
调用一般方法的时候可以来回调用(写法 编译好用)执行可能有问题;
//父类中使用了 this.eat
- //Animal是这里的父类
-
- public class Animal {
-
- public String name;
-
- public void eat(){
-
- System.out.println("这是动物的吃饭方法");
- }
-
- public void sleep(){
-
- //这里用了this.eat
-
- this.eat();
-
- System.out.println("这是动物的睡觉方法");
- }
- }
//又在子类里重写了eat方法
- public class Person extends Animal {
-
- //这是子类里的一个方法重写
-
- public void eat(){
-
- System.out.println("这是人类升级版的吃饭方法");
- }
-
- }
//那么此时在主方法里new一个子类Person类的对象,并执行父类里的sleep方法
运行结果如下:
可见,原来父类里的this已经变成了执行时对象(子类里的对象),也就运行了子类里的重写的eat方法;
9.在创建子类对象之前会自动创建一个父类的对象,相当于隐藏了一行代码;
super();==>调用父类的构造方法;
=========================================================================
补充:Object类中的方法:
1.hashcode():将对象在内存中的地址经过计算得到一个int整数;
源码:
public native int hashCode();
2.to String():在打印输出时,将对象变成String字符串;
- public String toString(){
- //源码中这两个this.是被省略的;
- return this.getClass().getName()+"@"+Integer.toHexString(this.hashCode);
- }
3.get Class():获取对象对应类的类映射(反射);
4.equals():用来比较两个对象的内容,Object的默认效果是==;
== :可以比较基本数据类型(值),也可以比较引用类型(比较地址);
equals方法是Object类中继承过来的方法,默认效果是比较地址;如果需要改变规则,可以进行方法重写;
源码:
- public boolean equals(Obj obj){
- return (this == obj);
- }
5.wait():让线程进入挂起等待状态,存在重载(无参数,一个参数,两个参数);
6.notify():线程唤醒;
7.notifyAll():全部线程唤醒;
8.finalize():权限修饰符是protected,在对象被GC回收时,默认调用执行的方法;
构造函数(创建对象)---析构函数(回收对象);
9.clone():权限修饰符是protected,为了克隆对象;
=========================================================================
方法重写和方法重载的区别:
//方法的结构:
1.权限修饰符 :
(public>projected>默认不写>private)
方法重写:子类可以大于等于父类;
方法重载:没有要求;
2.特征修饰符 :
(abstract,final,static)
方法重写:如果父类方法是final,子类不能重写;如果父类方法是static,子类不存在重写; 如果父类方法是abstract,子类如果是具体的必须重写,否则就是抽象类,可以不重写;
方法重载:没有要求;
3.返回值类型 :
方法重写:子类的返回值可以小于等于父类;
方法重载:没有要求;
4.方法名:
方法重写:子类与父类一致;
方法重载:一个类中的好多方法名一致;
5.参数值列表:
方法重写:子类与父类一致
方法重载:每一个方法的参数必须不一致
6.抛出异常:
方法重写:如果父类方法抛出运行时异常,子类可以不予理会;如果父类方法抛出编译时异常,子类抛出异常的个数少于等于父类;子类抛出异常的类型小于等于父类;
方法重载:没有要求;
7.方法体:
方法重写:子类的方法内容和父类不一致;
方法重载:每一个重载的方法执行过程一般不一致;
=========================================================================
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。