java学习之旅(day.10)
重写
前提:需要有继承关系,是子类重写父类的方法,不是属性
重写特点:
- 方法名必须相同,
- 参数列表必须相同,否则就变成重载了
- 修饰符:范围可以扩大,不能缩小(即父类的private的,可以扩大为public的,但不能反过来)
大小关系:public>protected>Default>private (不写的时候,默认为default)
- 重写可能会抛出异常,异常的范围可以被缩小,但不能被扩大
重写:子类的方法和父类的方法必须一致,方法体不同
为什么需要重写
- 父类的功能,子类不一定需要或不一定满足,需要进行重写
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调用出的确实不同的结果(看程序)
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
多态是方法的多态,属性没有多态性
多态的注意事项
- 多态时方法的多态,属性没有多态
- 父类和子类有联系,不要瞎几把转换,无联系,出现类型转换异常ClassCastException
- 多态存在的条件:继承关系、方法需要重写,没有重写的话调用的都是各自的,就无区别了
- 父类的引用指向子类对象:Person s2=new Student();即father f1=new son();
- 方法需要被重写,但存在无法被重写的
- 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);编译时就报错
}
}
多态
- 父类引用指向子类的对象
- 把子类转换为父类,直接就可以转换过去
- 把父类转换为子类时,需强制转换
- 方便方法的调用,减少重复的代码
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)的更多相关文章
- Java学习之旅开篇:运行机制及环境搭建
在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- 第一篇,java学习之旅
在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...
- Java学习之旅基础知识篇:数组及引用类型内存分配
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- Java学习之旅(一):探索extends
鄙人为兴趣爱好,0基础入门学习Java,有些心得想法,记录于此,与君分享. 然毕竟新手,学识尚浅,错误之处,希望多多指正批评,也是对我最大的帮助! 前言:本篇文章,主要讨论在子类继承父类之后,一些继承 ...
- java学习之旅
jar文件其实就是一个压缩包,里面包含很多class文件(一个class文件是一个类的字节码).方便在网络上传输.可以规定版本号,更容易进行版本控制. var只能在方法内使用,不能用于定义成员变量. ...
- 我的java学习之旅--一些基础
(因为我粗略学过C,C++,Python,了解过他们的一些语法,所以为了使得java的入门更为顺畅,便会忽略一些和C语法相类似的地方,着重点明一些java自己的特色之处.也减轻一下自己写文字的负担.) ...
- Java学习之旅(二):生病的狗1(逻辑推导)
前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教. 中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧. 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病 ...
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
这是Alan Kay关于第一个成功的面向对象语言SmallTalk的总结: 1.所有的东西都是对象.可将对象想象成一种新型的变量:它保存着数据,但是可要求它对自身进行操作,理论上讲,可从要解决的问题身 ...
随机推荐
- C 语言函数完全指南:创建、调用、参数传递、返回值解析
C 语言中的函数 函数是一段代码块,只有在被调用时才会运行. 您可以将数据(称为参数)传递给函数. 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用. 预定义函数 事实证明,您已 ...
- js推送网页到扩展屏上--谷歌浏览器
平时我们推送网页.打开窗口都是用的 window.open,但是谷歌却不支持这种方法,也不是不支持,是可以打开窗口,但是无法将窗口移动到扩展屏上. 后面经过百度,发现了一个支持谷歌推送网页到扩展屏的方 ...
- Mysql之SQL语句初级用法
前言 本文通过简单的示例去了解Mysql的DDL.DML.DCL的语句用法. 一.DDL语句 DDL(Data Definition Language)语句: 数据定义语言,主要是进行定义/改变表的结 ...
- MVC 测试action的运行速度
前言 网络很多文章有关于action的测试机制,本文主要是整理一下思路. 正文 假如有一个acion: public ActionResult Index() { return View(); } 当 ...
- Kubernetes 部署集群1.28.2版本(无坑)
初步搭建一个一个主节点和两个从节点Kubernetes 1.28.2 集群.先准备好机器 | host | hostname | os | role | hardware | | --- | --- ...
- three.js实现数字孪生3D仓库一期(开源)
大家好,本文使用three.js实现了3D仓库一期项目,给出了代码,分析了关键点,感谢大家~ 关键词:数字孪生.three.js.Web3D.WebGL.智慧仓库.开源 代码:Github 我正在承接 ...
- 力扣73(java)-矩阵置零(中等)
题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 提示: m == matrix.length n == matrix[0].l ...
- 牛客网-SQL专项训练16
①在book表中,将工具书类型(tool)的书的书架序号都减少2,下列语句正确的是(C) 解析: 题目要求的批量更改,insert 是更改数据,排除B,update与set搭配使用,排除选项D,whe ...
- EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT
简介: 本⽂简要介绍CKBERT的技术解读,以及如何在EasyNLP框架.HuggingFace Models和阿里云机器学习平台PAI上使⽤CKBERT模型. 导读 预训练语言模型在NLP的各个应用 ...
- 消息队列 RabbitMQ 遇上可观测--业务链路可视化
简介: 本篇文章主要介绍阿里云消息队列 RabbitMQ 版的可观测功能.RabbitMQ 的可观测能力相对开源有了全面的加强,为业务链路保驾护航. 作者:文婷.不周 本篇文章主要介绍阿里云消息队列 ...