Java面向对象编程(建议收藏)

2023-11-19

面向对象编程是一种方法,被广泛引用与Java中

接下来我将从:继承组合多态抽象类接口这几个方面进行全面的讲解。

 一、包

包是组织类的一种方式.

包从直观上看就是一个文件夹(jar包中包含的都是字节码文件).

包一般分为导入默认包、静态导入、和自定义导入三部分

导入默认包:

System.out.println(Arrays.toString(students));

当我们写这样一段代码时,Arrays不能直接使用,我们就需要导入java中的默认包来实现使用

import java.util.Arrays;

当我们还需要调用java.util中的其他包时我们可以将他们合并来使用

import java.util.*;

注意:java中对于包的调用是用那个调用那个。

静态导入:

在import后面加入static就为静态导入

import static java.lang.Math.*;

静态导入相较于其他导入来说可以更将方便的编写代码。

    public static void main(String[] args) {
        double x=30;
        double y=20;
        //静态导入之前
        //double result=Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
        
        //静态导入之后
        double result=sqrt(pow(x,2)+pow(y,2));
    }

自定义导入:

对于自定义导入包,就是我们自己进行编写一个类的实现,然后我们在其他的包中的类中去调用这个类。

package Test16;
import practice01.practice01;
public class Test01 {
    public static void main(String[] args) {
        practice01 practice01=new practice01();
    }
}

常见的系统包:

1.java.lang:系统常用基础包(自动导入)

2.Java.lang.reflect:java反射编程包

3.java.net:进行网络编程开发包

4.java.sql:进行数据库开发的支持包

5.java.util:java的工具程序包

6.java.io:I/O编程开发包

二、继承

在这里我们首先要理解继承是为了干什么,继承是为了提高代码的使用率

class Animal{}
class Dog extends Animal{}

继承我们一般通过extends来实现

对于Animal我们一般叫做父类、基类,对于Dog我们一般叫做子类、派生类。

继承的思想就是通过extends抽取共性从而提高代码的重复使用率

小结:java中有四种访问权限

          private 只能在类内部进行访问,类外部不能访问。

          默认访问权限(包访问权限) 只能在同一个包内进行访问。

          protected 不仅可以在包内进行放访问,不同包类的子类也可以访问。

          public 在任何情况下类的调用者都可以进行访问。

一般来说在继承中我们一般使用protrcted访问权限

复杂的继承关系:

class Animal{}
class Dog extends Animal{}
class Water extends Dog{}
class Microorganism extends Water{}

我们可以一直继承,但是我们一般最多继承三次;

三、final关键字和组合

3.1final关键字

final修饰的关键字修饰一个变量或者字段时,表示常量不能被改变

final int a=10;
a=20;//编译出错

final修饰类的时候类不能被继承

final class Animal{}
class Dog extends Animal{}//报错

3.2组合

组合不像extends那样,组合仅仅是将一个类的实例作为另外一个类的字段

class Student{}
class Teacher{}
class School{
    public Student[] students;
    public Teacher[] teachers;
}

四、多态

4.1向上转型

我们通过实例化一个对象通过父类引用这个对象叫做向上转型。

向上转型我们分为:直接赋值、方法传参、方法返回

class A{
    void fly(){
        System.out.println("wwwwwwwww");
    }
}
class B extends A{

    @Override
    void fly(){
        System.out.println("eeeeeeeee");
    }

    void size(){
        System.out.println("发生了向下转型");
    }
}
public class Test01 {
    public static void main(String[] args) {
        //A a=new B();
        //a.fly();//发生了向上转型

        //B b=new B();
        //feed(b);//方法的传参

        //方法的返回
        //A a=find();
    }
    public static A find(){
        B b=new B();
        return b;
    }
}

4.2向下转型

注意:向下转型一定是发生在向上转型之后。

class A{
    void fly(){
        System.out.println("wwwwwwwww");
    }
}
class B extends A{

    @Override
    void fly(){
        System.out.println("eeeeeeeee");
    }

    void size(){
        System.out.println("发生了向下转型");
    }
}
public class Test01 {
    public static void main(String[] args) {
        //向下转型
        A a=new B();
        B b=(B)a;
        b.size();
        //向下转型一定是发生了向上转型之后才能发生的

    }
    public static A find(){
        B b=new B();
        return b;
    }

    public static void feed(A a){
        a.fly();
    }
}

4.3动态绑定

当子类和父类中出现同名方法时

class Shape{
    public void draw(){
        System.out.println("m");
    }
}
class Cycle extends Shape{
    @Override
    public void draw(){
        System.out.println("Q");
    }
}




        Shape shape=new Shape();
        Shape shape1=new Cycle();
        shape.draw();;
        shape1.draw();

我们发现他们调用的各自的draw方法

所以说要看这个引用指向的是父类还是子类对象,这个过程是运行时决定的,被称为动态绑定。

4.4重写

子类实现父类的同名方法,并且参数的类型和个数完全相同,这种情况称为重写。

