关于Java中的对象、类、抽象类、接口、继承之间的联系:

导读:

寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系。

正文:

举个例子:如果现在要想定义一个动物,那么动物肯定是一个公共的标准,而这个公共标准就可以通过接口来完成。

在动物中又分为两类:哺乳动物、卵生动物,而这个标准属于对动物的标准进一步细化,应该称为子标准,所以此种关系可以使用接口的继承来表示。

而不如动物i可以继续划分为人、狗、猫等不同的类型,由于这些类型不表示具体的事物标准,所以可以使用抽象类进行表示。

如果要表示处工人或者学生这样的概念,则肯定是一个具体的定义,则使用类的方式。

然后每个学生或者每个工人都是具体的,那么就通过对象来表示;

由下面的图可知,所有的设计中,接口应该是最先被设计出来的,被子类所继承。

代码实例化:

  1. package Java从入门到项目实战.抽象类与接口;
  2. //动物
  3. interface animal{
  4. public abstract String breathe();
  5. }
  6. //哺乳动物---接口继承extend
  7. //类实现的话--implements
  8. interface mammals extends animal {
  9. // 全局方法
  10. // 抽象方法
  11. }
  12. //卵生动物
  13. interface Egg_laying_animals extends animal {
  14. // 全局方法
  15. // 抽象方法
  16. }
  17. //定义人类抽象类(属于哺乳动物)
  18. abstract class peopel implements mammals{
  19. }
  20. //定义非人类抽象类(输入哺乳动物)
  21. abstract class small_animal implements mammals{
  22. }
  23. //学生 属于人类中
  24. class student extends peopel{
  25. @Override
  26. public String breathe() {
  27. return null;
  28. }
  29. }
  30. public class 接口综合 {
  31. public static void main(String[] args) {
  32. // 对象:类的实例化
  33. student std = new student();
  34. System.out.println(std.breathe());
  35. }
  36. }

