JavaSE (Java基础):面向对象(下)

8.7 多态

        什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。

        一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的:

        在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的,但是父类引用指向对象子类的话,如果子类有重写的方法(即方法名与父类相同的方法但是内容不一定相同),那么执行的子类所重写的方法,如果没有重写的方法,就执行父类的。在这句话中所说的“但可以指向对象的引用的类型有很多”,意思是一个父类可以有很多的子类,都可以使用他们的重写方法。

示例:

父类Person:

package com.oop.demo06;public class Person {public void run(){System.out.println("run");}}

子类Student:

package com.oop.demo06;public class Student extends Person {@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}

 测试类:

import com.oop.demo06.Student;
import com.oop.demo06.Person;public class AppLication{public static void main(String[] args) {// 一个对象的实际类型是确定的// 可以指向的引用类型就不确定了:父类的引用指向子类// Student 能调用的方法都是自己的或者继承父类的!Student S1 = new Student();// Person是父类型的类,可以指向子类,但是不能调用子类独有的方法Person S2 = new Student();Object S3 = new Student();S2.run(); // 子类重写了父类的方法,执行子类的方法S1.run();// 对象能执行能执行哪些方法,主要看对象的左边类型,和右边关系不大!((Student) S2).eat(); //将S2的类型强制转换为Student,就可以调用方法了!S1.eat();}
}/*多态注意事项:1. 多态是方法的多态,属性没有多态2. 父类和子类要有联系    类型转换异常!     ClassCastException!3. 存在条件:    继承关系,方法需要重写,父类引用指向子类对象!1. static 方法,属于类,它不属于实例2. final 常量;3. private 方法*/


8.8 instanceof 和 类型转换

        instanceof 使用的方法格式:

        【实例的名称        instanceof        类的类型名称】,判断一个对象是什么类型,就是判读两个类型的对象是否有父子关系,有的话就返回Ture,没有就是返回False。

        使用 【实例的名称        instanceof        类的类型名称】时,能否编译看的是实例化对象的类型名,输出的结果看的是实例化对象时最右边的所实例的对象值。

首先父类是Person,其余的类:Student、Teacher是Person的子类。

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// Object > Person > Student// Object > Person > Tercher// Object > StringObject object = new Student();System.out.println(object instanceof Student);  // trueSystem.out.println(object instanceof Person);   // trueSystem.out.println(object instanceof Object);   // trueSystem.out.println(object instanceof Teacher);  // falseSystem.out.println(object instanceof String);   // falseSystem.out.println("=====================================");Person person = new Student();System.out.println(person instanceof Student);  // trueSystem.out.println(person instanceof Person);   // trueSystem.out.println(person instanceof Object);   // trueSystem.out.println(person instanceof Teacher);  // false
//        System.out.println(person instanceof String);   // 编译时就报错了System.out.println("=====================================");Student student = new Student();System.out.println(student instanceof Student);  // trueSystem.out.println(student instanceof Person);   // trueSystem.out.println(student instanceof Object);   // true
//        System.out.println(student instanceof Teacher);  // 编译时就报错
//        System.out.println(student instanceof String);   // 编译时就报错}
}

类型转换(关于对象的类型):

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// 类型之间的转化: 父   子// 高              低Person student = new Student();// student 将这个对象转换为Student的对象类型// 我们就可以使用这个对象类型中的方法了((Student) student).go(); // 这个是高转低需要强制转换// 如果是低转高,子类转换为父类不需要强制转换,可能会丢失一些方法!Student student1 = new Student();Person person = student1;}
}

 

8.9 static 关键字详解

        static修饰符有着静态的意思,使用他代表着这个方法或者元素在类中是与类一起加载的。

package com.oop.demo07;// static
public class Student {private static int age; // 静态变量     多线程private double score; // 非静态变量public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.score);System.out.println(age);}
}

        在类中,还有着代码块这种东西,他的优先级比这个构造器还高。

package com.oop.demo07;public class Person {//    {
//        // 代码块(匿名代码块)
//    }
//
//    static {
//        // 静态代码块
//    }// 第二个执行,可以用来赋初始值{System.out.println("匿名代码块");}// 第一个执行,与类一起加载,只执行一次,不管你实例化多少个对象static {System.out.println("静态代码块");}// 第三个执行,构造器public Person(){System.out.println("构造方法");}public static void main(String[] args) {Person person = new Person();System.out.println("==============");Person person1 = new Person();}
}

        在Java中有许许多多的有用又有趣的类,在这些类中有着许多有用的静态方法,可以使用下面这个方法直接调用,想查看类的调用位置直接ctrl+左键就行。 

