重写

前提:需要有继承关系,是子类重写父类的方法,不是属性

重写特点:

  1. 方法名必须相同,
  2. 参数列表必须相同,否则就变成重载了
  3. 修饰符:范围可以扩大,不能缩小(即父类的private的,可以扩大为public的,但不能反过来)

​ 大小关系:public>protected>Default>private (不写的时候,默认为default)

  1. 重写可能会抛出异常,异常的范围可以被缩小,但不能被扩大

重写:子类的方法和父类的方法必须一致,方法体不同

为什么需要重写

  1. 父类的功能,子类不一定需要或不一定满足,需要进行重写

alt+insert 选中override method

package com.zhang.oop.demo07;
//重写是对方法的重写,和属性无关
public class B {
public void test(){
System.out.println("B=<test");
} }
/*
package com.zhang.oop.demo07; public class A extends B {
//override 重写
@Override //自动生成的注解
public void test() {
//super.test();
System.out.println("A=<test");
}
/*public void test() {//把子类和父类方法中的static去掉就会产生小圆圈,向上向下的箭头(重写)
System.out.println("A=<test"); }*/
/* //删去文本注释的方法,用alt+ insert选 override Method(重写方法)
//} package com.zhang.oop; import com.zhang.oop.demo07.A;
import com.zhang.oop.demo07.B;
//重写只跟非静态方法有关,与静态方法无关,重写的关键词只能是public,不能是private
//静态方法和非静态方法区别很大
//加了static的静态方法,调用方法跟左边有关
//未加static的非静态方法
public class Application {
public static void main(String[] args) {
//方法的调用只和左边的类型有关(即只与定义的数据类型有关,跟右边的new没有什么关系)
A a=new A();
a.test();//走的A的方法 A=<test
//子类可以指向父类(父类的引用指向了子类)
//父类B的引用b指向子类A B=<test
B b=new A();//子类重写了父类的方法
b.test();//走的B的方法
} } */

多态

​ 动态编译,程序类型只有在执行过程才可决定,写代码时确定不了。通过多态使可扩展性更强

​ 即同一方法可以根据发送对象的不同而采用多种不同的行为方式,比如同样都是run方法,但通过s1和s2调用出的确实不同的结果(看程序)

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

多态存在的条件

  1. 有继承关系
  2. 子类重写父类的方法
  3. 父类引用指向子类对象

多态是方法的多态,属性没有多态性

多态的注意事项

  1. 多态时方法的多态,属性没有多态
  2. 父类和子类有联系,不要瞎几把转换,无联系,出现类型转换异常ClassCastException
  3. 多态存在的条件:继承关系、方法需要重写,没有重写的话调用的都是各自的,就无区别了
  4. 父类的引用指向子类对象:Person s2=new Student();即father f1=new son();
  5. 方法需要被重写,但存在无法被重写的
  • static方法,静态的,时属于类的,不是实例的(通过static修饰的方法不能被重写)
  • final 是常量的,被其修饰的方法无法去改变它
  • 通过private修饰的方法也不能被重写
package com.zhang.oop.demo08;

public class Person {
public void run(){
System.out.println("run");
} }
/*
package com.zhang.oop.demo08; public class Student extends Person {
//在子类中重写一下父类run()方法
@Override
public void run() {
System.out.println("son");
}
//再给子类定义一个eat()方法,而不给父类定义eat()方法
public void eat(){
System.out.println("eat");
}
} package com.zhang.oop; import com.zhang.oop.demo08.Person;
import com.zhang.oop.demo08.Student; public class Application {
public static void main(String[] args) { //通常情况下,new Student,这个Student类型就已经确定了
//new了什么就是什么,一个对象的实际类型是确定的(Student),但是可以指向的引用类型就不确定了(Person、Object等)
Student s1=new Student(); Person s2=new Student();//父类的引用指向子类的类型
Object s3=new Student();//Object是所有类的祖宗
//都是new Student,却可以表示多种状态 s2.run();//new的是Student,依旧可以用System.out.println("run");输出父类的方法,即子类继承了父类的全部方法
s1.run();//重写前s1输出run,重写后,子类重写了父类的方法,执行子类的方法s1,s2都输出son //再看写了eat方法后能调用吗
//对象能执行哪些方法,主要看对象左边的类型,而与右边关系不大
//如s1.eat();左边类型为Student,故可调用Student中的eat方法,而s2左边的类型为Person,再Person中无法调用eat方法,
// 因为Person中就没有eat方法,故子类和父类指向的引用时不一样的,子类Student可以调用自己的方法和继承过来父类Person的方法,
//父类Person可以指向子类Student,但是不能调用子类独有的方法
s1.eat();//此处 s2.eat();无法调用
//插嘴:这里,有点强制转换的内容,把Persong类强制转换为Student类的方法,s2就能调用eat方法了,代码如下
((Student)s2).eat();
}
}
*/

instanceof 类型转换间的关系

instanceof:java中需要判断一个对象是什么类型,instanceof这个关键字可以判断两个类间是否存在父子关系

package com.zhang.oop.demo10;