class Shape{
    public void draw(){
        System.out.println("m");
    }
}
class Cycle extends Shape{
    @Override
    public void draw(){
        System.out.println("Q");
    }
}
class Rect extends Shape{
    @Override
    public void draw(){
        System.out.println("W");
    }
}
public class Test02 {
    public static void main(String[] args) {
        Shape shape1=new Cycle();
        Shape shape2=new Rect();
        drawShape(shape1);
        drawShape(shape2);
    }
    public static void drawShape(Shape shape){
        shape.draw();
    }
}

重写要注意的实项:

1、被final修饰的方法不能重写。

2、重写时子类的访问修饰权限要大于父类的权限

3、方法不能是static的

4.5理解多态

在我看来什么是多态,多态就是对于不同的调用者,我们调用的同一种方法可以表现出不同的形态,这种行为叫做多态。

package Test15;
class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }
}
interface IFlying{
    void Fly();
}
interface IRunning{
    void Running();
}
interface ISwimming{
    void Swimming();
}

class Cat extends Animal implements IRunning{

    public Cat(String name) {
        super(name);
    }

    @Override
    public void Running() {
        System.out.println(this.name+"正在快乐的奔跑");
    }
}
public class Test05 {
    public static void main(String[] args) {
        Cat cat = new Cat("咪咪");
        cat.Running();
    }

}

五、抽象类

包含抽象方法的类我们叫做抽象类

abstract class Shape{
    abstract public void drow();
}

注意:

1.抽象类中可以定义成员属性和成员方法

abstract class Shape{
    int a;
    void size(){}
    abstract public void drow();
}

2.抽象类不能被实例化

3.抽象类存在的意义就是被继承,一个类如果继承了抽象类,那么他要重写它的所有方法;

4.抽象方法不能是final的且抽象方法不能是private的。

5.抽象类是可以发生向上转型和多态的

五、接口 

 接口里面的方法只能是抽象方法,方法的默认为pubilc abstract,接口中的成员变量默认为public static final

interface Shape{
    abstract public void drow();
}

注意:在JDK1.8之后普通方法也可以加入接口,但是要在前面加入default

default void asd(){}

 接口同样不能进行实例化

类和接口的关系需要通过implements来实现

interface Shape{
    abstract public void drow();
    default void asd(){}
}
class Shape01 implements Shape{
    
}

接口和接口的关系同样需要extends来继承

类可以继承多个接口但是需要用逗号隔开

接口也是可以发生向上转型和多态的

下面展示的是接口使用的例子:

package Test15;
class Animal{
    public String name;
    public Animal(String name){
        this.name=name;
    }
}
interface IFlying{
    void Fly();
}
interface IRunning{
    void Running();
}
interface ISwimming{
    void Swimming();
}

class Cat extends Animal implements IRunning{

    public Cat(String name) {
        super(name);
    }

