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# Lock的用法
当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源 ...
- HMS Core打造影音娱乐行业解决方案,助推视听新浪潮
6月28日,HDD·HMS Core. Sparkle影音娱乐线上沙龙在各大直播平台与开发者们见面.本次线上沙龙围绕影音娱乐行业现状观察和趋势.用户数据洞察分析以及HMS Core影音娱乐行业解决方案 ...
- css实现带背景颜色的小三角
<div id="first"> <p>带背景颜色的小三角实现是比较简单的</p> <span id="top"> ...
- OOM异常类型总结
OOM是什么?英文全称为 OutOfMemoryError(内存溢出错误).当程序发生OOM时,如何去定位导致异常的代码还是挺麻烦的. 要检查OOM发生的原因,首先需要了解各种OOM情况下会报的异常信 ...
- SSH的密码qsnctfwp
开启 kali,在终端输入ssh root@challenge.qsnctf.com -p [port]可以访问远程 SSH 系统 根据提供的 passlist.txt 文件内容进行密码爆破 编写 S ...
- redis 简单整理——缓存设计[三十二]
前言 简单整理一下缓存设计. 正文 缓存的好处: ·加速读写:因为缓存通常都是全内存的(例如Redis.Memcache),而 存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效 地 ...
- 安装 php_mongodb.dll的坑
背景 php_mongodb.dll在这里介绍的是for php,php_mongodb.dll是这个坑,因为php_mongodb.dll前生是php_mongo.dll,而这个东西,它又不更新了, ...
- pip(国内常用镜像源)安装地址
国内常用镜像源 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国 ...
- 第 9章 数据分析案例:Python 岗位行情
第 9章 数据分析案例:Python 岗位行情 9.1 数据爬取 (1)打开某招聘网站首页 https://www.lagou.com,选择"全国站",在搜索栏输入 Python, ...
- 基于 PTS 压测轻松玩转问题诊断
简介:性能测试 PTS(Performance Testing Service)是具备强大的分布式压测能力的 SaaS 压测平台,可模拟海量用户的真实业务场景,全方位验证业务站点的性能.容量和稳定性 ...