接口:

  1. 接口的基本定义:

    1. package Java从入门到项目实战.抽象类与接口;
    2. interface IMessageF{
    3. //在接口可以定义全局变量、抽象方法(public权限)、default方法以及static方法;
    4. //如果接口中有抽象方法,那么接口必须需要子类进行实例化
    5. public static final String INFO = "xbhog"; //全局变量
    6. public abstract String getInfo(); //抽象方法
    7. }
    8. class MessageIpml implements IMessageF{
    9. @Override
    10. public String getInfo(){ //方法覆写
    11. return "hello xbhog!"; //获取消息
    12. }
    13. }
    14. public class 接口的基本使用 {
    15. public static void main(String[] args) {
    16. //接口的调用 实例化
    17. IMessageF msg = new MessageIpml(); //子类实例化父类接口
    18. System.out.println(msg.getInfo());
    19. }
    20. }
  2. 子类实现多个父接口与实例转换

    1. package Java从入门到项目实战.抽象类与接口;
    2. interface Imessage1{
    3. public static final String INFO = "xbhog";
    4. public abstract String getInfo();
    5. }
    6. interface IChannel{
    7. public abstract boolean connect();
    8. }
    9. //实现多个接口,继承了两个,所以在子类中需要进行覆写父类中的抽象方法
    10. class MessageImpl1 implements Imessage1,IChannel{
    11. @Override
    12. public String getInfo(){
    13. if(this.connect()){
    14. return "博客地址:www.cnblogs.com/xbhog/";
    15. }
    16. return "【默认消息】"+ Imessage1.INFO;
    17. }
    18. @Override
    19. public boolean connect(){
    20. return true;
    21. }
    22. }
    23. public class 子类实现多个父接口 {
    24. public static void main(String[] args) {
    25. Imessage1 msg = new MessageImpl1();
    26. System.out.println(msg.getInfo());
    27. //--------观察接口实例转换-------------
    28. Imessage1 msg1 = new MessageImpl1();
    29. Object obj = msg1; //向上转型
    30. IChannel channel = (IChannel) obj; //对象强制转换成IChannel接口实例
    31. System.out.println(channel.connect());
    32. }
    33. }
  3. 子类继承抽象类同时实现接口

    1. package Java从入门到项目实战.抽象类与接口;
    2. //消息接口
    3. interface IMessage1{
    4. public static final String INFO = "xbhog";
    5. public abstract String getInfo();
    6. }
    7. //通道接口
    8. interface IChannel1{
    9. public abstract boolean connect();
    10. }
    11. //定义一个抽象类
    12. abstract class DatabaseAbstract{
    13. public abstract boolean getDatabaseConnection();
    14. }
    15. //继承于抽象类,同时实现接口
    16. class MessageImpl2 extends DatabaseAbstract implements IMessage1,IChannel1{
    17. @Override
    18. public String getInfo() {
    19. if (this.connect()){
    20. if(this.getDatabaseConnection()){
    21. return "【数据库消息】博客地址:https://www.cnblogs.com/xbhog/";
    22. }else {
    23. return "数据库消息无法访问!";
    24. }
    25. }
    26. return "【默认消息】:"+IMessage1.INFO;
    27. }
    28. @Override
    29. public boolean connect() {
    30. return true;
    31. }
    32. @Override
    33. public boolean getDatabaseConnection() {
    34. return true;
    35. }
    36. }
    37. public class 子类继承抽象类并实现接口 {
    38. public static void main(String[] args) {
    39. IMessage1 msg = new MessageImpl2();
    40. System.out.println(msg.getInfo());
    41. }
    42. }
  4. extends继承多个父接口

    关于接口的简化:在定义接口时,对于全局常量和抽象方法可以省略static final与 abstract关键字;

    1. package Java从入门到项目实战.抽象类与接口;
    2. interface Imessage3{
    3. public static final String INFO = "xbhog";
    4. public abstract String getInfo();
    5. }
    6. interface IChannel3{
    7. public boolean connect(); //抽象方法,省略了abstract;
    8. }
    9. interface IService extends Imessage3,IChannel3{
    10. public String service(); //抽象方法,省略了abstract;
    11. }
    12. class MessageService implements IService{
    13. @Override
    14. public String getInfo() {
    15. return Imessage3.INFO;
    16. }
    17. @Override
    18. public boolean connect() {
    19. return false;
    20. }
    21. @Override
    22. public String service() {
    23. return "【数据库消息服务】:https://www.cnblogs.com/xbhog/";
    24. }
    25. }
    26. public class 使用extends继承多个父接口 {
    27. public static void main(String[] args) {
    28. }
    29. }
  5. 接口的加强

    为什么需要加强接口:首先需要明白,在接口下的子类需要覆写父类的方法,如果该接口下有1000多个子类,不巧的是接口需要增加方法,那么每个子类都要覆写一遍新添的方法,想想都很恐怖;在此基础上增加了弥补的方法

    1. 增加default定义普通方法:便于扩充接口同时简化设计结构

      1. package Java从入门到项目实战.抽象类与接口;
      2. interface IMessage{
      3. // 必须覆写
      4. public String message(); //抽象类
      5. public default String messageSmple(){
      6. return "null";
      7. };
      8. // 定义接口普通方法,增加了接口的灵活性
      9. // 当子类过多是,增加一个新的方法,那么需要每个子类都需要覆写一边
      10. // default的普通方法解决了该问题,当子类需要的时候覆写,不需要时放置
      11. public default boolean connect(){
      12. System.out.println("建立关注xbhog的通道....");
      13. return true;
      14. }
      15. }
      16. class MessageImpl implements IMessage{
      17. public String message(){
      18. return "xbhog";
      19. }
      20. }
      21. public class 接口定义加强使用default定义普通方法 {
      22. public static void main(String[] args) {
      23. IMessage msg = new MessageImpl();
      24. if(msg.connect()){
      25. System.out.println(msg.message());
      26. }
      27. }
      28. }
    2. default缺点:必须通过接口实例化对象才能调用,为了避免实例化对象的依赖,可以使用static方法,隐藏接口调用的细节

      1. package Java从入门到项目实战.抽象类与接口;
      2. interface ImessageS{
      3. public String message();
      4. // 定义公共方法,被所有子类继承
      5. public default boolean connect(){
      6. System.out.println("建立订阅xbhog博客的通道.....");
      7. return true;
      8. }
      9. // 建立static静态方法,可以通过接口名称直接调用
      10. public static ImessageS getInstance(){
      11. // 获得子类对象
      12. return new MessageImple();
      13. }
      14. }
      15. class MessageImple implements ImessageS{
      16. public String message(){
      17. if(this.connect()){
      18. return "www.cnblogs.com/xbhog";
      19. }
      20. return "null";
      21. }
      22. }
      23. public class 在接口中定义static方法 {
      24. public static void main(String[] args) {
      25. // 实例化子类接口对象
      26. ImessageS msg = ImessageS.getInstance();
      27. System.out.println(msg.message());
      28. }
      29. }

