
java-继承之后
发布日期:2021-05-04 14:57:13
浏览次数:24
分类:精选文章
本文共 4970 字,大约阅读时间需要 16 分钟。
零.什么是继承
- 1.子类可以继承父类里面的东西,这样可以是多项相同数据简化
- 2.extends关键字
- 父类就跟普通的类定义的方法一样
- 子类在定义类时后面加一个 extends 父类名
- public class Techer extends Employee(){…}
- 定义了子类对象然后调用父类的方法和变量时,就跟普通的调用一样,对象名.方法()。
一.继承的一些规则
**1.子类可以访问父类,,父类不能访问子类****2.当父子的继承关系中有重名的** -直接通过子类对象访问成员变量 *对象定义的类是谁就优先在谁里面找,没有就向上找(就近原则) -间接通过成员方法访问成员变量 *方法调用的谁的,就优先用谁的变量,倘若子类方法没有这个变量,可以向上找。 -方法有重名的,对象是谁就优先用谁的方法,没有就可以向上找 并且只有子类可以向父类找,父类不能像子类找**3.区分子类方法中重名的3种变量** -System.out.println(nmu); //局部变量 -System.out.println(this.nmu); //本类变量 -System.out.println(super.nmu); //父类变量**4.方法的重写(覆盖)** -创建的是子类对象,则优先用子类方法 -@Override写在方法前面,可以用来检测是不是正确的方法重写 -子类方法的返回值必须【小于等于】父类方法的返回值 *提示:java.lang.Object类是所有公共类的最高级类(祖宗类) -子类的方法权限必须【大于等于】父类方法的修饰权限 *提示:public > protected >(default) > private 备注(default)不是关键字,而是什么都不写 -super关键字的三大用法 *在子类的成员方法中,访问父类的成员变量 *在子类的成员方法中,访问父类的成员方法 *在子类的构造方法中,访问父类的构造方法 -this关键字的三大用法 *在本类的成员方法中,访问本类的成员变量 *在本类的成员方法中,访问本类的另一个成员方法 *在本类的构造方法中,访问本类的另一个构造方法 -注意this(....)和super(...)调用必须是构造方法的第一个语句【不写会免费送一个super】 -super和this两种构造调用,不能同时使用[并且构造方法不用‘.’]**5.继承中构造方法的访问特点** -子类必须调用一个父类的构造方法 *子类构造方法如果什么都没有写,自动赠送一个“super.()”调用,使用是先执行父类构造 *如果父类只有有参构造,那么在子类构造要手写super.(xxx); -super必须只能是第一行,所以只能由一个super在子类构造的第一行**6.继承的特点** -java语言的继承的单继承的,一个类只能继承一个父类 -java语言可以多级继承,父类可以有父类 -java语言中一个父类可以有很多子类
二.抽象
**1.抽象方法和抽象类的定义** -一个类里面有抽象方法就一定是抽象类 -抽象类里面也可以定义普通的成员方法 -抽象方法 *在类型的前面加上“abstract”关键字,然后在小括号后面直接加分号; public abstract void eat (); -抽象类 *在class前面加上“abstract”关键字, public abstract class Animal(){...}**2.抽象类的使用** -不能直接定义抽象类的对象 -必须用一个子类来继承抽象父类 -子类必须覆盖重写父类方法当中的抽象方法。 覆盖重写:子类可以去掉抽象方法中的abstract关键字,然后补上方法体和{}; -创建子类对象可以自接使用 **3.注意事项** -抽象类不能创建对象,只能创建非抽象类的子类对象 -抽象类中可以有构造方法,为子类提供初始数据的 -抽象类中不一定有抽象方法,但抽象方法一定在抽象类中 -抽象类的继承子类,如果没有重写所有的抽象方法,那么这个子类也是抽象类,但是已重写的方法就不是抽象方法了,
三.接口
**1.定义接口的格式** -在创建的时候勾选interface -public interface 接口名称{接口类容} -换成了interface之后.编译生成的字节码文件仍然是:.java-->.clsaa**2.接口的抽象方法定义** -public abstract 返回值类型 方法名称(参数列表) -接口当中的抽象方法,修饰符必须是两个固定的关键:public abstract -但是这两个字可以省略(刚学建议不省略)**3.接口抽象方法使用** -接口不能直接使用(new),必须有一个“实现类”来“实现”接口 *实现格式 public class 实现类名称 implements 接口名称{} -接口的实现类必须覆盖重写(实现)接口当中的所有抽象方法**4.接口中的默认方法default** -接口类里面也可以拥有默认方法,默认方法也可以被“继承”,相当于一个普通方法【反正不用去重写它】 -public default 类型 方法名(){方法体}**5.接口中的静态方法static** -就是将abstract或者default换成static【带上方法体】 -public static 类型 方法名(){方法体} -注意事项 *错误:不能通过接口的实现类对象去访问接口的静态方法 *正确:直接通过接口名调用其中的静态方法 *格式:接口名称.静态方法(变量) [可以不用new对象]**6.接口中的私有方法** -抽取一个共有的代码去解决两个默认方法之间重复代码的问题 -但是这个共有方法不应该让实现类使用,是私有化的 -普通私有方法 【多个默认方法之间的重复】 *private 返回值类型 方法名称(参数列表){ 方法体 } -静态私有方法 【多个静态方法之间的重复代码】 *private static 返回值类型 方法名称(参数列表){ 方法体 }**7.接口常量定义使用** -格式:public static final 数据类型 常量名称 = 数据值 *备注:一旦用final关键字进行修饰,说明不可改变。 -接口中的常量可以省略public static final,但是效果依然还是在(默认自动有) -接口中的常量”必须“进行赋值 -接口中的常量名称,使用完全大写的字母,用下划线分割(推荐) -使用它,直接接口名称.常量名称**8.接口和继承的注意** (1).接口是没有静态代码块或者构造方法 (2).一个类的直接父类是唯一的,但是接口可以有很多个 -格式:public class MyInterfaceImpl implments MyInterfaceA,MyInterfaceB{ 覆盖重写所有的抽象方法 } (3).如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。 (4).如果实现类没有重写所有的抽象方法,那么这个实现类也是一个抽象类 (5).如果实现类的多个接口当中,存在重复默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写 (6).一个类如果父类和接口方法重名,优先父类【继承>接口】**9.接口的多继承** -格式:public MyInterface extends MyInterfaceA,MyInterfaceB{} -类于接口 *类与类之间是单继承的,直接父类只有一个 *类与接口之间是多实现的,一个类可以实现多个接口 *接口与接口之间是多继承的。 -注意事项 *多个夫接口当中的抽象方法重复,没关系 *多个夫接口当中的默认方法重复,必须重新,带default
四.多态
**1.英文名:polymorphism** *也可以称呼为:Multi**2.格式:父类引用指向子类对象** (1).父类名称 对象名 = new 子类名称(); (2).接口名称 对象名 = new 实现类名称();**3.成员变量的访问** -直接通过对象名称访问成员变量:看等号【左边】是谁,就用谁,没有就向上找 -间接通过成员方法访问成员变量:看该方法属于谁,就用谁,没有就向上找 *自创小技巧:变量优先看左边,方法优先看右边【等号】 *【方法这里必须是父类有这一个方法才能运行,倘若只有子类有这不行】【编译看左】**4.成员方法的访问** -new是谁,就优先用谁 -编译看左边 *要编译运行通过,就要看是否符合左边的类 *比如fu类没有,zi类有的方法,是不通过的 -对比: 【编译都要看左边】 变量:编译看左,运行看左 变量:编译看左,运行看右**5.向上转型【创建猫,当做动物】** -格式:父类名称 对象名 = new 子类名称(); -含义:右侧创建一个子类对象,把它当做父类来看待使用 -注意:向上转型一定是安全的,从小范围转向了大范围 *类似于double num=100 //正确 int-->double,自动类型转换 -缺点:一旦转型为父类,子类的特有方法就无法调用【可以向下转型】**6.向下转型【本来是猫,当做动物,还原成猫】** -格式:子类名称 对象名=(子类名称) 父类对象 -含义:将父类对象,【还原】成本来的子类对象 -注意:a.必须保证对象本来创建的时候,就是猫,才能转型成猫 b.如果创建的是猫,但非要转型为其他,就会报错【ClassCastException】 *类似于:int num = (int)10.0//ok int num=(int)10.5//精度损失**7.instanceof** -格式:对象 instanceof 类名称 *这样会得到一个boolean值的结果,可以用来判断 -例如: if(animal instanceof Dog){ Dog dog = (Dog) animal; dog.watchHouse(); } if(animal instanceof Cat){ Cat cat = (Cat) animal; Cat.catchMouse(); }**8.参数传递的向上转型** -如果形参的"大",传递的"小",那么可以自动转型为大的 *例如method(double num); method(10.0) // 可以double-->double method(10 ) //可以int-->double *父类子类的多态继承也可以 method(USB usb); method(mouse); method(keyboard);
伍.final
**1.可以用来修饰一个类** -格式:public final class 类名称{...} -含义:这个类不能有子类(太监类) -注意:其中的所有方法不能被重写(无子类),但是可以重写父类**2.可以用来修饰一个方法** -格式:修饰符 final 返回类型 方法名(){...} -含义:这个方法不能被重写【这个方法是最终方法】 -注意:对于方法来说,abstact,final,不能同时存在【abstact一定要被重写,final一定不能重写】**3.还可以用来修饰一个局部变量** -格式:final 类型 名称=值(可以后面再赋值),或者在定义final变量后,后面再赋值一次 -含义:一旦使用了final,这个变量就不能被改变【相同的值也不行】 -注意:对于基本类型来说,不可变的是数值 对于引用类型来说,不可变的是地址【但是对象里面的值(例如set)还是可以进行改变的】**4.还可以用来修饰一个成员变量** -格式:修饰符 final 类型 名称 = 值 -含义:由于成员变量有默认值,使用用了final后必须手动赋值 -注意:要么在定义的时候直接赋值 要莫在构造方法里面赋值
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月05日 19时59分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(1.16-1.22)
2019-03-06
上周热点回顾(1.23-1.29)
2019-03-06
上周热点回顾(3.20-3.26)
2019-03-06
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(5.1-5.7)
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06
上周热点回顾(2.19-2.25)
2019-03-06
云计算之路-阿里云上:博客web服务器轮番CPU 100%
2019-03-06
云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
2019-03-06
上周热点回顾(3.26-4.1)
2019-03-06
上周热点回顾(6.25-7.1)
2019-03-06
【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
2019-03-06
工作半年的思考
2019-03-06
不可思议的纯 CSS 滚动进度条效果
2019-03-06
【CSS进阶】伪元素的妙用--单标签之美
2019-03-06
惊闻NBC在奥运后放弃使用Silverlight
2019-03-06
IE下尚未实现错误的原因
2019-03-06