Java学习之路 —— Day2(OOP)

文章目录

  • 1. 方法
  • 2. OOP
    • 2.1 static
    • 2.2 单例模式
    • 2.3 继承
    • 2.4 多态
  • 3. 常用API
    • 3.1 包
    • 3.2 String
    • 3.3 ArrayList

1. 方法

方法定义时要使用public static修饰,这是和C++最不同的地方,因为java都是基于类执行的。

Java的参数传递机制是值传递,即传递的是一个副本;而如果参数是数组,则是引用传递,可以理解为传递的是数组的指针,这是唯一不同的地方。

package basic;
import java.util.Scanner;
public class Method {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt(), b = sc.nextInt();System.out.println(sum(a, b));}public static int sum(int a, int b) {return a + b;}
}

2. OOP

Java受欢迎的一个主要原因就是有垃圾回收机制,比如当你把一个对象置为null的时候,就自动回收了。

java的OOP和C++不同的是,java默认权限都是default,即只能在本package中访问,而且我们需要对每一个参数或者函数写上访问权限;C++的话就是在前面写一个public或者private,这一点来说,java要麻烦一点。

2.1 static

java有实例代码块,即加{},里面的代码可以在构造前执行,同时还可以加static,这样就只执行一次。

2.2 单例模式

懒汉式

public class SingletonB {private static SingletonB b;private SingletonB() {}// 加同步锁线程安全,但是效率低
//    public static synchronized SingletonB getInstance() {public static SingletonB getInstance() {if(b == null) {synchronized (SingletonB.class) {if(b == null)b = new SingletonB();}}return b;}
}

饿汉式

public class SingletonA {private static final SingletonA a = new SingletonA();private SingletonA() {}public static SingletonA getInstance() {return a;}
}

2.3 继承

java的继承用的是extends关键字,可以让一个类和另一个类建立起父子关系。子类可以继承父类的非私有成员(成员变量、成员方法)。

权限修饰符
public和private是最常用的,protected和缺省也有,不过很少。

修饰符在本类中同一个包下的其他类里任意包下的子类里任意包下的任意类里
private
缺省
protected
public

单继承
和C++不同的是,Java只支持单继承,这也就不能存在菱形继承的问题了;不过也是支持多层继承的。(据我的了解,似乎只有C++支持多继承)

Object类

  • Object类是java所有类的祖宗类(默认)。这一点就像是python的类一样,全部都继承自Object。

方法重写

  • 使用@Override注解,他可以指定编译器,检查我们重写的方法格式是否正确,代码可读性也更好。
  • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
  • 私有方法、静态方法不能被重写
  • 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限
public class Son extends Father{public void print2() {System.out.println("I'm Son");print1();}@Overridepublic void print3(int a, int b) {super.print3(3, 4);System.out.println("I'm Son " + a + " " + b);}
}

声明不变,重新实现

2.4 多态

在进行强转时,java建议使用instanceof关键字,判断当前对象的真实类型,再进行强转。

final

  • 修饰类:该类被称为最终类,特点是不能被继承了
  • 修饰方法:该方法被称为最终方法,特点是不能被重写了
  • 修饰变量:该变量只能被赋值一次(java没有const常量,用final来代替)

常量

  • 使用了static final修饰的成员变量就被成为常量
  • 作用:通常用于记录系统的配置信息。
  • 命名规范:使用大写字母,多个单词之间使用下划线连接起来。

抽象类
Java中的抽象类用abstract关键字修饰,相当于C++的 = 0被抽象的类不能有实例,必须被子类重写所有抽象方法