package com.oop.demo07;// 导入其他包中的类的静态方法
import static java.lang.Math.random; // 返回一个随机数(0,1)
import static java.lang.Math.PI;    // 圆周率
public class Test {public static void main(String[] args) {System.out.println(random());System.out.println(PI);}
}

需要注意的是:

        如果给这些东西使用了常量修饰符final,那么他将会是唯一的,无无法拥有子类。 

 


8.10 抽象类

        什么是抽象类?abstract 修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么就是抽象类。

        抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

        抽象类,不能用new关键字来创建对象,它是用来让子类继承的。

        抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。

        子类继承了抽象类,那么他就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

抽象父类:

package com.oop.demo08;//abstract 抽象类:类
public abstract class Action {// 约束~有人帮我们实现~// 这个就是抽象的方法,我们只定义了方法名字,他的具体功能由别人实现public abstract void doSomething();// 1.   不能new这个抽象类,只能靠子类去实现它;约束!// 2.   抽象类中可以写普通的方法// 3.   抽象方法必须在抽象类中// 抽象的抽象:约束~
}

 抽象父类的子类,他里面有重写父类的方法:

package com.oop.demo08;// 抽象类的所有方法,继承了他的子类,都必须要实现他的方法
public class A extends Action {@Overridepublic void doSomething() {}
}

 

 


8.11 接口的定义与实现

 

接口的作用:1.  约束2.  定义一些方法,让不同的人实现3.  public abstract4. public static final5. 接口不能实例化,接口中没有构造方法6. implements可以实现多个接口7. 必须要重写接口中的方法

接口UserService:

package com.oop.demo09;//interface 定义接口的修饰符(关键字),接口都需要有实现类
public interface UserService {// 接口中定义就是常量    public static finalint AGE = 9999;// 接口中的所有定义的方法其实都是抽象的   public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}

 接口TimeService:

package com.oop.demo09;public interface TimeService {void timer();
}

