从零开始学JAVA(05):面向对象编程--04

news2024/11/25 4:50:19

一、StringBuilder

StringBuilder是一个非常方便的用来处理和拼接字符串的类,它和string不同的是,它是可变的

package com.lcy.learn;

public class LearnStringBuilder {
    public static void main(String[] args) {
        // StringBuilder首先是可变的
        // 而且对它进行操作的方法,都会返回this的自引用。这样我们就可以一直点下去,对String进行改造
        StringBuilder strBuilder = new StringBuilder();
        long longVal = 123145151;
        strBuilder.append(true).append("abc").append(longVal);
        System.out.println(strBuilder.toString());
        System.out.println(strBuilder.reverse().toString());
        System.out.println(strBuilder.reverse().toString());
        System.out.println(strBuilder.toString());


        System.out.println(strBuilder.delete(0, 5).toString());
        System.out.println(strBuilder.insert(0, "是多少").toString());
    }
}

二、继承

  • 子类继承了父类的方法和属性
  • 使用子类的引用可以调用父类的共有方法
  • 使用子类的引用可以访问父类的共有属性
  • 就好像子类的引用可以一物二用,既可以当做父类的引用使用,又可以当做子类的引用使用

1、Child 

package com.lcy.learn;

// 继承的语法就是在类名后面使用extends加要继承的类名
// 被继承的类叫做父类
// 继承者叫做子类
// java中只允许一个类有一个直接的父类,即所谓的单继承
// 别的类也可以继承子类
// TODO: 子类继承了父类什么呢?所有的属性和方法
// TODO: 但是子类不能访问父类的private的成员(包括方法和属性)
public class Child extends Parent {
    public Child(int age, String name, String hobby) {
        super(age, name, hobby);
    }
}

2、Parent

package com.lcy.learn;

public class Parent {
    private int age;
    private String name;
    public String hobby;

    Parent(int age, String name, String hobby) {
        this.age = age;
        this.name = name;
        this.hobby = hobby;
    }

    public void sayHi () {
        System.out.println(this.name + "说:你好,我是" + this.name + ",我的爱好是" + this.hobby);
    }
}

3、覆盖(多态)

  • 通过使用和父类方法签名一样,返回值也一样的方法,可以让子类覆盖掉父类的方法
  • 子类并不是单纯的把父类的方法拿过来,而是可以通过覆盖的方式形成自己独有的方法
public class Child extends Parent {
    private String grade;
    public Child(int age, String name, String hobby, String grade) {
        super(age, name, hobby);
        this.grade = grade;
    }

    @Override
    public void sayHi() {
        super.sayHi();
        System.out.println("我现在上"+this.grade+"了");
    }
}

super:子类和父类沟通的桥梁,但并不是父类的引用

  • 子类对象里可以有一个特殊的父类的对象,这个父类对象和子类对象之间通过super关键字来沟通。 
  • 使用super可以调用父类的public属性,但是super不是一个引用
  • 使用super调用父类的构造方法,必须是子类构造方法的第一句
  • super调用构造方法,不可以使用super访问父类的属性和方法, 不可以使用子类成员变量和方法,可以使用静态变量和方法

4、父类和子类的引用赋值关系 

  • 可以用子类的引用给父类的引用赋值,也就是说,父类的引用可以指向子类的对象
  • 但不能让子类的引用指向父类的对象。因为父类并没有子类的属性和方法
  • 因为子类继承了父类的方法和属性,所以父类的对象能做到的,子类的对象肯定能做到
  • 父类的引用,可以指向子类的对象,即可以用子类(或者子类的子类)的引用给父类的引用赋值

import com.lcy.learn.Child;
import com.lcy.learn.Parent;

public class Main {
    public static void main(String[] args) {

        // 可以用子类的引用给父类的引用赋值,也就是说,父类的引用可以指向子类的对象
        Child childClassExample = new Child(18, "莉莉", "躺平", "高三");
        Parent parentClassExample = childClassExample;
        Parent parentClassExample1 = new Child(18, "莉莉1", "躺平", "高三");

        // 但不能让子类的引用指向父类的对象。因为父类并没有子类的属性和方法
        // Child errorDefinition = new Parent(18, "莉莉1", "躺平", "高三");

        // 如果确定一个父类的引用指向的对象,实际上就是一个子类的对象(或者子类的子类的对象),可以强制类型转换
        Child parentDefinitionChild = (Child) parentClassExample1;

        // 父类的引用,可以指向子类的对象,即可以用子类(或者子类的子类)的引用给父类的引用赋值
    }
}

三、多态

1、重载总结:静态多态,调用的方法和参数实际指向的对象无关,只和引用本身的类型相关;

2、因为调用时参数类型是确定的,所以,在编译期间就可以明确的知道哪个方法会被调用。如果有多种可能,则会有编译错误;

3、如果没有类型完全匹配的候选,则根据类型的继承关系向下撸着找。找到最贴近参数类型的那个方法;

4、无论是静态方法,还是成员方法,重载寻找方法的顺序是一样的;

5、覆盖:动态多态

四、instanceof操作符

