面向对象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关键字详解

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();
    }
}
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();
    }
}
运行结果:
静态代码块
匿名代码块
构造方法
=============
匿名代码块
构造方法
//静态包导入
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() {

    }
}

Original: https://www.cnblogs.com/TianCandy/p/16301337.html
Author: 糖果Tian
Title: 面向对象3(Java

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592818/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2021/1/28

    #include <bits/stdc++.h> using namespace std; string a,b; int maxl[1001][1001]; int …

    Java 2023年6月5日
    078
  • rocketmq简单消息发送

    有以下3种方式发送RocketMQ消息 可靠同步发送 reliable synchronous 可靠异步发送 reliable asynchronous 单向发送 one-way …

    Java 2023年6月16日
    066
  • C# 获取进程或线程的相关信息

    using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

    Java 2023年5月29日
    049
  • 01第一章:01_RocketMQ概述

    一、MQ 简介 MQ,Message Queue,是一种提供 消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程 API 的软件系统。消息即数据。一般消…

    Java 2023年5月29日
    060
  • 【翻译】Nginx的HTTP负载均衡

    将请求负载均衡到多个应用实例是一个常用的技术,它起到优化资源使用率、最大化吞吐量、降低延迟、保证容错性。 Nginx是一个非常有效的HTTP负载均衡工具,它将请求分发到多个应用服务…

    Java 2023年5月30日
    064
  • Nginx_Windos本地部署

    安装跟配置 安装: 下载地址:nginx: download 下载完成后,在指定位置解压缩,不要直接双击nginx.exe。 配置: server { listen 10700; …

    Java 2023年5月30日
    086
  • 什么是JDK,JRE

    JDK – -> 全称(Java Development Kit Java 开发工具包) JDK = JRE+java的开发工具 [java, javac,jav…

    Java 2023年6月16日
    086
  • 【设计模式】Java设计模式-组合模式

    Java设计模式 – 组合模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个有梦有戏的人…

    Java 2023年6月16日
    099
  • idea的使用和插件

    1 修改对应的配置信息(缓存)地址 由于我家里的电脑C盘被我设置得超级小,然后Idea默认的各种系统配置,最主要是缓存的地址,修改${idea.home}/bin/idea.pro…

    Java 2023年6月7日
    094
  • isEmpty 和 isBlank 的用法区别,你都知道吗?

    照惯例,先推荐整理很久、非常实用的面试题仓库: 史上最全的Java面试题库 正文如下,如果觉得有用欢迎点赞、关注~~ 也许你两个都不知道,也许你除了 isEmpty/ isNotE…

    Java 2023年5月29日
    069
  • java高级-续1

    IO 所谓IO就是输出输出(input/output)。一般的理解都是相对于计算机而言的输入输出。 比如: 输出设备:显示器,耳机,音响,打印机….. 输入设备:键盘,…

    Java 2023年6月7日
    0113
  • 动态线程池(DynamicTp)之动态调整Tomcat、Jetty、Undertow线程池参数篇

    大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程…

    Java 2023年6月14日
    088
  • django 学习使用

    目录 1、创建虚拟环境 安装django 2、创建Django项目 3.运行项目 4、创建app,app表示一个功能模块 5、注册app 6、配置访问该app的访问路径 7、给创建…

    Java 2023年6月8日
    088
  • 线程池:ThreadPoolExcutor源码阅读

    ThreadPoolExcutor源码流程图:(图片较大,下载再看比较方便) 线程池里的二进制奥秘 前言: 线程池的五种状态state (RUNNING 、SHUTDOWN 、ST…

    Java 2023年6月14日
    064
  • 银行管理系统

    // // main.cpp //银行管理系统 // // Created by 丁小未 on 13-7-23. // Copyright (c) 2013 年 dingxiaow…

    Java 2023年5月29日
    051
  • 分享一个基于 netty 的 java 开源项目

    1、简介 中微子代理(neutrino-proxy)是一个基于 netty 的、开源的 java 内网穿透项目。遵循 MIT 许可,因此您可以对它进行复制、修改、传播并用于任何个人…

    Java 2023年6月8日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球