Java学习之路 —— Day2(OOP)

news2024/10/7 17:23:02

文章目录

  • 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();
    }

    @Override
    public 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{
    @Override
    public 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.coloradmin.cn/o/1208484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派Ubuntu20.04设置静态IP后无法联网的问题及解决

一、问题描述 在使用虚拟机进行ssh远程连接时&#xff0c;需要知道目标机Ubuntu系统的用户名和IP地址&#xff0c;若IP地址是动态的&#xff0c;则每次远程连接前都需要接上显示器查看IP信息&#xff0c;很繁琐&#xff0c;所以需要设置静态的IP。 二、设置步骤 首先&#x…

HackTheBox-Starting Point--Tier 2---Vaccine

文章目录 一 Vaccine 测试过程1.1 打点1.1.1 FTP匿名登录1.1.2 SQL注入 1.2 权限提升 二 题目 一 Vaccine 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.191.631.1.1 FTP匿名登录 2.FTP允许匿名登录&#xff0c;发现backup.zip ftp 10.129.191.63解压backup.zip&#x…

王道计网:网络层

转发是路由器内部 路由选择是路由器之间 一、概述和功能

Vue基础必备掌握知识点-Vue的指令系统讲解(二)

Vue指令系统继续讲解 v-for 作用:基于数据进行循环&#xff0c;多次渲染整个元素 数据类型:数组.对象.数字。。。 遍历数组语法&#xff1a;v-for"(item,index)" in 数组 item:表示每一项 index:则是表现下标 注意:v-for中的key值&#xff0c;key属性唯一的…

《从零开始读懂相对论》

内容简介 相对论诞生至今已逾百年&#xff0c;但依然被人们津津乐道。相对论为什么如此有魅力&#xff1f;爱因斯坦为什么要创立相对论&#xff1f;本书从“零”开始&#xff0c;紧抓“相对”二字&#xff0c;将所有问题置于历史的背景下&#xff0c;竭力展现人类探索运动本质…

腾讯云2核4G服务器CVM标准型S5实例租用5年价格表

腾讯云服务器网整理五年云服务器活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频…

软考架构师学习心得和资料分享

23年11月的软考架构师终于考完了&#xff0c;相信很多朋友都觉得这次考试的内容有点难&#xff0c;我是从9月份报名后才开始准备的&#xff0c;一边工作一边学习确实压力很大&#xff0c;感觉更难了。 报名后还在闲鱼上买了份学习资料&#xff0c;后来又在芝士架构群里找了一些…

一文搞定接口自动化测试框架搭建orPytest_知识点总结

pytest编写的规则&#xff1a; 1、测试文件以test_开头&#xff08;以_test结尾也可以&#xff09; 2、测试类以Test开头&#xff0c;并且不能带有__init__方法 3、测试函数以test_开头 4、断言必须使用assert pytest.main([-s,-v]) &#xff1a;用来执行测试用例 -s 打印prin…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程&#xff1a; 图形界面创建&#xff1a;使用figure函数创建名为“声音采样率转换”的图形界面&#xff0c;并设置了其位置和大小。 按钮和文本框&#xff1a;使用uicontrol函数创建了选择音频文件的按钮、显示当前…

JavaScript_表单校验用户名和密码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><style>*{margin: 0px;padding: 0px;box-sizing: border-box;}body{background: url("img/register_bg.png") …

计算机视觉基础(7)——相机基础

前言 从这一节开始&#xff0c;我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始&#xff0c;我们先来学习一下相机模型&#xff0c;了解相机的基本原理&#xff0c;了解相机如何记录影像。 一、数字相机 1.1 基…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略&#xff1a; 负载均衡的两种方式&#xff1a; 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule&#xff0c;根据zone选择服务列表&#xff0c;然后轮询 2&#xff0e;负载均衡自定义方式 代码方式:配置灵活&#xff0c;但修…

SpringBoot整合WebSocket实现订阅消息推送

目录 一、什么是WebSocket1.HTTP协议2.WebSocket协议 二、WebSocket使用场景1.消息推送2.实时聊天3.弹幕4.实时数据更新 三、SpringBoot整合WebSocket&#xff08;以实现消息推送为例&#xff09;1.添加依赖2.创建消息类2.WebSocket配置类3.工具类4.测试连接5.服务调用 一、什么…

JAVA基础9:Debug

1.Debug概述 Debug:是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。 2.Debug操作流程 Debug调试&#xff0c;又被称为断点调试&#xff0c;断点其实是一个标记&#xff0c;告诉我们从哪里开始查看…

自动化接口差异测试-diffy 回归测试 charles rewrite 请求

1、前言 大家好&#xff0c;今天小编向大家介绍一款自动化接口diff平台–diffy。diffy是twitter的开源项目&#xff0c;通过同时运行新/老代码&#xff0c;对比运行结果&#xff0c;发现潜在bug。diffy的原理是作为代理&#xff0c;截取请求并发送至所有运行的服务实例&#x…

【thop.profile】thop.profile计算网络参数量和计算效率

&#x1f34b;&#x1f34b;1.安装thop 安装thop有两种方式。 &#x1f3c6;第一种 pip install thop &#x1f3c6;第二种 用源码编译安装 从官网下载【github】thop安装压缩包下载压缩文件&#xff0c;解压到虚拟环境的site-packages文件下激活进入自己的虚拟环境cd到压缩…

Django实战项目-学习任务系统-任务完成率统计

接着上期代码内容&#xff0c;继续完善优化系统功能。 本次增加任务完成率统计功能&#xff0c;为更好的了解哪些任务完成率高&#xff0c;哪些任务完成率低。 该功能完成后&#xff0c;学习任务系统1.0版本就基本完成了。 1&#xff0c;编辑urls配置文件&#xff1a; ./mysi…

在windows上利用vmware17 搭建centos7 mini版本服务器

安装centos7mini 修改名称和安装路径 也可以点击自定义硬件&#xff0c;进行硬件配置修改 设置内存 设置处理器 点击下图按钮进行设置 点击done 点击开始安装 点击设置root密码 设置成功&#xff0c;点击done &#xff0c;root密码设置的简单的话需要按两次done 等待安装完成…

前端算法面试之堆排序-每日一练

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 今天分享一个非常热门的算法--堆排序。堆的运用非常的广泛&#xff0c;例如&#xff0c;Python中的heapq模块提供了堆排序算法&#xff0c;可以用于实现优先队列&#xf…

微服务nacos实战入门

注册中心 在微服务架构中&#xff0c;注册中心是最核心的基础服务之一 主要涉及到三大角色&#xff1a; 服务提供者 ---生产者 服务消费者 服务发现与注册 它们之间的关系大致如下&#xff1a; 1.各个微服务在启动时&#xff0c;将自己的网络地址等信息注册到注册中心&#x…