1、instanceof操作符可以判断一个引用指向的对象是否是某一个类型或者其子类,是则返回true,否则返回false

2、null永远返回的是false

五、继承专属的访问控制:protected

1、protected可见性:default + 对子类可见;

2、可以覆盖被protected修饰的属性或方法,但不能让可见性更低;

六、final修饰符

1、用final修饰类:则这个类不可以被继承 

2、用final修饰成员变量:那么这个成员变量不能被修改,只能在构造方法中进行赋值

3、用final修饰静态变量:此静态变量只能被赋值一次,切必须赋值

4、构造方法不能用final修饰

5、用final修饰方法:此方法不可以被子类覆盖

6、用final修饰形参:在方法体中这个形参不能被赋值了

7、用final修饰局部变量:不能被重新赋值,只能被赋值一次,切必须赋值

8、用final修饰引用:一定要赋值,且只能赋值一次,引用内部的非final是可变的

9、用final修饰数组:不能改变数组的引用,但是可以改变数组中的某一项

七、继承里的静态方法 

1、静态方法可以被继承

2、子类可以定义和父类签名一样的方法,但是返回值必须和父类一致

八、Object类

 1、所有的类,都直接或间接的继承于Object类;

九、hashCode和equals方法初探

1、hashCode可以翻译为哈希码,或者散列码。应该是一个表示对象的特征值的int整数

2、equals方法应该用来判断两个对象从逻辑上是否相等 

3、hashCode和equals方法时最常被覆盖的两个方法,覆盖的原则是,equals为true,那么hashCode的值一定相等,这是约定成俗的。即equals位true是hashCode相等的充分非必要条件,hashCode相等时equals为true的必要不充分条件

package com.lcy;

import java.math.BigDecimal;
import java.util.Objects;

public class publicAndPrivate {
    int age = 18;
    private BigDecimal money;
    // 这是一个构造方法
    public publicAndPrivate(BigDecimal money) {
         this.money = money;
         System.out.println("你出生了,你有" + this.money + "元");
    }
    public void makeMoney (BigDecimal money) {
        this.money = this.money.add(money);
        System.out.println("你今天当了一天打工人,你赚了"+money+"元,"+"你现在有"+this.money+"元");
    }
    public void consumption (BigDecimal money) {
        this.money = this.money.subtract(money);
        System.out.println("你今天出去潇洒了一天,你花了"+money+"元,"+"你现在有"+this.money+"元");
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof publicAndPrivate)) return false;
        publicAndPrivate that = (publicAndPrivate) o;
        return age == that.age && Objects.equals(money, that.money);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, money);
    }
}

String的equals方法 

package com.lcy;

import java.util.Scanner;

public class StringEqualsTest {
    public static void main(String[] args) {
        String s1 = "aaabbb";
        String s2 = "aaa" + "bbb";
        // Java对字符串做了优化,如果新创建的字符串在之前已经创建过了,就直接返回这个String的引用
        System.out.println("用==比较S1和S2," + (s1 == s2)); // true
        System.out.println("用equals比较S1和S2," + s1.equals(s2)); // true

        // 打乱Java对String的优化
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入s1");
        s1 = scanner.nextLine();
        System.out.println("请输入s2");
        s2 = scanner.nextLine();
        System.out.println("用==比较S1和S2," + (s1 == s2)); // false
        System.out.println("用equals比较S1和S2," + s1.equals(s2)); // true
    }
}

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

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

相关文章

牛客网算法八股刷题系列(九)训练过程损失函数不下降问题

牛客网算法八股刷题系列——训练过程损失函数不下降问题题目描述正确答案:D\mathcal DD题目解析延伸:训练过程损失函数不下降的其他情况题目描述 在训练神经网络时,损失函数(Loss)(\text{Loss})(Loss)在最初的几个Epoch\text{Epoch}Epoch时没…

delphi 实现Ribbon风格的窗体

随着office2007的兴起,微软让我们看到了Ribbon风格的窗体,现在很多软件也都开始使用Ribbon风格。 那么我们如果要自己开发,应当怎么做呢?本文就是为大家解开这个疑团的。 首先,Delphi本身并没有Ribbon风格的窗口可以直…

epoll为什么用红黑树?

网络编程的时候有没有碰到过 Socket 对象?或者在配置代理的时候,有没有碰到配置 Socket 地址?当你看到服务端 Socket、客户端 Socket 等名词时,是否可以明确理解这些概念? 学习好这些知识有一条主线,就是抓…

Dockerfile构建镜像缓慢解决方案总结

分几种不同的情况,不断更新中 1、Dockerfile apk add 下载更新软件时,比较慢,如何解决 例子如下: 更好一下仓库源 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories或者改成科大的镜像 RUN…

android核心架构Framework组件介绍

作为一个android开发者,核心架构是必须要了解的。只有了解每个核心层的作用,才能更深入的理解和学习。本篇主要讲解Java Framework层核心代码流程。 文章目录一,Android系统架构1.System Apps2.Java Framework3.系统运行库层4.硬件抽象层&…

Matplotlib库的简单用法