public class Application {
public static void main(String[] args) { //Object>String
//Object>Person>Teacher
//Object>Person>Student // System.out.println(x instanceof y);能不能编译通过看x与y之间是否存在父子关系
//编译后时true还是false看变量,也就是x所指向的实际类型是否为y的子类型
Object object=new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false Person person=new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//false
//System.out.println(person instanceof String);//编译时就报错 Student student=new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
System.out.println(student instanceof Object);//true
// System.out.println(student instanceof Teacher);编译时就报错
// System.out.println(student instanceof String);编译时就报错 }
}

多态

  1. 父类引用指向子类的对象
  2. 把子类转换为父类,直接就可以转换过去
  3. 把父类转换为子类时,需强制转换
  4. 方便方法的调用,减少重复的代码
package com.zhang.oop.demo09;

public class Person {
public void run(){
System.out.println("run");
}
} /*
package com.zhang.oop.demo09; public class Student extends Person {
//此时子类Student中有两个方法,一个是本身的go方法,好友一个时继承父类Person的run方法
public void go(){
System.out.println("go");
} } package com.zhang.oop.demo09; public class Application {
public static void main(String[] args) { //类型之间的转换(父类跟子类),之前学的时基本类型的转换(高转低需要强转,地转高直接转) Person student=new Student();//Student student=new Student();为什么可以把它直接变成Person类
// student.go();无法调用,此处的student是Person类型的,要想实现student.go(想用student的方法)需要将Person类型强制转换为Student类型的,代码如下 Student student1=(Student) student;
student1.go();
//若想用一句话代替上面两行代码如此: ((Student)student).go();
//再举个例子:
//子类转换为父类时,可能丢失自己本来的一些方法
//Student student =new Student();
//student.go;如果想把上一行的student变成一个Person类型,低转高,不用强制转,如下:
//Person person=student;
}
} */

java学习之旅(day.10)的更多相关文章

  1. Java学习之旅开篇:运行机制及环境搭建

    在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...

  2. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  3. 第一篇,java学习之旅

    在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...

  4. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  5. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  6. Java学习之旅(一):探索extends

    鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...

  7. java学习之旅

    jar文件其实就是一个压缩包,里面包含很多class文件(一个class文件是一个类的字节码).方便在网络上传输.可以规定版本号,更容易进行版本控制. var只能在方法内使用,不能用于定义成员变量. ...

  8. 我的java学习之旅--一些基础

    (因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...

  9. Java学习之旅(二):生病的狗1(逻辑推导)

    前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教. 中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧. 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病 ...

  10. 面向对象编程(OOP)的五大特征-java学习之旅(1)

    这是Alan Kay关于第一个成功的面向对象语言SmallTalk的总结: 1.所有的东西都是对象.可将对象想象成一种新型的变量:它保存着数据,但是可要求它对自身进行操作,理论上讲,可从要解决的问题身 ...

随机推荐

  1. nginx使用入门的笔记

    本文于2016年4月底完成,发布在个人博客网站. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 从源码安装nginx 下载软件 编译nginx,必备pcre,zlib ...

  2. MySQL 主从 AUTO_INCREMENT 不一致问题分析

    作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换, ...

  3. Wasm软件生态系统安全分析

    演讲嘉宾 | 王浩宇 回顾整理 | 廖   涛 排版校对 | 李萍萍 嘉宾简介 王浩宇,华中科技大学教授,博士生导师,华中科技大学OpenHarmony技术俱乐部主任.研究关注于新兴软件系统中的安全. ...

  4. OpenHarmony有氧拳击之设备端开发

    一.简介 在一个风和日丽,阳光明媚的下午,码农们都像往常一样正在专注地码代码.突然前面的小哥哥站起来,手握开发板,来回出拳.这是怎么回事? 原来这是一款拳击互动游戏,本文将带你一同解开其中的奥秘.开发 ...

  5. Git 版本控制系统的完整指南

    什么是 Git? Git 是一个流行的版本控制系统.它是由 Linus Torvalds 于 2005 年创建的,自那时以来由 Junio Hamano 维护. 它用于: 跟踪代码更改 跟踪谁做出了更 ...

  6. C 语言文件处理全攻略:创建、写入、追加操作解析

    C 语言中的文件处理 在 C 语言中,您可以通过声明类型为 FILE 的指针,并使用 fopen() 函数来创建.打开.读取和写入文件: FILE *fptr; fptr = fopen(filena ...

  7. 草之王qsnctfwp

    文件内容(举例): 林间小路旁有一条小溪 草之王许下三个诺言 无人知晓神诏背后的真相 草之王许下三个诺言 === 林间小路旁有一条小溪 草之王许下三个诺言 林间小路旁有一条小溪 无人知晓神诏背后的真相 ...

  8. CentOS9 \ Centos8安装MySQL 8步骤

    centos8 rpm 安装mysql8.0.28_太阳神LoveU的博客-CSDN博客 This upper link is still working for mysql 8 on the Cen ...

  9. signalr 应用于微信小程序(一)

    前言 在2017年基于signalr 和微信小程序 写的脚本. 正文 先安装signalr: 1.安装singalr,用nutget就行,用这个包管理就行. 2.使用singalr 3.根据singa ...

  10. 面试官:来说说vue3是怎么处理内置的v-for、v-model等指令?

    前言 最近有粉丝找到我,说被面试官给问懵了. 粉丝:面试官上来就问"一个vue文件是如何渲染成浏览器上面的真实DOM?",当时还挺窃喜这题真简单.就简单说了一下先是编译成rende ...