面向对象的三大特征之一:继承性

主要解决问题:共性抽取

继承关系当中的特点:子类可以拥有父类的“内容”,子类还可以拥有自己专属的内容

定义一个父类的格式(就是定义一个普通类的格式):

Public class 类名称 {

  Public 方法类型 方法名称{

  }

}

定义一个子类的格式:

Public class 子类名称 extends 父类名称{

//........

}

如果父类中的变量与子类中的变量重名时,创建的对象是谁就优先用谁当中的变量。

如果父类中的方法与子类中的变量方法时,创建的对象是谁就优先用谁当中的方法。

区分父类的成员变量、子类的成员变量、局部变量:

局部变量: 直接使用

子类的成员变量:this.成员变量名

父类的成员变量:super.成员变量名

父子类的构造方法访问特点:

子类必须使用父类的构造方法,不写则默认使用一个super();如果使用则只能使用一次,且必须在第一条语句的位置。

super关键字的用法

  1. 访问父类的成员方法
  2. 访问父类的成员变量
  3. 访问父类的构造方法

继承的3大特点

单继承(一个类的父类只能有一个),多级继承(一个父类上面可以有多级父类,最高父类是java.long.Object),多子类(一个父类可以有多个子类)

抽象方法

用处:类当中不确定一个方法其内容是什么则该方法可以为抽象类

结构:在方法的返回值前面加是一个abstract关键字,去掉大括号,但必须是要在抽象类中才可以定义一个抽象方法,抽象类的结构在class前加上一个abstract关键字。

使用方法:

例:主方法

package peizeng;

public class text {
    public static void main(String[] args) {
        zi zi = new zi();
        zi.fu();
    }

}

父类中的抽象类及抽象方法

package peizeng;

public abstract class fu {
           public abstract void fu();
       }

子类方法对父类方法中抽象方法的覆盖

package peizeng;

public class zi extends fu {
    public void fu() {
        System.out.println("子类方法执行啦!!!");
    }
}

如果父类是抽象类,则子类必须覆盖父类中所有的抽象方法,否则错误,除非子类也是一个抽象类

接口

接口就是一种公共的规范标准

定义一个接口的基本格式:

Public interface 接口名称 {

  //接口内容

}
接口内容包括:常量,抽象方法,默认方法,静态方法,私有方法。

接口的使用步骤:

1.接口不能直接使用,必须有一个“实现类(类似于子类)”来“实现”该接口

格式:

Public class 实现类名称 implements 接口名称{

  //........

}

  1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
  2. 创建实现类的对象,进行使用

接口的默认方法

什么是接口的默认方法,即当接口需要升级时(添加新的抽象方法),会导致已经定义好的接口类出现错误,所以如果把添加的新的抽象方法改为默认方法,就不会出现这样的情况,定义好的接口类会默认拥有一个默认方法。

默认方法的定义:

Public default 返回值类型 方法名称(参数列表){

//方法体

}

接口的静态方法

静态方法的定义:
public static 返回值类型 方法名称(参数列表){

//方法体

}

使用方法:使用时直接通过(接口名.静态方法名)调用,不能通过实现类对象调用。

接口的私有方法

当一个方法只希望在接口中被使用,不希望在实现类中使用,即可定义为私有方法。

  1. 普通私有方法:解决多个默认方法之间重复代码问题

格式:

Private 返回值类型 方法名称(参数列表){

  方法体

}

  1. 静态私有方法:解决多个静态方法之间重复代码问题

格式:

Private static 返回值类型 方法名称(参数列表){

方法体

}

接口的常量

即成员变量

格式:

Public static final 数据类型 常量名称 = 数据值;

注意:

这3个关键字可以省略不写,必须赋值,一旦赋值则永远不能改变,名称大写。

调用:接口名.常量名称

关于使用接口的注意事项

  1. 一个类虽然只能有一个父类,但是可以有多个接口

例:public class 实现类名称 implement 接口名1,接口名2{

//覆盖重写的所以方法

}
2.如果实现的多个接口中存在相同的抽象方法,那么必须进行一次覆盖重写

3..如果实现的多个接口中存在相同的默认方法,那么实现类必须要覆盖重写冲突的默认方法。

4.接口与接口之间也可以出现继承,

例如一个接口需要继承一个或者多个接口:

Public interface 接口名 extend 接口1,接口2,......{

//方法体

}

面向对象的三大特征之一:多态

概念:父类应用指向子类对象

格式:父类名称 对象名 = new 子类名称();

或者 接口名称 对象名 = new 实现类名称();

多态中成员变量的使用规则:

直接使用:等号左边是谁就优先用谁,没有则向上查找

间接使用(通过成员方法访问成员变量):方法属于谁就优先用谁,没有则向上查找,但是如果被子类覆盖则使用被子类覆盖的新方法

多态中成员方法的使用规则:

看new的是谁就优先用谁,没有则向上查找,即:编译看左边,运行看右边。

对象的转型

类似于数据强转,向上只是小范围转向大范围,但是会失去子类方法中特有的方法

向上转型(就是多态写法):

格式:父类名称 对象名 = new 子类名称();

向下转型(将父类对象还原成原来的子类对象,条件:必须是对应的子类对象)

格式:子类名称 对象名 = (子类名称) 父类对象();

使用instanceof关键字对父类对象进行原来是哪一个子类对象的判断,返回一个布尔值

例:

Animal animal = new Dog();//这是向上转型

if(animal instanceof Dog){

  //......

}

Final关键字代表最终的,不可改变的

常见使用方法:

  1. 修饰一个类:则该类不能拥有子类。Public final class XXX {.....}
  2. 修饰一个方法:则该类不能被覆盖重写。Public final XXX{......}
  3. 修饰一个局部变量:如果是基本数据类型,则数据赋值后不能改变,如果是引用数据类型则其地址不能改变。Final int number = 10;
  4. 修饰一个成员变量:private final XXX xx;则必须直接赋值或者通过构造方法赋值

内部类

即一个类的内部包含另一个类。

分类:成员内部类与局部内部类。

成员内部类:

修饰符 class 外部类名称 {

  修饰符 class 内部类名称{

    //...

  }

  //...

}

使用方法:外部类名称.内部类名称 对象名 =  new 外部类名称().new 内部类名称();

如何在内部类中访问外部类的成员方法:外部类名称.this.外部类成员变量名

局部内部类(定义在一个方法内部的类):

修饰符 class 外部类名称{

  修饰符 返回值类型 方法名称(参数列表){

    class 局部内部类名称{

  //......

    }

  }

}

注意:如果局部内部类要想访问方法的成员变量,则该成员必须为(有效final值)即只能赋值一次。

匿名内部类

当接口的实现类仅需要使用一次的时候,则可以省略实现类改为使用匿名内部类。

定义格式:

接口名称 对象名 =  new 接口名称(){

//覆盖重写所有抽象方法

} ;

注意:其在创建对象的时候只能使用唯一的一次

Java学习-4的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  3. 分享篇——我的Java学习路线

    虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...

  4. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  5. Java学习心得之 HttpClient的GET和POST请求

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 HttpClient的GET和POST请求 1. 前言2. GET请求3 ...

  6. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  7. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  8. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  9. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  10. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. 【C#-程序时间计数器】如何计算某些步骤/过程耗时多少?

    使用Stopwatch对象,TimeSpan对象 Stopwatch sw = new Stopwatch();//跑表,该类可以进行时间的统计 命名空间using System.Diagnostic ...

  2. 常用C库函数小结

    1. sprintf 原型:int sprintf( char *buffer, const char *format, [ argument] - ); 功能:将格式化后的字符串写在buffer中, ...

  3. 通过PCI9030向外部RAM写数据失败现象

    我们的系统方案是:以9030作为PCI接口芯片,本地端映射了一片IDT70V06的双端口RAM.进行数据传输压力测试时,发现PC机向IDT70V06写数据偶尔会失败.这一问题是什么原因造成的呢? 最初 ...

  4. Hive运行原理--JOIN

    对于 JOIN 操作: INSERT OVERWRITE TABLE pv_users SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON ...

  5. Springdata-Jpa学习笔记

    Respository接口 Respository是Springdata JPA中的顶层接口,提供了两种查询方法: 1)基于方法名称命名规则 2)基于@Qeury注解查询 1. 方法名称命名规则查询 ...

  6. H264之基础篇

    1. H264 基础概念 在 H.264/AVC 视频编码标准中,整个系统框架划分为如下两个层面: 视频编码层(VCL):VCL 数据即被压缩编码后的视频数据序列,负责有效表示视频数据的内容: 网络抽 ...

  7. Redis5.0 3台主机三主三从部署Cluster集群

    1.下载安装 [root@ip101 redis-5.0.4]# pwd /opt/app/redis-5.0.4 [root@ip101 redis-5.0.4]# ls 00-RELEASENOT ...

  8. zeppelin 无法连接一个已有的standalone模式的spark集群

    SparkInterpreter.java  这个文件里面读取master的属性有些问题: 原来代码中"master"属性的获取的地方应该是错了.设置和读取这个属性的对象不是同一个 ...

  9. electron关于页面跳转 的问题

    刚开始看到页面跳转,大家一般会想到用 window.location.href = './index.html'; 这样的代码.结果是可以跳转,但 DOM事件 基本都会失效.到最后还是使用的 elec ...

  10. 使用oracle的存储过程的例子

    十几年没有用oracle的存储过程了,有些东西已经忘了,没有想到今天又要用.在这里写个例子.它演示了存储过程的格式,游标的使用,循环.判断的使用,还有直接执行一个拼接的SQL的用法.以下是代码: cr ...