JAVAOOP之继承

关于继承:
设计模式和思想和C#如出一辙
我们现有一个Dog类和Penguin类,两个类中 name health love三个属性重复了
如果我们再加一个类 cat 这三个重复属性依然要再写一次
我们为了避免这种重复 我们将重复属性提起到父类pet中
两个子类分别取继承这个pet父类,就可以成功调用父类中的 属性和方法了
子类调用父类中的属性和方法 可以使用关键字 this ,super
super是最合适的,因为使用this调用出来的 不知道是它自己的还是父类的
但是使用super就一目了然,肯定是父类的
继承 要符合is a 的关系
不是说 任何两个类 只要属性重复我们就可以设计为继承
像我们案例说 dog penguin cat 都是电子宠物
关于继承 一句很接地气的话:
继承之后,你的就是我的,我的还是我的
你的就是我的:父类中的非private 修饰的属性和方法 子类都可以使用
但是,子类中 特有的属性和方法 父类是不能调用的

is a 的关系
继承之后,你的就是我的,我的还是我的

注意点:
当子类实例化的时候 会先调用父类的构造方法 再执行子类的子类的构造方法
why? 因为构造方法的作用是实例化一个对象的
那么真实的世界中也是 先有父类 再有儿子
程序 也是在模拟这种情况 想实例化一个子类 必须要先有一个父类

如果子类没有指定调用父类的有参构造方法 那么会默认调用父类的无参构造方法
反正以一句话 一定先调用父类的构造方法
区别:你指定了有参的 就调用你指定的这个有参的
你没指定有参的 就要调用父类中 无参的构造方法
那么我们在代码中需要注意点:
如果子类要写构造方法的话 父类中 不管是有参的还是没参的尽量都写出来 避免发生错误

关于继承:
父类中private修饰的属性或方法是不能继承的
父类中的属性 是使用默认修饰符(不写)在同一个包中是可以调用的,如果不是同一个包中 是不能调用的
为什么不写访问修饰符跨包就不行了呢?一旦跨包,有可能有两个相同的类名 系统哪里知道你是要继承哪一个呢?
而一个包里,那不用说了,一定是这个包里的类
子类是不是继承父类的构造方法的 子类可以使用或调用父类的构造方法 但是不能叫继承
why?继承之后你的就是我的 那么构造方法是干嘛的?是实例化第一个对象的 如果允许继承的话 意思是克隆或者复制一个父类对象吗?
而且 子类也没有必要去继承父类的构造方法

关于抽象:
父类自己实例化自己 Pet pet=new Pet();
这个代码我们一般不会这样去写,why?
会将父类设计为抽象类 abstract修饰的类
抽象类一个最主要的特征它不能实例化自己

抽象中 可以有抽象方法 也可以有普通方法
抽象方法必须出现在抽象类中 why?
抽象类中的普通方法 子类可以重写也可以不重写 不强制重写
但是抽象方法会强制重写
因为普通方法中有方法体 如果子类不重写它 直接调用它 它起码里边有东西
如果抽象方法呢?它连方法体都没得,如果不强制重写会导致可能会直接调用,那么,这个时候将没有任何意义
所以,抽象方法出现在抽象类中 合理
因为抽象类是不能实例化自己的 它要用必须要用子类去实例化 有子类就意味着 它里边的抽象放将必须被子类重写了

方法重载:同一个类中 方法名相同 参数不同 与返回值无关
方法重写:子类重写父类的方法 不同的类中 方法名一样 参数一样 返回值 一样或是其子类 访问权限不能严于父类

final
修饰的属性为常量 命名规则 全部大写 值不能再改变了,所以,它必须要有初始值
修饰的类 不能被其他类继承 最终版的类
修饰的方法 最终版的方法 不能被重写了
所以 final不能和abstract同时使用啊
why?两者的属性完全矛盾 一个是不能被继承 另外一个必须要被继承

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值