继承

来源:互联网 发布:js offsettop 不准确 编辑:程序博客网 时间:2024/06/05 16:22

1、继承的概念:
继承允许通过继承已经存在的类,来编写新类;is a 关系、 extends关键字(单继承)、 Object类、 方法重写、 super关键字、 继承如何影响构造器;

画图法:子类指向父

2、错误的设计
1、无法正确分辨员工到底是哪种类型,导致小时工也可以具有年薪 工人的属性和行为---不合理
2、员工的具体子类型,及该类型能够调用哪些属性和行为,全靠调用者进行控制,增加代码量---不合理;
正确设计:抽取共性为父类, 子类继承父类并设定自己特性;

3、equals( ):
1、==在引用类型中,对变量用进行比较,比较的不是对象里面的内容是否相等;
而是比较这两个对象变量是否指向了同一对象;
e1 == e2 false;
2、使用equal必须对方法进行重写,告诉该方法应该比较哪些数据类型及那几个
e1.equal( e2 ) false ;
3、在String 中对equals() 方法进行了重写; 在JAVA. lang中的String中的方法中查看源代码; 重写equals( )方法所有员工都需要重写,则写在父类中;

equal: equal ALT+/ 快捷调用
@Override
public boolean equals(Object obj) {
GuessNumber ae = (GuessNumber) obj ; //将形参强转为父类的数据类型
if(this.bui.equals(ae.getBui)){ //对比,this点引用类型成员变量 对比 成员变量访问值
return true; //返回正确;
}else{
return false;
}
}

4、toString()方法,返回一个对象的字符串 描述;
十六进制:引用和内存地址存储为16进制数;直接打印一个类名的时候打印出来的就是这个地址
使用地址值: String str = snoopy.toString( ); 打印,str为打印地址;
重写toString方法: 当对对象直接进行字符串操作时,比如直接打印对象,或是做字符串拼接;
默认书写的所有方法都会被子类自动具备:
String sug = “创建了一直” + coofmao
syso 打印出:创建了一直加菲猫,年龄18岁,==> 自动在coofmao中调用toString方法;
写在父类:
@Override
public String toString() {
// TODO Auto-generated method stub
return "这是一个叫"+this.getName()+"他的年龄是"+this.getAge();
}

protectde void finalize() throws Throwable; 对象被垃圾回收时调用,对象被移除前,释放对象所占用的资源和执行必须的清理工作;
区分:final(方法不能被重写、 类不能被继承--终态类、 变量变常量) 报错:subclass(向下的类)、superclass(向上的类);
//final 与 static是可选修饰符; 访问修饰与final可以互换位置;
finally -->这两个是关键字;不能做方法名;


5、方法重写与重载
方法重写,子类把来自父类的方法重新实现一次;方法重载用于在类中定义相同方法名,但不同形参列表;在构造器中使用广泛,构造器是用来构造类的方法,可以快速实例化类;
【案例】:员工计算工资方法;都有计算工资的方法,但是又都有不同;//每个员工都有这个行为,所以需要写在父类中,为了个性化则进行方法重写;
【适用情况】:在每个子类都有单又有自己的实现方式的时候,使用;
重写规则
1、方法名必须一致; 参数列表必须一致; 返回类型一致;
2、访问修饰符不能比父类更严格;
3、子类对父类继承的方法进行重写( 是一个子类,父类存在这个方法 )
4、子类不能抛出比父类更多的异常;

6、快速生成继承的方式;在建类的时候, 在superClass中进行修改;改为父类的名称;

7、细节
1、默认继承Object类,Object是类和数组的根类; 9个方法;目前学习了equals、toSring、finalize
2、方法重写:
区分:思想面
重载: 打架,传入刀用来捅; 传入棒子来,用来抡;
重写: 打架在人; 男人继承后用拳头、女人用手抓;
代码面:形参区别 、 方法体与访问修饰符区别;
3、final(终极):类、 变量、 方法;
4、内存实现:内存叠加的方式
构造方法不能被继承,也不能被重写:原因:构造方法规则:与类名相同,没有返回值; 继承之后将能产生一个实例化父类的能力【完全不符合逻辑】;
实例化过程描述:1、new 运算调用子类构造器/2、子类用this调用子类构造器/3、但是在这个之前会默认有语句super()调用父类的构造器/4、父类继续调用父类/5、直到调用到Object类/6、然后构造器内语句一次从上往下依次执行,首先执行的最后完成;
细节:1、只产生了一个实例化对象(父类部分和子类部分构成);
2、父类对象的构造器虽然没有被继承,但是参与了子类的实例化生成过程;
3、对比super 和 this: this. > super.
super( 形参 ):1、调用父类的指定参数的构造方法; 只能放在第一句;
2、与this()不能同时出现在一个构造器中;
3、父类无参构造方法必写,会导致子类找不到父类的构造方法;
4、super() 有默认,就算不写也有其调用父类的无参构造;
super. :当前对象的父类部分的方法/属性; 【访问不到子类本类定义的属性和方法】 【使用情况】:更愿意使用this .; 仅在父类中的方法被重写,而试图调用父类方式的时候使用super. ;

this(形参):调用本类的其它构造方法;只能放在构造方法第一句;this(1);
this. 属性/方法: 我的属性/方法【当前对象的属性/方法】; 看得见父类的方法但是看不到父类的private/default类属性方法;

0 0
原创粉丝点击