面向对象3(Java)
多态
基本介绍
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但是可以指向对象的引用类型可以很多
- 多态存在的条件:a.有继承关系;b.子类重写父类方法;c.父类引用指向子类对象
- 多态注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常(ClassCastException)
- 存在条件:继承关系;子类重写父类方法;父类引用指向子类对象
- 还有三种方法不能重写:1.static方法(属于类,不属于实例)2.fianl方法(常量,不可改变)3.private方法(私有方法)
运用实例
DuoTai.java
public class DuoTai {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了
//Student能调用的方法都是自己或者继承父类的
Student s1 = new Student();
//Person父类型,可以指向子类,但是不能调用子类的独有方法
Person s2 = new Student();//父类的引用指向子类
Object s3 = new Student();
//对象能执行那些方法,主要看对象左边的类型,和右边关系不大
s1.run();//当子类的方法为空时,子类调用的是父类的方法
s2.run();//当子类重写了父类的方法时,父类调用的方法是子类的方法
s1.son();
//s2.son();
}
}
父类:Person.java
public class Person {
public void run(){
System.out.println("run");
}
}
子类:Student.java
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void son(){
System.out.println("son2");
}
}
Instanceof关键字的作用
public class Instanceof {
public static void main(String[] args) {
//Object>String
//Object>Person>Student
//Object>Person>Teacher
//System.out.println(x instanceof 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(Student和Teacher没有继承关系,属于平级,父类都是Person)
System.out.println(object instanceof String);//false(Student和String没有继承关系)
System.out.println("=========================");
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);//编译报错(因为person和String没有关系)
System.out.println("=========================");
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);//编译报错(因为Student和Teacher没有关系)
//System.out.println(student instanceof String);//编译报错(因为Student和String没有关系)
}
}
父类:Person.java
public class Person {
public void run(){
System.out.println("run");
}
}
子类:Student.java
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void son(){
System.out.println("son2");
}
}
子类:Teacher.java
public class Teacher extends Person {
}
类型转换
基本介绍
- 父类引用指向子类的对象
- 把子类转换成父类,向上转换
- 把父类转换成子类,向下转换,强制转换
- 方便方法的调用,减少重复的代码,简介
运用实例
public class LeiXing {
public static void main(String[] args) {
//类型之间的转换:父类 子类
Student student=new Student();
student.son();
//子类转换成父类,可能会丢失自己本来的一些方法
Person person=student;
//person.son();(编译报错,无法使用son()方法了)
//父类转换成子类,强制转换
((Student)person).son();//第一种方法
Student person1= (Student) person;//第二种方法
person1.son();
}
}
static关键字详解
实例1
public class Static {
private static int age;//静态属性
private int score;//非静态属性
public static void run(){//静态方法
}
public void go(){//非静态方法
}
public static void main(String[] args) {
Static s1 = new Static();
System.out.println(Static.age);//静态属性可以直接通过类名来调用
//System.out.println(Static.score);//编译报错
System.out.println(s1.score);//非静态属性则需要通过对象.属性来调用
System.out.println(s1.age);//静态属也可以通过对象.属性来调用
//方法和属性的性质相同
run();
Static.run();
//Static.go();
s1.go();
}
}
实例2
public class Static2 {
//第二执行(一般是用来赋初值)
{
System.out.println("匿名代码块");
}
//最先执行1(只执行一次)
static {
System.out.println("静态代码块");
}
//第三执行
public Static2() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Static2 static2 = new Static2();
System.out.println("=============");
Static2 static3 = new Static2();
}
}
运行结果:
静态代码块
匿名代码块
构造方法
=============
匿名代码块
构造方法
实例3
//静态包导入
import static java.lang.Math.random;
public class Static3 {
public static void main(String[] args) {
//System.out.println(Math.random());
System.out.println(random());//可直接使用random方法
}
}
抽象类
基本介绍
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法则该方法就是抽象方法,如果是修饰类则该类就是抽象类
- 抽象类中可以没有抽象方法,但是抽象方法的类必须是抽象类
- 抽象类,不能使用new关键字来创建对象,他是用来让子类继承的,没有构造器
- 抽象方法,只有方法声明,没有方法的实现,他是让子类实现的
- 子类继承抽象类,那么必须实现抽象类没有实现的抽象方法,否则该子类必须声明为抽象类
- 抽象为单继承,接口则可以多继承
运用实例
//abstract抽象类
public abstract class Abstract {
//约束,有人帮我们实现
//抽象方法,只有方法声明,没有方法的实现
public abstract void doSome();
}
public class Abs extends Abstract{
//子类继承抽象类,那么必须实现抽象类没有实现的抽象方法,否则该子类必须声明为抽象类
@Override
public void doSome() {
}
}
面向对象3(Java)的更多相关文章
- 面向对象编程 —— java实现函数求导
文章目录 ★引子 ★求导 ★最初的想法 ★初步的想法 ★后来的想法 ★最后的想法 ★编程范式 ★结尾 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科 ...
- 201771010118马昕璐《面向对象程序设计java》第八周学习总结
第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...
- 201771010134杨其菊《面向对象程序设计java》第十周学习总结
第8章泛型程序设计学习总结 第一部分:理论知识 主要内容: 什么是泛型程序设计 泛型类的声明及实例化的方法 泛型方法的定义 ...
- 201771010134杨其菊《面向对象程序设计java》第九周学习总结
第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...
- 201771010134杨其菊《面向对象程序设计java》第八周学习总结
第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类: Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...
- 面向对象的Java实现
1.面向对象的Java实现--封装 1-1:封装 a.为什么需要封装(封装可以是数据方便维护.增加实用性.方便扩展等等.通过面向对象的思想,模拟现实生活中的事物.) b.什么是封装(封装就是将属性私有 ...
- 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结
<面向对象程序设计Java>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...
- # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结
095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- Qt-设置背景色
https://blog.csdn.net/qq_43793182/article/details/121980724?ops_request_misc=&request_id=&bi ...
- Winform 在高分变率显示器中窗体变模糊配置方式
我们知道 Winform 前身与 XP 系统 同一时代出生 , 那时候显示器还是LCD 和 大头机 ,显示器普遍 96 DPI . 随着显示器质量改善,2K 屏, 4K屏普及,DPI 达 19 ...
- c++中内联函数和宏函数的区别
一. 区别: 是不是函数: 宏定义不是函数,但是使用起来像函数.预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率: 内联函数本质上是一个函数,内联函数一般用于函数体的代码比 ...
- :)torch转onnx总结--|
torch->onnx 参考:参考连接:https://blog.csdn.net/cxx654/article/details/123011332 1 安装 onnx >python - ...
- unity ScriptObject使用
转自 https://www.jianshu.com/p/77fabc83555b using UnityEngine; [CreateAssetMenu(fileName = "Untit ...
- Centos 8 安装zabbix 爬坑
1.安装mininal 8 2.配置静态网络BOOTPROTO=staticIPADDR=192.168.2.1NETMASK=255.255.255.0GATEWAY=192.168.2.200DN ...
- k8s_service
service 功能 主要是提供负载均衡和服务自动发现. pod的ip会随着升降级.销毁的操作改变.客户端不能直接访问pod的ip. service资源被用于在被访问的pod对象中添加一个有着固定IP ...
- 在vite中怎么批量注册组件
1. 在webpack中使用require来获取组件 / 参数:1. 目录 2. 是否加载子目录 3. 加载的正则匹配 //匹配当前文件夹下的所有.vue文件 注册全局组件 const importF ...
- pdf在线预览 ng2-pdf-viewer的运用
angular项目在线预览PDF 1 安装 ng2-pdf-viewer yarn add ng2-pdf-viewer 2 在项目中添加 import { NgModule } from '@ang ...
- 实践:Oracle 数据库基于 RMAN 备份至 腾讯云COS
简介 对象存储(COS)海量容量无上限,自动沉降归档存储类型和深度归档存储类型,媲美磁带的成本,特别适合备份归档场景. 当前,越来越多客户选择备份上云:而 Oracle 备份模块实现了和 腾讯云COS ...