    @Override
    public void Running() {
        System.out.println(this.name+"正在快乐的奔跑");
    }
}
public class Test05 {
    public static void main(String[] args) {
        Cat cat = new Cat("咪咪");
        cat.Running();
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java面向对象编程(建议收藏) 的相关文章

  • Spring Security 通过并发登录尝试将用户锁定

    我是安全新手 遇到了一个问题 该问题导致用户帐户被锁定 只有重新启动应用程序才能修复它 我有一个带有 spring security 4 0 2 RELEASE 应用程序的 spring boot 1 3 0 BUILD SNAPSHOT
  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 在 eclipse 之外将 Spring MVC 应用程序部署到 tomcat 的幕后会发生什么?

    我猜想使用像 eclipse 这样很棒的 IDE 的一个缺点是你会忽略应用程序幕后发生的事情 我是一名 Ruby 开发人员 所以不是一名 Java 老手 所以我一直在用 java 编写一个项目 并使用 spring 框架进行 IOC 和 M
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 我找不到 IntelliJ 快捷方式

    我使用 vim 一段时间 我知道有一个 intellij vim 插件 我很好奇内置的 IntelliJ 文本导航存在什么 如何打开实时模板来创建模板 如何查看以 tr 开头的现有模板列表 如何进行全局搜索并在当前文档中进行搜索 然后转到下

随机推荐

  • GPU压力测试和故障定位

    压力测试 获取gpu burn https codeload github com wilicc gpu burn zip master 解压缩 unzip gpu burn master zip 进入目录编译 cd gpu burn ma
  • 关于python爬虫的准备工作

    目录 1 什么是网络爬虫 2 准备工作 1 什么是网络爬虫 百度百科所给注释如下 网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 另外一些不常使用的
  • vm使用PE安装系统(2)

    接上次教程 vm使用PE安装系统 1 提要 此虚拟机安装方法适用于所有系统格式如ISO ESD GHO WIM等系统格式 第一步 打开DG硬盘分区 选择左侧栏进行的 HD0 右键选择快速分区 一般情况下选择自定义选择两个分区 然后右边内容栏
  • 芯片开发语言的简单区别介绍。Verilog、VHDL、System Verilog、SystemC、Matlab、C/C++等

    芯片开发语言的简单区别介绍 芯片设计前端的流程很长 和芯片前端相关的语言也很多 比如Verilog VHDL System Verilog SystemC Matlab C C 等等 但没有一个语言能够做到适合于整个前端流程 每种语言都有适
  • 【Kubernetes运维篇】零故障升级Pod健康探测详解

    文章目录 一 Pod健康探测介绍 1 三种容器探测方法 2 常用三种探测探针 3 探针相关属性说明 二 探测案例 1 Pod启动探测案例 startupProbe 2 Pod存活探测案例 livenessProbe 3 Pod就绪探测案例
  • QT QComboBox使用详解

    本文详细的介绍了QComboBox控件的各种操作 例如 下拉框添加内容 默认显示 获取下拉框总行数 获取选中索引 获取当前内容 清除列表 重绘下拉框等操作 本文作者原创 转载请附上文章出处与本文链接 QComboBox控件全面详解目录 1
  • RNA 31. SCI文章临床蛋白质组肿瘤在线数据挖掘神器(CPTAC)

    桓峰基因公众号推出转录组分析教程 有需要生信的老师可以联系我们 转录分析教程整理如下 RNA 1 基因表达那些事 基于 GEO RNA 2 SCI文章中基于GEO的差异表达基因之 limma RNA 3 SCI 文章中基于T CGA 差异表
  • 框架学习——带你了解SpringBoot框架

    目录 一 SpringBoot简介 1 1 原有Spring优缺点分析 1 1 1 Spring的优点分析 1 1 2 Spring的缺点分析 1 2 SpringBoot的概述 1 2 1 SpringBoot的特点 1 2 2 Spri
  • Qt(day3)

    思维导图 小练习 second h ifndef SECOND H define SECOND H include
  • (145) Table ‘./addon_collect_wukong_spider‘ is marked as crashed and should be repaired解决思路

    discuz更新插件时报错 145 Table addon collect wukong spider is marked as crashed and should be repaired解决办法 解决思路 打开phpmyadmin 选择
  • 用磁盘压缩卷新建分区和磁盘压缩卷还原问题

    转载 磁盘压缩卷新建分区 http jingyan baidu com article fedf073776922935ad897751 html 磁盘压缩卷还原 https zhidao baidu com question 304344
  • Linux常用命令之文件管理命令

    目录 1 ls 2 gt 输入 输出重定向和 管道命令 3 chmod命令 4 cd命令 5 mkdir和rmdir命令 6 cp命令 7 rm命令 8 mv命令 9 cat命令 10 pwd命令 11 ln命令 12 grep命令 13
  • http协议学习系列

    1 基础概念篇 1 1 介绍 HTTP是Hyper Text Transfer Protocol 超文本传输协议 的缩写 它的发展是万维网协会 World Wide Web Consortium 和Internet工作小组IETF Inte
  • 数据集加载--load_digits

    目录 主要参数 n class return X y as frame 返回值 return X y True return X y False Bunch对象的属性 data target feature names list targe
  • 100天精通Python(爬虫篇)——第47天:selenium自动化操作浏览器(基础+代码实战)

    文章目录 一 Selenium框架环境搭建 1 下载模块 2 安装浏览器驱动WebDriver 二 基础操作 1 打开浏览器 2 无界面模式 3 元素定位 4 元素操作 5 前进后退 6 执行js 7 页面等待 隐式等待 常用 显式等待 了
  • SPI、I2C、UART、CAN

    一 简介 1 SPI SPI Serial Peripheral Interface 串行外设接口 是Motorola公司提出的一种同步串行数据传输标准 在很多器件中被广泛应用 接口 SPI接口经常被称为4线串行总线 以主 从方式工作 数据
  • Go内存管理及性能观测工具

    内存管理 TCMalloc Golang内存分配算法主要源自Google的TCMalloc算法 TCMalloc将内存分成三层最外层Thread Cache 中间层Central Cache 最里层Page Heap Thread Cach
  • 利用hbase api在本地访问并操作服务器的hbase数据库

    最近因为实验室项目需要 开始研究了hbase 然后想一次性往集群服务器上写入大量的数据 并存到hbase中 考虑到在hbase shell下只能单个数据put 这样对于批量插入数据的要求完全不合适 于是就研究起hbase的java api
  • 只要 3 个注解,优雅的实现微服务鉴权!

    原创 不才陈某 码猿技术专栏 2023 04 17 08 50 发表于山东 大家好 我是不才陈某 前面的文章中介绍了网关集成Spring Security实现网关层面的统一的认证鉴权 有不清楚的可以看之前的文章 实战干货 Spring Cl
  • Java面向对象编程(建议收藏)

    面向对象编程是一种方法 被广泛引用与Java中 接下来我将从 包 继承 组合 多态 抽象类和接口这几个方面进行全面的讲解 一 包 包是组织类的一种方式 包从直观上看就是一个文件夹 jar包中包含的都是字节码文件 包一般分为导入默认包 静态导