        每个接口都需要有实现类。我是这样理解的,每个接口就是定义一堆方法的名字与类型就是没有里面的内容,而他们需要有实现类来实现里面的内容,需要用到关键字implements:

package com.oop.demo09;// 类 可以实现接口 implements 接口
// 实现了接口的类,就需要重新接口中的方法// 利用接口实现多继承
public class UersServiceImpl implements UserService,TimeService{@Overridepublic void add(String name) {}@Overridepublic void delete(String name) {}@Overridepublic void update(String name) {}@Overridepublic void query(String name) {}@Overridepublic void timer() {}
}

 

 


8.12 N种内部类

package com.oop.demo10;public class Outer {private int id = 14203;public void out(){System.out.println("这是外部类的方法");}public class Inner{public void in(){System.out.println("这是内部类的方法");}// 内部类能够获得外部类的私有属性public void getID(){System.out.println(id);}}
}
import com.oop.demo10.Outer;import java.util.Optional;public class AppLication{public static void main(String[] args) {Outer outer = new Outer();// 通过这个外部类来实例化内部类Outer.Inner inner = outer.new Inner();inner.in();inner.getID();}
}

 局部内部类:

package com.oop.demo10;public class Outer {// 局部内部类,在方法里的属性也叫做局部变量public void method(){class Inner{}}
}

匿名内部类:

package com.oop.demo10;public class Test {public static void main(String[] args) {// 没有名字初始化类,匿名类// 不用将实例保存在对象中new Apple();new Apple().eat();// 甚至可以匿名一个接口new Userservice(){@Overridepublic void happle() {}};}
}class Apple{public void eat(){System.out.println("eat");}
}interface Userservice{void happle();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件ApacheKafka在windows简单安装

一.背景 之前公司需要API网关管理软件ApacheShenYu,我相信把调用的记录都存到一个数据库。他支持日志推送到kafka,所以,我准备尝试一下通过kafka接收调用的日志信息。第一步,当然是安装kafka了。 二.ApacheKafka的下载 打开下载…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏(Memory Leak)是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放,导致内存无法被重新利用时,就会发生内存泄漏。这种错误会导致程序占用越来越多的内存,最终可能导致系…

关于人情世故的小讨论

大家好,我是阿赵。   最近国内篮球界内出了不少事情,让人对篮球这项运动产生了很多疑问。   去年的CUBA,拥有全国最好生源的清华大学居然输给了连985 、211都不是的广东工业大学。作为广工的毕业生,我知道广工的篮球一直都很强…

Unity PC和Android端的数据存储和读取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后会被压缩进.resources文件中&#xff0c;意味着它是只读文件&#xff0c;且必须使用resouce.load加载&#xff1a; /// <summary>/// 全平台使用/// </summary>/// <typeparam name"T"&g…

论文学习——动态多目标优化的一种新的分位数引导的对偶预测策略

论文题目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 动态多目标优化的一种新的分位数引导的对偶预测策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免费”的可视化大屏案例分享-智慧园区综合管理平台

一.智慧园区是什么&#xff1f; 智慧园区是一种融合了新一代信息与通信技术的先进园区发展理念。它通过迅捷信息采集、高速信息传输、高度集中计算、智能事务处理和无所不在的服务提供能力&#xff0c;实现了园区内及时、互动、整合的信息感知、传递和处理。这样的园区旨在提高…

自定义注解-手机号验证注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手机号校验注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正确使用Pytorch Geometric打开Cora(Planetoid)数据集

文章目录 关于报错&#xff08;"Cannot connect to host"&#xff09;解决方法 关于报错&#xff08;“Cannot connect to host”&#xff09; 我们在使用PyG调用Planetoid数据集的时候&#xff0c;常会碰到如下报错&#xff1a; 解决方法就是手动下载这个数据集。…

在 AWS Lambda 中使用 Flask 应用

本文将介绍如何在 AWS Lambda 中创建和部署一个使用 Flask 框架的应用。 1. 创建 Lambda 函数 首先,在 AWS Lambda 控制台创建一个新的函数,命名为 ​​flask-app​​。 2. 准备 Flask 层 为了在 Lambda 中使用 Flask,我们需要创建一个包含 Flask 库的层。按照以下步骤操…

java中如何使用ffmpeg命令来实现视频编码转换

在Java中使用FFmpeg命令来进行视频编码转换&#xff0c;可以通过调用系统命令来执行FFmpeg命令。下面是一个使用FFmpeg进行视频转码的示例代码&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class FFmpegVideoConverter {public stat…

前端播放RTSP视频流,使用FLV请求RTSP视频流播放(Vue项目,在Vue中使用插件flv.js请求RTSP视频流播放)

简述&#xff1a;在浏览器中请求 RTSP 视频流并进行播放时&#xff0c;直接使用原生的浏览器 API 是行不通的&#xff0c;因为它们不支持 RTSP 协议。为了解决这个问题&#xff0c;开发者通常会选择使用像 flv.js 这样的库&#xff0c;它专为在浏览器中播放 FLV 和其他流媒体格…

MySQL 代理层:ProxySQL

文章目录 说明安装部署1.1 yum 安装1.2 启停管理1.3 查询版本1.4 Admin 管理接口 入门体验功能介绍3.1 多层次配置系统 读写分离将实例接入到代理服务定义主机组之间的复制关系配置路由规则事务读的配置延迟阈值和请求转发 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

Java实现日志全链路追踪.精确到一次请求的全部流程

广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…

Android network - NUD检测机制(Android 14)

Android network - NUD检测机制 1. 前言2. 源码分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系统中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是网络中的邻居不可达检测机制&#xff0c;它用于检测设备是…

数据驱动测试实践:Postman 中使用数据文件的指南

Postman 是一个强大的 API 开发和测试工具&#xff0c;它支持数据驱动测试&#xff0c;允许测试者使用外部数据文件来驱动测试&#xff0c;实现测试用例的参数化。数据驱动测试可以显著提高测试效率&#xff0c;减少重复工作&#xff0c;并允许测试用例覆盖更广泛的输入场景。本…

一文了解常见DNS问题

当企业的DNS出现故障时&#xff0c;为不影响企业的正常运行&#xff0c;团队需要能够快速确定问题的性质和范围。那么有哪些常见的DNS问题呢&#xff1f; 域名解析失败&#xff1a; 当您输入一个域名&#xff0c;但无法获取到与之对应的IP地址&#xff0c;导致无法访问相应的网…

【代码随想录算法训练营第五十九天|卡码网110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长】

文章目录 卡码网110.字符串接龙105.有向图的完全可达性106.岛屿的周长 卡码网110.字符串接龙 这题是在字符串上进行广搜&#xff0c;字符串广搜是对一个字符串按照位置来搜索&#xff0c;与原字符串只有一个位置字符不同那么就是在原字符串的基础上距离加1。因此需要一个字典来…

获取VC账号,是成为亚马逊供应商的全面准备与必要条件

成为亚马逊的供应商&#xff0c;拥有VC&#xff08;Vendor Central&#xff09;账号&#xff0c;是众多制造商和品牌所有者的共同目标。这不仅代表了亚马逊对供应商的高度认可&#xff0c;也意味着获得了更多的销售机会和更广阔的市场前景。 全面准备与必要条件是获取VC账号的关…

代码转换成AST语法树移除无用代码console.log、import

公司中代码存在大量,因此产生 可以使用 @babel/parser 解析代码生成 AST (抽象语法树),然后使用 @babel/traverse 进行遍历并删除所有的 console.log 语句,最后使用 @babel/generator 生成修改后的代码。 这里有一个网址,可以线上解析代码转换成AST语法树: https://astex…