public abstract class People {public People() {System.out.println("人被构造出来了");}public void run() {}public abstract void eat();
}public class Student extends People{@Overridepublic void run() {System.out.println("学生跑得快");}public void eat() {System.out.println("学生在吃东西");}
}public class Main {public static void main(String[] args) {People p1 = new Teacher();People p2 = new Student();p1.run();p2.run();// 强制转换if(p1 instanceof Student) {Student s = (Student) p1;} else {Teacher s = (Teacher) p1;}p1.eat();p2.eat();}
}

接口
Java接口的关键字是interface,Java接口是一种特殊的抽象类型,主要用于定义对象之间的交互方式。它定义了一组方法的规范,这些方法没有具体的实现。
在这里插入图片描述
在这里可以选择Interface。在接口类中,不需要加public abstractpublic static这些。

public interface 接口名 {// 成员变量(常量)// 成员方法(抽象方法)
}

对应的还有实现类,他的关键字是implements,所以综上可以把接口类认为是父类,实现类认为是子类。一个类可以实现多个接口,实现类实现多个接口,必须重写完接口的全部抽象方法。

修饰符 class 实现类 implements 接口1, 接口2, 接口3, ... {}

接口的优点

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

JDK8新特性
在接口类中,允许实现方法,默认是public,主要是方便项目中后续开发增加新功能时,可以直接在接口类实现,不必对所有的实现类重写增加新功能,更便于项目的扩展和维护。(感觉加了这个功能后,就和C++的virtual很像了,自己本身也可以有自己的实现,然后也能让子类进行重写)

三者都默认被public修饰。

public interface A {/*** 1. 默认方法:必须使用default修饰,默认会被public修饰* 实例方法:对象的方法,必须使用实现类的对象来访问*/default void test1() { // 默认用public修饰,所以不用写System.out.println("默认方法");test2();}/*** 2. 私有方法:必须使用private修饰(JDK9开始支持),只能在接口内部被调用* 实例方法:对象的方法*/private void test2() {System.out.println("私有方法");}/*** 3. 静态方法:必须使用static修饰,必须用当前接口名调用*/static void test3() {   // 默认用public修饰,所以不用写System.out.println("静态方法");}
} 

3. 常用API

3.1 包

  • 如果当前程序中,要调用自己所在包下的其他程序,可以直接调用。(同一个包下的类,互相可以直接调用)
  • 如果当前程序中,要调用其他包下的程序,则必须在当前程序中导包,才可以访问!import 包名.类名
  • 如果当前程序中,要调用Java提供的程序,也需要先导包才能使用;但是Java.lang包下的程序不需要导入,可以直接使用
  • 如果当前程序中,要调用多个不同包下的程序,而这些程序名正好一样,此时默认只能导入一个程序,另一个程序必须带包名访问。

Java万物皆对象,就是这个道理。

3.2 String

String的几种创建方式,官方推荐的是第一种方法。
在这里插入图片描述

一些常用的API:
在这里插入图片描述

public static void main(String[] args) {String s = "jehanrio";// 1. 获取字符串长度System.out.println("s的长度:" + s.length());// 2. 提取某个索引的字符char c = s.charAt(2);for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);System.out.print(ch);}System.out.println();System.out.println("_____________________________");// 3. 字符串转换为字符数组,再进行遍历char[] chars = s.toCharArray();for (int i = 0; i < chars.length; i++) {System.out.print(chars[i]);}System.out.println();// 4. 判断字符串内容是否一样String s1 = "JehanRio";String s2 = "jehanrio";System.out.println("s1和s2是否一样:" + s1.equals(s2));// 5. 忽略大小写比较字符串内容System.out.println("忽略大小写比较内容是否一样:" + s1.equalsIgnoreCase(s2));// 6. 截取字符串内容,这点和C++不一样,第二个参数是结尾的下标(不包含),而不是长度System.out.println(s1.substring(1, 5));// 7. 内容替换,并返回新的字符串对象String info = "你是个垃圾";String s3 = info.replace("垃圾", "***");System.out.println(s3);// 8. 判断是否包含关键字(C++的find)System.out.println(info.contains("垃圾"));// 9. 判断字符串是否以**开头System.out.println(s2.startsWith("jehan"));// 10. 把字符串按照某个指定内容,分割成多个字符串,放到一个字符串数组中(python的.join)String s5 = "张三,李四,王五";String[] rs = s5.split(",");for (String r : rs) {System.out.print(r+" ");}}

一些注意事项

  • String的内容是不可变的,只要是以"..."写出的字符串对象,会在堆内存中的字符串常量池中存储。(每次试图修改字符串对象,都是指向了新的字符串对象)
  • 只要是以“...”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份(和python一样);但是通过new方式创建字符串对象,每new一次都会产生一个新的对象存在堆内存中。这也是为什么官方推荐我们用"...",为了节约内存。
    在这里插入图片描述

String s1 = new String("abs"); 创建了2个对象
String s2 = "abc"; // 创建了0个对象
s1和s2的地址不同。
在这里插入图片描述

3.3 ArrayList

ArrayList是Java中的集合容器,对应着类似C++的vector,底层是一种动态数组,扩容也是2倍扩容。
在这里插入图片描述
如果要限制数据的类型,则可以加上泛型,如果不加,则什么类型的数据都可以加入集合中。

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

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

相关文章

记录第一次利用CVE-2023-33246漏洞实现RocketMQ宿主机远程代码执行的兴奋

我依然记得自己第一次发现xss漏洞时候的兴奋: 我也记得自己第一次发现sql输入时候的快乐: 直到最近我终于收获了人生的第一个远程代码执行漏洞的利用&#xff08;RCE:remote code execute&#xff09;&#xff0c;虽然这个漏洞的危害远超过了前两个&#xff0c;但是快乐不如前…

ctf之流量分析学习

链接&#xff1a;https://pan.baidu.com/s/1e3ZcfioIOmebbUs-xGRnUA?pwd9jmc 提取码&#xff1a;9jmc 前几道比较简单&#xff0c;是经常见、常考到的类型 1.pcap——zip里 流量分析里有压缩包 查字符串或者正则表达式&#xff0c;在包的最底层找到flag的相关内容 我们追踪…

C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)

今天在看之前收藏的一个pdf文档(介绍C#外挂的相关知识的)&#xff0c;结合网上的东西及个人的理解才有了这篇文章。 参考文章&#xff1a; 【精选】一文带解读C# 动态拦截覆盖第三方进程中的函数&#xff08;外挂必备&#xff09;_zls365365的博客-CSDN博客 DotNetDetour - …

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…

阿里云 OSS使用介绍

1、什么是阿里云 OSS&#xff1f; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。…

Java编程--单例模式(饿汉模式/懒汉模式)/阻塞队列

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 目录 单例模式 饿汉模式&#xff1a; 懒汉模式&#xff1a; 什么是阻塞队列 什么是高内聚 低耦合 阻塞队列的实现 单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见…

11. 深度学习——强化学习

机器学习面试题汇总与解析——强化学习 本章讲解知识点 什么是强化学习 围棋举例 强化学习的两个特点和一个核心 最简单的强化学习算法 一个完整的强化学习问题 进一步深入强化学习的核心 本专栏适合于Python已经入门的学生或人士&#xff0c;有一定的编程基础。本专栏适…

GPU Microarch 学习笔记【2】Unified Memory

目录 1. M3 Dynamic Caching 2. Unified Memory 3. Unified Memory是如何处理page fault的 4. Unified Memory Page Fault的相关论文 M3 Dynamic Caching 最新的Apple M3 芯片最亮眼的可能是支持dynamic caching&#xff0c;如下图所示。 具体说来就是传统的GPU分配内存时&…

C语言从入门到精通之【printf和scanf函数】

printf()是输出函数&#xff0c;scanf()是输入函数&#xff0c;但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。 printf()函数的格式 printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量&#xff…

计算机视觉中目标检测的数据预处理

本文涵盖了在解决计算机视觉中的目标检测问题时&#xff0c;对图像数据执行的预处理步骤。 首先&#xff0c;让我们从计算机视觉中为目标检测选择正确的数据开始。在选择计算机视觉中的目标检测最佳图像时&#xff0c;您需要选择那些在训练强大且准确的模型方面提供最大价值的图…

CentOS 7镜像下载;VMware安装CentOS 7;解决新安装的虚拟机没有网络,无法ping通网络的问题

CentOS 7镜像下载&#xff1b;VMware安装CentOS 8.5&#xff1b;解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题 CentOS 8.5镜像下载VMware安装CentOS 7解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题写入配置文件 CentOS 8.5镜像下载 阿里提供的…

软件工程分析报告07测试计划书——基于Paddle的肝脏CT影像分割

目录 测试计划书 1. 引言 2. 测试目标 3. 测试方法 3.1 黑盒测试 (1)等价类划分&#xff1a; (2)边界值分析&#xff1a; (3)因果图&#xff1a; ​编辑&#xff08;4&#xff09;错误推测法 3.2 白盒测试 测试用例&#xff01;&#xff01; 4. 测试环境 5. 测试计划 6…

Docker - DockerFile

Docker - DockerFile DockerFile 描述 dockerfile 是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 编写一个dockerfile 文件docker build 构建成为一个镜像docker run 运行脚本docker push 发布镜像&#xff08;dockerhub&#xff0…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

阶段七-Day01-SpringMVC

一、Sping MVC的介绍 1. 使用Front(前端)设计模式改写代码 1.1 目前我们的写法 目前我们所写的项目&#xff0c;持久层、业务层的类都放入到Spring容器之中了。他们之间需要注入非常方便&#xff0c;只需要通过Autowired注解即可。 但是由于Servlet整个生命周期都是被Tomca…

数据结构—二叉树的模拟实现(c语言)

目录 一.前言 二.模拟实现链式结构的二叉树 2.1二叉树的底层结构 2.2通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 2.3二叉树的销毁 2.4二叉树查找值为x的节点 2.5二叉树节点个数 2.6二叉树叶子节点个数 2.7二叉树第k层节点个数 三.二叉树的遍历 3.1…

java基础-数据类型

1、变量 变量就是申请内存来存储值。也就是说&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。 因此&#xff0c;通过定义不同类型的变量&#xff0c;可以在内…

【C++】类与对象 I

类与对象 I &#xff1a; 前言&#xff1a;&#xff08;C&#xff09;面向过程 和&#xff08;C&#xff09;面向对象 初步认识前言&#xff1a;类的引入一、类的介绍二、类的定义&#xff08;一&#xff09;class 语法&#xff08;二&#xff09;类的两种定义方式&#xff1a;…

个人网厅——销户

目录 需求文档 公积金销户类 controller层 service层 service层实现类 1.验证 &#xff08;个人账户&#xff09; 2.提交&#xff08;添加&#xff09; controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4. 详情查询…

excel中通过ROW函数返回引用的行号

例如&#xff0c;想引用B3的行号&#xff08;行号应该是3&#xff09;&#xff1a; 鼠标点在想输入函数的单元格&#xff1a; 插入-》函数&#xff1a; 选择ROW函数&#xff1a; 点击“继续”&#xff0c;然后点击红框圈出来的按钮&#xff1a; 鼠标点击B3单元格&…