Java从入门到精通(四)· 面向对象

Java从入门到精通(四)· 面向对象

一 静态关键字(static)

static表示静态关键字,可以用来修饰成员变量成员方法

static修饰的成员变量,称之为静态成员变量或者类变量,同理可得,被修饰的成员方法称之为静态成员方法或者类方法

public static String name="shawn";
void test(){System.out.println(name);System.out.println(Study08Static.name);
}

一般情况下,使用类名直接来访问类变量

被 static 修饰的关键字的特点:

属于类,与类一起加载,在内存中只有一份,会被类的所有对象共享

二 继承

1.继承的介绍

使用 extends 关键字,可以让一个类与另一个类建立起父子关系。

继承的特点:

  • 子类能够继承父类的非私有成员
  • 子类的对象是有子类和父类共同完成
  • 减少重复代码
@Data
public class Pupil extends Student {private String className;private String teacher;
}

Java 中不支持多继承,仅支持单继承,即只能继承一个多父类

2.Object类

所有的类都默认继承了Object 类。

3.方法重写

即子类重新实现父类中已存在的方法,称之为方法重写

重写父类方法需要使用 @Override 注解

public class Parent {public void getName(){System.out.println("shawn");}
}
//*********************************************
public class Son extends Parent {@Overridepublic void getName() {System.out.println("alice");}
}

4.super 关键字

在子类范围访问父类的方法,如果已经对该方法进行了重写,则必须使用 super 关键字访问。

5.构造器特点

子类的全部构造器,都会先调用父类的构造器,再执行自己。

如果父类有多个构造器,则可以显示声明需要调用哪个构造器。

也可以使用 this 关键字,调用兄弟构造器

public class Parent {public Parent(){// 使用 this 关键字调用兄弟构造器this("shawn");}public Parent(String name){System.out.println(name);}
}

使用 super 或 this 关键字调用其他构造器时,super 或 this 必须放在第一行。由此可得, super 和 this 不能同时使用。

三 访问修饰符

访问修饰符被来用限制类中的成员能够被访问的范围

请添加图片描述

private < 缺省 < protected < public

四 多态

1.多态的概念

多态是在继承(extends)实现(implements) 情况下的一种现象,表现为:对象多态,行为多态。

People p1=new Student();
p1.work();
People p2=new Teacher();
p2.work();

其中,p1p2 表现为对象多态,而 p1.work()p2.work() 表现为行为多态。

多态的特点:编译看左边,运行看右边

2.多态的优缺点

1.多态形式下,右边对象是解耦合的,更便于维护和扩展。

解释:右边的对象如果不好用,则直接更换对象即可,无需再改动其他代码

2.定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强,更便利

3.多态的缺点:多态下的父类对象,无法使用子类的独有功能

3.多态的类型转换

  • 自动类型转换:父类 变量名=new 子类()
  • 强制类型转换:子类 变量名=(子类)父类变量
People student=new Student();
student.work();
Student stu=(Student)student;
stu.test();

注意事项:编译阶段的类型强转不会报错,但是运行阶段如果发现两个类型不能相互转换则会抛出异常

建议:强转前最好使用 instanceof 关键字,判断当前对象的真实类型,然后再进行强转

People p1=new Student();
p1.work();
if(p1 instanceof Student){Student stu=(Student)p1;stu.test();
}

五 final关键字

final 关键字,表示为”最终“的意思,一般可以用来修饰类,方法,变量。