抽象类:

抽象类的特点:

  1. 含有抽象方法的类一定是抽象类

  2. 抽象类不一定还有抽象方法

  3. 抽象类中既可以有抽象方法也可以有非抽象放方法

  4. 如果子类继承了抽象方法,要么重写抽象类中的抽象方法,要么子类就声明为抽象类

  5. 不能创建对象,因为方法没有具体实现,创建对象没有作用,抽象类是用来继承的

  6. 基本定义

    1. abstract class Message{
    2. private String type;
    3. public abstract String getConnectInfo(); //抽象方法
    4. public void setType(String type){ //普通方法
    5. this.type = type;
    6. }
    7. }
  7. 抽象类的构造方法

    1. package Java从入门到项目实战.抽象类与接口;
    2. //构造抽象方法
    3. abstract class abMessage{
    4. private String type;
    5. //此时抽象类中没有提供无参构造方法,所以在子类必须明确调用单参构造方法
    6. public abMessage(String type){
    7. this.type = type;
    8. }
    9. public abstract String getContentInfo();
    10. public String getType() {
    11. return type;
    12. }
    13. public void setType(String type) {
    14. this.type = type;
    15. }
    16. }
    17. class Database extends abMessage{
    18. //子类构造
    19. public Database(String type) {
    20. //调用父类单参构造方法
    21. super(type);
    22. }
    23. //覆写抽象类方法
    24. @Override
    25. public String getContentInfo() {
    26. return "【"+super.getType()+"】数据库连接信息";
    27. }
    28. }
    29. public class 构造方法 {
    30. public static void main(String[] args) {
    31. abMessage demo = new Database("xbhog");
    32. System.out.println(demo.getContentInfo());
    33. }
    34. }
  8. 抽象类中定义static 方法:该类方法不受到抽象类实例化对象的限制

    1. package Java从入门到项目实战.抽象类与接口;
    2. abstract class message{
    3. public abstract String getInfo();
    4. public static message getInstance(){
    5. return new datamessage();
    6. }
    7. }
    8. class datamessage extends message{
    9. @Override
    10. public String getInfo() {
    11. return "xbhog数据库连接";
    12. }
    13. }
    14. public class 抽象类定义static {
    15. public static void main(String[] args) {
    16. //因为该方法被static修饰,全局使用message.getInstance相当于new datamessage();
    17. message mes = message.getInstance();
    18. System.out.println(mes.getInfo());
    19. }
    20. }
  9. 模板设计模式

    1. package Java从入门到项目实战.抽象类与接口;
    2. //抽象三个公共行为
    3. abstract class Action{
    4. static final int EAT = 1; //吃饭指令
    5. static final int SLEEP = 5; //睡觉指令
    6. static final int WORK = 10; //工作指令
    7. public abstract void eat();
    8. public abstract void sleep();
    9. public abstract void work();
    10. public void command(int code){
    11. switch (code){
    12. case EAT:{
    13. this.eat();
    14. break;
    15. }
    16. case SLEEP:{
    17. this.sleep();
    18. break;
    19. }
    20. case WORK:{
    21. this.work();
    22. break;
    23. }
    24. case EAT+SLEEP+WORK:{
    25. this.eat();
    26. this.sleep();
    27. this.work();
    28. break;
    29. }
    30. }
    31. }
    32. }
    33. //具象化 机器人
    34. class Rebot extends Action{
    35. @Override
    36. public void eat() {
    37. System.out.println("机器人需要接通电源充电");
    38. }
    39. @Override
    40. public void sleep() { } //机器人不需要睡觉
    41. @Override
    42. public void work() {
    43. System.out.println("机器人按照固定的设置进行工作");
    44. }
    45. }
    46. //具象化 人
    47. class Person extends Action{
    48. @Override
    49. public void eat() {
    50. System.out.println("人需要吃五谷杂粮来维持生命力");
    51. }
    52. @Override
    53. public void sleep() {
    54. System.out.println("不睡觉会死的");
    55. }
    56. @Override
    57. public void work() {
    58. System.out.println("每天工作996");
    59. }
    60. }
    61. //具象化 猪
    62. class pig extends Action{
    63. @Override
    64. public void eat() {
    65. System.out.println("使劲吃,养肥了卖钱");
    66. }
    67. @Override
    68. public void sleep() {
    69. System.out.println("不睡觉,养不肥");
    70. }
    71. @Override
    72. public void work() {
    73. }
    74. }
    75. public class 模板设计模式 {
    76. public static void main(String[] args) {
    77. Action rebotAction = new Rebot();
    78. Action personAction = new Person();
    79. Action pigAction = new pig();
    80. System.out.println("机器人行为---------");
    81. rebotAction.command(Action.SLEEP);
    82. rebotAction.command(Action.WORK);
    83. System.out.println("人类行为----------");
    84. personAction.command(Action.WORK+Action.SLEEP+Action.EAT);
    85. System.out.println("猪的行为-------");
    86. pigAction.command(Action.SLEEP);
    87. }
    88. }

综合案例练习:

实现相关代码:

  1. package Java从入门到项目实战.抽象类与接口;
  2. //定义人这个类
  3. abstract class people{
  4. private String name;
  5. private String age;
  6. public people() {}
  7. public people(String name,String age){
  8. this.name = name;
  9. this.age= age;
  10. }
  11. public abstract void eats(); //定义抽象方法
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public void setAge(String age) {
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public String getAge() {
  22. return age;
  23. }
  24. }
  25. //定义运动员抽象类
  26. abstract class athletes extends people{
  27. public athletes(){}
  28. public athletes(String name, String age){
  29. super(name,age);
  30. }
  31. // 抽象方法
  32. public abstract void study();
  33. }
  34. interface speakEnglish{
  35. public abstract void speak();
  36. }
  37. //定义教练的抽象类
  38. abstract class coach extends people{
  39. public coach(){}
  40. public coach(String name,String age){
  41. super(name,age);
  42. }
  43. public abstract void teach();
  44. }
  45. //篮球运动员
  46. class Basketball_player extends athletes{
  47. public Basketball_player(String name, String age){
  48. super(name,age);
  49. }
  50. @Override
  51. public void eats() {
  52. System.out.println("篮球运动员正在吃饭....");
  53. }
  54. @Override
  55. public void study() {
  56. System.out.println("篮球运动员正在学习......");
  57. }
  58. }
  59. //乒乓球远动员
  60. class pingpang extends athletes implements speakEnglish{
  61. public pingpang(String name, String age){
  62. super(name,age);
  63. }
  64. @Override
  65. public void eats() {
  66. System.out.println("乒乓球运动员正在吃饭....");
  67. }
  68. @Override
  69. public void study() {
  70. System.out.println("乒乓球运动员正在学习......");
  71. }
  72. @Override
  73. public void speak() {
  74. System.out.println("乒乓球运动员练习英语口语......");
  75. }
  76. }
  77. //乒乓球教练
  78. class pingpangCoach extends coach implements speakEnglish{
  79. public pingpangCoach(String name, String age){
  80. super(name,age);
  81. }
  82. @Override
  83. public void eats() {
  84. System.out.println("乒乓球教练正在吃饭.....");
  85. }
  86. @Override
  87. public void teach() {
  88. System.out.println("乒乓球教练正在授课....");
  89. }
  90. @Override
  91. public void speak() {
  92. System.out.println("乒乓球教练练习英语口语.....");
  93. }
  94. }
  95. //篮球教练
  96. class BasketballCoach extends coach{
  97. public BasketballCoach(String name, String age){
  98. super(name, age);
  99. }
  100. @Override
  101. public void eats() {
  102. System.out.println("篮球教练正在吃饭");
  103. }
  104. @Override
  105. public void teach() {
  106. System.out.println("篮球教练正在授课......");
  107. }
  108. }
  109. public class 综合案例实现 {
  110. public static void main(String[] args) {
  111. }
  112. }

结束:

整理最近学习Java的相关概念,理清思路。

如果有错误欢迎指正,感谢各位看到最后!

关于Java中的对象、类、抽象类、接口、继承之间的联系的更多相关文章

  1. Java中的实体类--Serializable接口、transient 关键字

    在java中,实体类是一个非常重要的概念,我们可以在实体类中封装对象.设置其属性和方法等.关于实体类,也经常涉及到适配器模式.装饰者模式等设计模式.那么在实际代码开发中,关于实体类的注意事项有哪些呢? ...

  2. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  3. java中的对象、类、包、模块、组件、容器、框架、架构的概念入门

    在Java中有那么一些概念:对象.类.包.模块.组件.容器.框架.这些概念都有一个共同的特点,就是[容纳]. 对象(Object) 在Java的世界里,对象是通过属性和方法来分别对应事务所具有的静态属 ...

  4. 在java中,List是个接口,那实现List接口的类有哪些,有什么区别?

    在java中,List是个接口,那实现List接口的类有哪些,有什么区别? 解答: ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引 ...

  5. 将java中Map对象转为有相同属性的类对象(json作为中间转换)

    java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...

  6. javaAPI中的常用 类 以及接口

    java.lang包中的常用类以及接口 类 1. Integer :Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 2. Math ...

  7. Java中的集合(三)继承Collection的Queue接口

    Java中的集合(三)继承Collection的Queue接口 一.Queue介绍 Queue接口继承自Collection接口,是Java中定义的一种队列数据结构,元素是有序的(按插入顺序排序),先 ...

  8. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  9. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

随机推荐

  1. 33.vsftpd服务程序--本地用户模式

    1.针对本地用户模式的权限参数以及作用如下 [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 1 anonymous_enable=NO 2 local_ ...

  2. cassandra权威指南读书笔记--cassandra查询语言

    cassandra使用一个特殊主键(复合键)表示宽行,宽行也叫分区.复合键由一个分区键和一组可选的集群列组成.分区键用于确定存储行的节点,分区键也可以包含多个列.集群键用于控制数据如何排序以及在分区中 ...

  3. Hive配置Tez引擎踩坑

    框架版本 Hadoop 2.7.7 Hive 2.3.7 Tez 0.9.2 保证hadoop集群启动,hive元数据服务启动 上传tez到HDFS tar -zxvf apache-tez-0.9. ...

  4. Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析

    目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ...

  5. jQuery插件Validate

    一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2 ...

  6. 【算法】数据结构与算法基础总览(中)——刷Leetcode等算法题时一些很实用的jdk辅助方法锦集

    最近重新学习数据结构与算法以及刷leetcode算法题时,发现不少jdk自带的方法可以提升刷题的效率.这些小技巧不仅仅对刷算法题带来便利,对我们平时开发也是很有帮助的.本文以java语言为基础,记录了 ...

  7. 2019牛客国庆集训派对day2

    A(模拟): #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const double ...

  8. CentOS环境下搭建青岛大学OJ

    1.安装必要的依赖sudo yum updatesudo yum -y install epel-releasesudo yum -y install python-pipsudo yum clean ...

  9. 2019牛客暑期多校训练营(第七场)E-Find the median(思维+树状数组+离散化+二分)

    >传送门< 题意:给n个操作,每次和 (1e9范围内)即往数组里面插所有 的所有数,求每次操作后的中位数思路:区间离散化然后二分答案,因为小于中位数的数字恰好有个,这显然具有单调性.那么问 ...

  10. 2019牛客暑期多校训练营(第三场) F.Planting Trees(单调队列)

    题意:给你一个n*n的高度矩阵 要你找到里面最大的矩阵且最大的高度差不能超过m 思路:我们首先枚举上下右边界,然后我们可以用单调队列维护一个最左的边界 然后计算最大值 时间复杂度为O(n*n*n) # ...