1、继承

1、1子类能够继承父类的哪些成员?

1、1、1 public 成员
1、1、2 protected 成员
1、1、3 同一个包中:缺省访问类型的成员
1、1、4 打死不能继承private成员,但是子类可以通过调用父类的set/get方法访问
1、1、5不能继承构造函数,只能通过super()调用,具体调用哪一个,还得结合传入的参数匹配。

1、2 继承的特点:

1、2、1 父变子类必须变
1、2、2 继承是一种强耦合关系
1、2、3 向上转型:父类的引用能够指向子类对象,但父类的引用只能够访问父类的成员,对于子类自身的成员就无能为力了。

1、3 继承关键子 :extends

1、4 代码实例:

父类:

package parent_child;public class P {//成员变量private int private1=10;protected int protected1=10;public int public1=10;int friendly1=10;//构造函数public P() {super();System.out.println("父类——无参——构造函数被调用");}public P(int public1, int friendly1) {super();this.public1 = public1;this.friendly1 = friendly1;System.out.println("父类——两个参数——构造函数被调用");}public P(int private1, int protected1, int public1, int friendly1) {super();this.private1 = private1;this.protected1 = protected1;this.public1 = public1;this.friendly1 = friendly1;System.out.println("父类——四个参数——构造函数被调用");}//成员方法:public  void public1() {System.out.println("父类——public——方法被调用");}protected void protected1() {System.out.println("父类——protected——方法被调用");}private void private1() {System.out.println("父类——private——方法被调用");}void friendly() {System.out.println("父类——friendly——方法被调用");}//setter and getterpublic int getPrivate1() {return private1;}public void setPrivate1(int private1) {this.private1 = private1;}
}

子类:

package parent_child;public class C extends P {private int private_child=100;public C() {super(23,45);//子类调用父类构造函数,通过传递的参数的个数自动的调用父类的构造方法}public C(int private_child) {super(12,13,14,15);//子类调用父类构造函数this.private_child = private_child;}public static void main(String[] args) {C child=new C();child.protected1();child.protected1();child.friendly();//针对父类的private测试:child.setPrivate1(1000);System.out.println(child.getPrivate1());System.out.println(child.friendly1);System.out.println(child.private_child);System.out.println(child.protected1);System.out.println(child.public1);}}

结果:

2、封装:

2、1 封装到底在干什么?
将属性私有化,通过提供公有的方法访问
2、1实例代码:
package worktest;public class WorkTest_ {private int age;private int sex;//0_男 1_女private String name;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

3、多态

3、1 多态到底是什么意思?

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

3、2 简单总结:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

3、3 实现条件:继承、重写、向上传递
3、4实现方法:
1、基于继承:
package parent_child;public class P {//成员变量private int private1=10;protected int protected1=10;public int public1=10;int friendly1=10;//构造函数public P() {super();System.out.println("父类——无参——构造函数被调用");}public P(int public1, int friendly1) {super();this.public1 = public1;this.friendly1 = friendly1;System.out.println("父类——两个参数——构造函数被调用");}public P(int private1, int protected1, int public1, int friendly1) {super();this.private1 = private1;this.protected1 = protected1;this.public1 = public1;this.friendly1 = friendly1;System.out.println("父类——四个参数——构造函数被调用");}//成员方法:public  void public1() {System.out.println("父类——public——方法被调用");}protected void protected1() {System.out.println("父类——protected——方法被调用");}private void private1() {System.out.println("父类——private——方法被调用");}void friendly() {System.out.println("父类——friendly——方法被调用");}//setter and getterpublic int getPrivate1() {return private1;}public void setPrivate1(int private1) {this.private1 = private1;}//测试多态public void PrintlnStr() {System.out.println("父类方法自己的方法被调用");}
}
package parent_child;public class C extends P {private int private_child=100;public C() {super(23,45);//子类调用父类构造函数,通过传递的参数的个数自动的调用父类的构造方法}public C(int private_child) {super(12,13,14,15);//子类调用父类构造函数this.private_child = private_child;}public void PrintlnStr() {System.out.println("子类方法自己的方法被调用");}public static void main(String[] args) {C child=new C();child.protected1();child.protected1();child.friendly();//针对父类的private测试:child.setPrivate1(1000);System.out.println(child.getPrivate1());System.out.println(child.friendly1);System.out.println(child.private_child);System.out.println(child.protected1);System.out.println(child.public1);//测试多态:P pc=new C();       pc.PrintlnStr();}}
2、基于接口:
3、5 经典实例(借用一个面试题):
package worktest;
class A {public String show(D obj) {return ("A and D");}public String show(A obj) {return ("A and A");} }class B extends A{public String show(B obj){return ("B and B");}public String show(A obj){return ("B and A");}
}class C extends B{}class D extends B{}public class Test1 {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println("1--" + a1.show(b));System.out.println("2--" + a1.show(c));System.out.println("3--" + a1.show(d));System.out.println("4--" + a2.show(b));System.out.println("5--" + a2.show(c));System.out.println("6--" + a2.show(d));System.out.println("7--" + b.show(b));System.out.println("8--" + b.show(c));System.out.println("9--" + b.show(d));      }
}

结果:

其实在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

java 继承 封装 多态 详解相关推荐

  1. Java面向对象之修饰符、封装、继承、多态详解

    类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对象是类的具体实例.类是抽象的,不占 ...

  2. 继承和多态详解【java】

    目录 前言 二.继承详解 2.1 继承的概念 2.2 继承的使用 2.3 子类构造方法 2.4 父类子类中的代码块 2.5 protected关键字详解 2.6 继承的方式 2.7 final关键字详 ...

  3. 初学者python笔记(类的继承与多态---详解)

    文章目录 一.类的组合与继承的区别 二.类的继承 1.继承的功能分析 2.类的继承之派生.接口继承 3.用接口模块abc来实现接口继承 4.使用接口继承的好处 5.类的继承顺序 6.在子类中调用父类的 ...

  4. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解

    本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...

  5. Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解

    今天内容比较多,直接步入正题吧. 类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对 ...

  6. Python学习之封装、继承、多态详解

    面向对象的三大特征 封装 确保对象中的数据安全 继承 保证了对象的可扩展性 多态 保证了程序的灵活性 封装 封装是面向对象的三大特性之一 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 如何 ...

  7. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  8. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  9. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

最新文章

  1. win10下安装tensorflow-gpu==1.11.0的详细教程
  2. Java程序员面试时要注意的一些问题
  3. TensorFlow MNIST CNN LeNet5模型
  4. 终于收到为广州.NET俱乐部活动准备的礼品了:)
  5. Vue项目开发过程中解决跨域问题(vue.config.js结合axios)
  6. 椭圆形中间一个大写的v_静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊_冠桥橡胶...
  7. libfaac个个参数说明
  8. java.lang.NoClassDefFoundError: com.mobclick.android.MobclickAgent
  9. MVC中使用Tuple完成匿名类数据存储
  10. 流水线效率计算公式_线束加工的生产效率、爬坡计划与产能提升浅读
  11. Python自学电子书大全
  12. chrome浏览器 json插件【WEB前端助手】
  13. .tar.bz2文件怎么解压
  14. LAN9252采用外部阻容复位的时候,RESET引脚一直为低的原因以及对应解决办法。
  15. 老说程序员如何看产品经理,今天说说产品经理讨厌哪些程序员
  16. c语言 出现的#if 0 表示什么?
  17. 2016华为软件精英挑战赛:赛题及其答疑汇总
  18. GIS是什么?『总览篇』
  19. mac将远程linux服务器目录挂载(mount)到本地
  20. 怎么排除maven依赖

热门文章

  1. 红皮书--With语句及布尔型
  2. vue如何保存登录状态到全局?【vue状态管理】
  3. Java基础难点补充
  4. Python:for的多种写法
  5. java中String.split()的注意事项
  6. 使用火狐浏览器的原因是什么?使用英文版火狐的原因又是什么?
  7. 换一种态度看程序员(转)
  8. 性能测试工具AlldayTest 的测试方法及说明
  9. 常用正则表达式 潇湘博客
  10. 矩池云上TensorBoard/TensorBoardX配置说明