重写

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

重写特点:

  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. .NET 8使用日志功能以及自定义日志提供程序

    .NET 8使用日志功能以及自定义日志提供程序 日志级别 下表列出了 LogLevel 值.方便的 Log{LogLevel} 扩展方法以及建议的用法: 展开表 LogLevel "值&qu ...

  2. 基于OpenHarmony的智能指南针

    电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分.为什么电子指南针能指示方向?本 Demo 将为你呈现,其中蕴含了人类智慧及大自然 ...

  3. Qt使用https协议发送带参数的post请求

    背景: 现在公司项目需要做一个检测更新的功能,通过访问后台接口,判断是否需要更新. 后台接口是 https 协议的,接口需要post请求,需要带参数,来判断是哪个软件需要做检测更新的操作. 客户端软件 ...

  4. 如何采用VuePress构建文档网站

    作者:倾城 博客: https://www.codingbrick.com 寄语:当你意识到面子不重要时,你才算个真正的成年人. 在建设博客的初期,我采用GitBook构建了编码专家的专栏系统.Git ...

  5. 实训篇-JavaScript-陶渊明去没去过桃花源

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. springboot多模块项目启动经历

    springboot多模块使用 @ 目录 springboot多模块使用 前言 大佬把项目权限给我了,我就先下下来看看学习一下 一.识别 二.maven配置 1.安装maven 三.加载刷新 总结 前 ...

  7. 距离传感器GT2的使用介绍

    一. 1.使用注意要点: (1)要使用到"清零"功能. 确定其内部清零软元件,认准"外部请求",注意组别容易混淆. (2)如果要用到"复位" ...

  8. asyncio和aiohttp携程并发

    import asyncio from aiohttp import web import time async def process(): for i in range(10): print(&q ...

  9. steam社区留言红小作文模板

    steam社区留言红小作文模板 Dear steam: Im a steam user which most play csgo.i saw i had be banned in steam comm ...

  10. RocketMQ 消息集成:多类型业务消息-普通消息

    简介: 本篇将从业务集成场景的诉求开始,介绍 RocketMQ 作为业务消息集成方案的核心能力和优势,通过功能场景.应用案例以及最佳实践等角度介绍 RocketMQ 普通消息类型的使用. 引言 Apa ...