  • 修饰类:该类被称为最终类,特点是该类不能被继承
  • 修饰方法:该方法被称为最终方法,特点是无法被重写
  • 修饰变量:该变量能且只能被赋值一次

注意:

如果 final 修饰基本类型的变量,则变量存储的数据不能被改变。

如果 final 修饰引用类型的变量,则变量存储的地址不能被改变,但是地址所指向的内容是可以被改变的。

// 数组(引用类型)的地址所指向的内容可以改变
final int [] number={1,2,34};
number[2]=111;
// 数组(引用类型)的地址不能改变(以下示例会报错)
final int [] number={1,2,34};
number[2]=111;
int [] number2={1,2,3,4};
number=number2;

使用 static final 修饰的成员变量一般被称之为常量。

常量通常用于记录一些配置信息,或是经常在项目中使用但是却不允许被修改的数据。

程序编译后,常量会被“宏替换”,即出现常量的地方都将会被替换为字面量,这样可以保证使用常量和使用字面量的性能是完全一样的。

宏替换是C/C++编程中的一个重要概念,它是在预处理阶段进行的一种文本替换机制。通过使用宏定义,可以将一段代码片段或常量定义替换为预定义的文本。

六 抽象类

1.概述

abstract 修饰的类,叫做抽象类,其中 abstract 就是抽象的含义,abstract 关键字可以修饰 成员方法

基本语法: [访问修饰符] abstract [class关键字] 类名

@Data
public abstract class AbstractParent {/*** 抽象类中的抽象方法*/public abstract void getName();public void getAge(){System.out.println("抽象类中的非抽象方法");};/*** 抽象类中的成员属性*/private String name;
}

abstract 修饰类,则该类就是抽象类,abstract 修饰方法,则该方法就是抽象方法(抽象方法必须存在于抽象类中)。

抽象方法只有方法定义,没有方法体!!!

  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类(抽象方法必须存在于抽象类中)
  • 类该有的成员(成员变量,构造函数,方法)抽象类都可以有
  • 一个类继承了抽象类,则必须完整实现抽象类中的全部抽象方法,除非这个类也是抽象类

抽象类最重要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现

2.优点

父类直到每个子类都要做某个行为,但是每个子类要做的情况不一样。这种情况下就可以将父类定义为抽象类,交给子类去重写实现。

这样设计的抽象类,可以更好的支持多态。

3.模板方法设计模式

模板方法设计模式主要用来解决方法中存在重复代码的问题

在这里插入图片描述

模版方法设计模式的写法:

  • 定义一个抽象类
  • 在里面定义两个方法:一个是模板方法,将重复代码放进去,另一个是抽象方法,具体交给子类实现

以下是抽象类:

public abstract class AbstractParent {/*** 抽象类中的抽象方法*/public abstract void getName();public abstract void getSex();// 这里的getinfo()就是模板方法,public final void getInfo(){getName();System.out.println("这是我的年龄啊");getSex();}
}

以下是抽象类的实现类:

public class ExtendsSon extends AbstractParent {@Overridepublic void getName() {System.out.println("这是名字");}@Overridepublic void getSex() {System.out.println("这是性别");}
}

演示示例:

public static void main(String[] args) {AbstractParent abstractParent=new ExtendsSon();abstractParent.getInfo();
}

为放置模板方法被重写,可以对模板方法添加final关键字

七 接口

1.概述

Java提供了一个关键字 interface,使用这个关键字可以用来定义接口。接口中包含成员变量,成员方法。

public interface A {/*** 在接口中定义的成员变量,默认为常量*/String studentName="Shawn";/*** 定义接口(省略访问修饰符,接口中定义的方法默认为抽象方法)*/void getName();
}

特点:接口不能创建对象,接口是用来被实现的

2.优点

接口的好处:

  • 弥补了类只能单继承的不足,一个类可以同时实现多个接口
  • 让程序可以面向接口编程,方便灵活的切换各种业务

3.接口中的其他成员

JDK8以后,接口中新增的三种方法:

  • 默认方法:必须使用 default 关键字修饰,默认会被 public 修饰,且JDK8以后开始支持
  • 私有方法:必须使用 private 修饰,只能在默认方法中使用,且JDK9以后才开始支持
  • 静态方法:JDK8以后,接口中可以定义静态方法,需要使用 static 关键字修饰,无需访问修饰符
public interface B {/*** 默认方法 必须使用 `default` 关键字修饰,默认会被 `public` 修饰* @return*/default String getName(){System.out.println("仅仅是测试");getAge();return "shawn";}/*** 接口中的私有方法*/private void getAge(){System.out.println("这是私有方法");}/*** 接口中的静态方法*/static void getAge(){System.out.println("接口中的静态方法");}
}

增加以上三种方法的原因:

  • 增强了接口的功能,可以直接编写方法
  • 可以为实现类扩展通用性的功能,而不需要实现类去实现

4.多继承的注意事项

同时集成的多个接口中如果存在名称冲突的方法,此时则无法进行多继承。

如果接口中存在与实现类同名的默认方法,则优先调用接口中的默认方法

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

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

相关文章

【个人记录】CentOS7 编译安装最新版本Git

说明 使用yum install git安装的git版本是1.8&#xff0c;并不是最新版本&#xff0c;使用gitlab-runner托管时候会拉项目失败&#xff0c;这里使用编译源码方式安装最新版本的git。 基础环境安装 echo "nameserver 8.8.8.8" >> /etc/resolv.conf curl -o /…

ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面

1. 简介 场景&#xff1a;在RK3588上做qt开发工作 RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 这里使用了OpenCV所带的库函数捕获摄像头的视频图像。 硬件环境&#xff1a; ArmSoM-RK3588开发板、&#xff08;MIPI-DSI&#xff09;摄像头 软件版本&#xff1a; OS&…

MYSQL进阶-事务的基础知识

1.什么是数据库事务&#xff1f; 就是把好几个sql语句打包成一个整体执行&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff01;&#xff01;&#xff01; 事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执 行的结果必…

IOS上架流程

IOS上架流程 准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 &#xff08;CSR文件&#xff09;三、创建发布证书 &#xff08;CER&#xff09;四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09;五、在App Store创建应用六、…

04-1_Qt 5.9 C++开发指南_常用界面设计组件_字符串QString

本章主要介绍Qt中的常用界面设计组件&#xff0c;因为更多的是涉及如何使用&#xff0c;因此会强调使用&#xff0c;也就是更多针对实例&#xff0c;而对于一些细节问题&#xff0c;需要参考《Qt5.9 c开发指南》进行学习。 文章目录 1. 字符串与普通转换、进制转换1.1 可视化U…

死磕Android性能优化,卡顿原因与优化方案

随着移动互联网的快速发展&#xff0c;Android应用的性能优化变得尤为重要。卡顿是用户体验中最常见的问题之一&#xff0c;它会导致应用的响应变慢、界面不流畅&#xff0c;甚至影响用户的使用体验。因此&#xff0c;我们需要深入了解卡顿问题的原因&#xff0c;并寻找相应的解…

以http_proxy和ajp_proxy方式整合apache和tomcat(动静分离)

注意&#xff1a;http_proxy和ajp_proxy的稳定性不如mod_jk 一.http_proxy方式 1.下载mod_proxy_html.x86_64 2.在apache下创建http_proxy.conf文件&#xff08;或者直接写到conf/httpd.conf文件最后&#xff09; 3.查看server.xml文件 到tomcat的安装目录下的conf/serve…

[mongo]应用场景及选型

应用场景及选型 MongoDB 数据库定位 OLTP 数据库横向扩展能力&#xff0c;数据量或并发量增加时候架构可以自动扩展灵活模型&#xff0c;适合迭代开发&#xff0c;数据模型多变场景JSON 数据结构&#xff0c;适合微服务/REST API基于功能选择 MongoDB 关系型数据库迁移 从基…

如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器

文章目录 前言一、认识注解&#xff1a;RestControllerAdvice和ExceptionHandler二、使用步骤1、封装统一返回结果类2、自定义异常类封装3、定义全局异常处理类4、测试 总结 前言 全局异常处理器是一种 &#x1f31f;✨机制&#xff0c;用于处理应用程序中发生的异常&#xff…

vivado tcl创建工程和Git管理

一、Tcl工程创建 二、Git版本管理 对于创建完成的工程需要Git备份时&#xff0c;不需要上传完整几百或上G的工程&#xff0c;使用tcl指令创建脚本&#xff0c;并只将Tcl脚本上传&#xff0c;克隆时&#xff0c;只需要克隆tcl脚本&#xff0c;使用vivado导入新建工程即可。 优…

使用openapi-generator-cli时遇到了代理的问题

前言&#xff1a;最近在捣鼓一个开源的管理kafka的web版&#xff0c;名字叫kafka-ui。准备部署到本地&#xff0c;方便平时遇到问题时&#xff0c;查看kafka的情况。开源项目github地址&#xff1a;点这里 。拿到这个项目&#xff0c;折腾了几天&#xff0c;今天终于编译成功了…

Kotlin语法

整理关键语法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量&#xff0c;优先 var定义可变变量…