Matplotlib库的简单用法 Matplotlib是python科学计算中最基础、最重要的绘图库,是Python中最流行的数据可视化库之一,它提供了大量的绘图函数和工具,可以让用户创建各种类型的图表和图形,一般使用matpltlib完全可以满足我们绘图需…

“成功学大师”杨涛鸣被抓

我是卢松松,点点上面的头像,欢迎关注我哦! 4月15日,号称帮助一百多位草根开上劳斯莱斯,“成功学大师”杨涛鸣机其团队30多人已被刑事拘留,培训课程涉嫌精神传销,警方以诈骗案进行立案调查。 …

基于4412的dm9000驱动移植

1 概述 以太网高速稳定的特性比Wifi无线传输有一定的优势,当无线传输无法满足一些智能设备,需要开发设计以太网模块。Linux支持以太网系统,结合4412开发板,重点学习dm9000驱动的设计与实现。 2 硬件资源分析 2.1 4412开发板以太网…

【Python】Python中的列表,元组,字典

文章目录列表创建列表获取元素修改元素添加元素查找元素删除元素列表拼接遍历列表切片操作元组创建元组元组中的操作字典创建字典添加/修改元素删除元素查找字典的遍历合法的key类型列表 列表是一种批量保存数据的方式,列表使用[]表示 创建列表 创建两个空列表 …

nginx优化及配置

nginx隐藏版本号 查看方法 浏览器F12 看network头部看server curl -i 192.168.232.7 获取头部(查版本号) 配置文件改 添加server_tokens off 改源码 cd /src/core vim nginx.h 修改 修改的IIS为window常用的软件服务 重新编译安装 cd nginx_1.2…

【C++】while 循环应用案例 - 猜数字游戏

目录 1、缘起 2、案例描述 3、代码 4、相关知识点 4.1、rand() 函数 4.2、srand() 函数 5、总结 1、缘起 猜数字游戏是一种简单而又有趣的游戏,在这个游戏中,计算机会生成一个随机数字,玩家需要通过不断猜测来猜出这个数字。在本篇博…

使用docker搭建lnmp环境+redis服务

lnmp搭建过程,前文已经写了传送门,本文主要写一下运行redis容器和php-fpm容器内安装redis扩展 redis 1.创建宿主机配置和数据文件夹 [rootlocalhost ~] mkdir -p /lnmp/redis/{data,conf}2.放置/lnmp/redis/conf/redis.conf文件 点我下载 3.启动容器 …

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

最近在学习边缘计算要用到kubeedge,安装了好多次总会遇到各种各样的问题,因此在这里一一列出,以方便下次安装。则里面可能出错的地方太多,如果有问题,请私信联系。 一、环境准备 节点IP环境软件云端节点172.23.70.23…

Python|矿产卫片Excel经纬度坐标数据转换为shp点数据——OGR库实现

1.实验需求 基于Excel表格里面的经纬度坐标数据,自动生成点shp矢量文件,并添加属性信息。 2.编程思路详解 ①使用Pandas库读取原始矿产图斑列表表格; xlsx_path = uC:\\Users\\YaoJun\\Desktop\\矿产图斑列表.xlsx #sheet_name默认为0,即读取第一个sheet的数据 df = pd.…

TPM管理工作应该如何开展?

在制造行业,Total Productive Maintenance(TPM)管理被广泛认为是提高生产效率和设备可靠性的有效方式。然而,实施TPM管理需要深入的专业知识和经验。本文将探讨如何开展TPM管理工作,以确保制造企业的生产效率和设备可靠…

2023-Python实现烯牛数据采集

文章目录👉1、目标网址👉2、接口分析👉3、代码实现【JS 逆向百例】 1/100 学习记录:哈喽~ 前面我们接触了一些JS逆向的数据获取,如果前面的百度,有道翻译和正方教务系统的登录加密你已掌握,说明…

计组2.4——加法器的设计

计组:2.4算术逻辑单元异或门实现奇偶校验的原理串行加法器&&并行加法器并行加法器的优化算术逻辑单元 控制信号: 当M0时表示算术运算 当M1时表示逻辑运算 S0~ S3表示做什么运算,因此ALU可以表示16种算数运算和16种逻辑运算 Ai,Bi代表…

PL-VINS线特征处理部分源码阅读

PL-VINS线特征处理部分源码阅读1 linefeature_tracker2 三角化单目三角化双目三角化3 后端优化线特征状态量重投影误差本文主要阅读PL-VINS中引入线特征的代码实现,包括线特征表示方法(Plcker参数化方法、正交表示法)、前端线特征提取与匹配、…

遥感、GIS及GPS在土壤空间数据分析、适应性评价、制图及土壤普查中的应用

摸清我国当前土壤质量与完善土壤类型,可以为守住耕地红线、保护生态环境、优化农业生产布局、推进农业高质量发展奠定坚实基础,为此,2022年初国务院印发了《关于开展第三次全国土壤普查的通知》,决定自2022年起开展第三次全国土壤…

微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

一.支付相关文档地址支付wiki:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml支付api: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml开发工具包(SDK)下载:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtm…