Java基础08:面向对象进阶(上)

news2024/11/16 5:30:58

Java基础08:面向对象进阶(上)

  • 一、static
    • 1. 静态变量
    • 2. 静态方法
    • 3. 工具类
    • 4. static注意事项
    • 5. 重新认识main方法
  • 二、继承
    • 1. 继承的概念
    • 2. 继承的特点
    • 3. 继承中访问成员变量
    • 4. 继承中访问成员方法(方法重写)
    • 5. 继承中访问构造方法
  • 三、多态
    • 1. 多态的概念
      • a. 多态的优势和弊端
      • b. 类型转换
      • c. 多态举例
    • 2. 多态调用成员的特点
  • 四、包、final、权限修饰符、代码块
    • 1. 包
    • 2. final
      • a. 常量
    • 3. 权限修饰符
    • 4. 代码块

一、static

  • static表示静态,是java中的一个修饰符,可以修饰成员方法、成员变量。

1. 静态变量

  • 被static修饰的成员变量,叫做静态变量。
    在这里插入图片描述

  • 特点

    • 被该类所有对象共享;
    • 不属于对象,属于类;
    • 随着类的加载而加载,优先于对象存在。
  • 调用方法

    • 类名调用(推荐)
      在这里插入图片描述

    • 对象名调用

2. 静态方法

  • 特点
    • 多用在测试类和工具类中
    • JavaBean类中很少使用
  • 调用方式
    • 类名调用(推荐)
    • 对象名调用

3. 工具类

  • static多用于工具类中。
  • 特点
    • 类名见名知意
    • 私有化构造方法
    • 方法定义为静态
描述
JavaBean类用来描述一类事物的类。比如Student、Cat等
测试类用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类帮助我们做一些事情,但是不描述任何事物的类

4. static注意事项

  1. 静态方法只能访问静态变量和静态方法。
  2. 非静态方法可以访问静态变量或静态方法,也可以访问非静态的成员变量和非静态的成员方法。
  3. 静态方法中没有this关键字。

概括:
静态方法中,只能访问静态。
非静态方法可以访问所有。
静态方法没有this关键字。

5. 重新认识main方法

public class HelloWorld {
	public static void main(String[] args){
		...
	}
}
  • public : 被JVM调用,访问权限足够大。
  • static : 被JVM调用,不用创建对象,直接类名访问。因为main方法是静态的,所以测试类中其他方法也需要是静态的。
  • void : 被JVM调用,不需要给JVM返回值。
  • main : 一个通用的名称,虽然不是关键字,但是被JVM识别。
  • String [] args : 以前用于接受键盘录入数据,现在没用。

二、继承

1. 继承的概念

  • 继承是面向对象三大特征之一,可以让类与类之间产生父子关系。
  • 当类与类之间,存在相同的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码。
  • 继承的格式:
    public class 子类 extends 父类 {}
    

2. 继承的特点

  • Java只支持单继承,不支持多继承,但支持多层继承。
  • 每一个类都直接或间接的继承于Object。
  • 子类只能访问父类中非私有的成员。

3. 继承中访问成员变量

  • this调用:就近原则。
  • super调用:直接找父类。
System.out.println(name);  // 从局部位置开始往上找
System.out.println(this.name);  // 从本类成员位置开始往上找
System.out.println(super.name);  // 从父类成员位置开始往上找

4. 继承中访问成员方法(方法重写)

  • 方法的概念:
    在继承体系中,子类出现了和父类中一模一样的方法声明,就称自类的这个方法是重写的方法。
  • 在重写方法时都加上@Override注解,代码安全。
  • 子类重写的方法尽量和父类的方法保持一致
  • 只有虚方法表里面的方法可以被重写。

5. 继承中访问构造方法

  • 子类不能继承父类的构造方法,但是可以通过super调用。
  • 自类构造方法的第一行,有一个默认的super():
  • 默认先访问父类中无参的构造方法,再执行自己。
  • 如果想要调用父类有参构造,必须手动书写。

三、多态

1. 多态的概念

  • 意思是对象的多种形态。
  • 多态的前提
    • 有继承/实现关系
    • 有父类引用指向子类对象
    • 有方法的重写

a. 多态的优势和弊端

  • 多态的好处
    • 在多态形式下,对象可以实现解耦合,便于扩展和维护。
    • 使用父类型作为参数,可以接受所有子类对象。体现多态的扩展性和便利。
  • 多态的弊端
    • 不能使用子类的特有功能。

b. 类型转换

  • 自动类型转换 Person p = new Student();
  • 强制类型转换 Student s = (Student)p;
  • 强制类型转换能解决什么问题:
    • 可以转换成真正的子类类型,从而调用子类独有功能。
    • 转换类型与真实对象类型不一致会报错。
    • 转换的时候用instanceof关键字进行判断。

c. 多态举例

人类

package day13.polymorphismDemo1;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show(){
        System.out.println(name + ", " + age);
    }
}

学生类,重写父类的show方法。

package day13.polymorphismDemo1;

public class Student extends Person {
    @Override
    public void show() {
        System.out.println("学生的信息为:" + getName() + ", " + getAge());
    }
}

教师类,重写父类的show方法。

package day13.polymorphismDemo1;

public class Teacher extends Person {
    @Override
    public void show() {
        System.out.println("老师的信息为:" + getName() + ", " + getAge());
    }
}

测试类,用父类作为参数接收学生类和教师类。

package day13.polymorphismDemo1;

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("zhangsan");
        student.setAge(12);

        Teacher teacher = new Teacher();
        teacher.setName("lisi");
        teacher.setAge(14);

        register(student);
        register(teacher);
    }

    public static void register(Person person) {
        person.show();
    }
}

输出结果
在这里插入图片描述

2. 多态调用成员的特点

  • 变量调用:编译看左边,运行也看左边,
  • 方法调用:编译看左边,运行看右边。
// 多态方式创建对象
Animal animal = new Dog();

// 成员变量
// 编译时,如果左边的父类(Animal)中没有name变量,则编译失败
// 运行时,实际获取的是父类(Animal)中name的值
sout(animal.name);

// 成员方法
// 编译时,如果左边的父类中(Animal)中没有show方法,则编译失败
// 运行时,实际调用的是右边子类(Dog)中的show方法【重写】
animal.show();

四、包、final、权限修饰符、代码块

1. 包

  • 包的作用:
    • 包就是文件夹,用来管理各种不同功能的Java类。
  • 包名书写规则:
    • 域名反写+包的作用
    • 需要全部小写,见名知意
  • 全类名:
    • 包名 + 类名
  • 什么时候需要导包?
    • 使用同一个包中的类时,不需要导包。
    • 使用java.lang包中的类时,不需要导包。
    • 其他情况都需要导包
    • 如果同时使用两个包中的同类名,需要用全类名。
package day13.apackage.demo1;

import day13.apackage.demo2.Teacher;

public class Test {
    public static void main(String[] args) {
        Student student = new Student();  // 同一个包中的类
        String s = "";  // java.lang
        
        // 其他包的类需要导包,相同包名用全类名
        Teacher teacher = new Teacher();  
        day13.apackage.demo3.Teacher teacher1 = new day13.apackage.demo3.Teacher();  
    }
}

2. final

  • final 修饰方法:表明该方法是最终方法,不能被重写。
  • final 修饰类:表明该类是最终类,不能被 继承。
  • final 修饰变量:叫做常量,只能被赋值一次。

a. 常量

  • 常量一般作为系统的配置信息,方便维护,提高可读性。
  • 命名规范:单词全部大写,单词之间用下划线隔开 。
  • 基本类型常量:数据值不能改变。
  • 引用类型常量:地址值不能改变,对象内部的可以改变。

3. 权限修饰符

  • 用来控制一个成员能够被访问的范围。
  • 可以修饰成员变量、方法、构造方法、内部类。
  • 分类:有四种作用范围由小到大(private<空着不写<protected<public)
修饰符同一个类中同一个包中其他类不同包下的子类不同包下的无关类
private
空着不写
protected
public
  • 实际开发中,一般只用private和public
    • 成员变量私有
    • 方法公开
    • 如果方法中的代码是抽取其他方法里共性代码,这个方法一般也私有。

4. 代码块

  • 代码块分类:局部代码块、构造代码块、静态代码块。
  • 局部代码块:提前结束变量的生命周期(已淘汰)。
  • 构造代码块(不够灵活):
    • 写在成员位置;
    • 可以把多个构造方法中重复的代码抽取出来;
    • 构造代码块优先于构造方法执行。
  • 静态代码块(重点):
    • 格式:static {}
    • 特点:随着类的加载而加载,并且自动触发,只执行一次
    • 使用场景:数据初始化。

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

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

相关文章

给大家准备了程序员专属红包封面,审核通过后我哭了,太心酸了(┬_┬)

大家好&#xff0c;我是小悟 今天就是除夕了&#xff0c;也就是大年三十&#xff0c;小伙伴们应该都回家了吧&#xff0c;小悟祝大家新年快乐&#xff0c;身体健康&#xff0c;万事如意&#xff0c;兔飞猛进哦。 春节临近&#xff0c;收到微信定制红包封面并送了四千个名额的…

【深度学习】详解 MoCo

目录 摘要 一、引言 二、相关工作 三、方法 3.1 Contrastive Learning as Dictionary Look-up 3.2 Momentum Contrast 3.3 Pretext Task 四、实验 4.1 Linear Classification Protocol 总结 ☆ 实现 参考资料 Title&#xff1a;Momentum Contrast for Unsupervised…

AlmaLinux 9 安装Kasm Workspaces

今天尝试一下AlmaLinux 9 安装Kasm Workspaces。 前提条件 安装了Docker和Docker Compose&#xff0c;已经最新版本要求&#xff0c; docker 18.06 docker compose 2.1.1 创建一个Swap分区 下面的步骤将创建一个2千兆字节&#xff08;2048MB&#xff09;的交换分区。请根据…

我的创作纪念日——“永远相信美好的事情即将发生”

作者&#xff1a;非妃是公主 专栏&#xff1a;《程序人生》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录序与CSDN的往事机缘收获憧憬碎碎念序 第一次写创作纪念日的文章&#xff01;哈哈哈哈&#xff0c;今…

一起自学SLAM算法:7.5 基于因子图的状态估计

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 虽然式&#xff08;7-90&#xff09;所示的完全SLAM系统可以用滤波方法求解&#xff0c;比如著名的Fast-SLAM实现框架。但是&#xff0c;贝叶斯网络表示下的完全SLAM系统能很方面地转换成因子图表示&#xff0c;…

字符串匹配: BF与KMP算法

文章目录一. BF算法1. 算法思想2. 代码实现二. KMP算法1. 算法思想概述2. 理解基于最长相等前后缀进行匹配3. 代码中如何实现next数组5. 代码实现6. next数组的优化一. BF算法 1. 算法思想 BF 算法, 即暴力(Brute Force)算法, 是普通的模式匹配算法, 假设现在我们面临这样一个…

24/365 java 观测线程状态 线程优先级

1.观测线程 JDK中定义的线程的六个状态 &#xff1a; 可以用getState()来观测线程 public static void main(String[] args) throws InterruptedException {Thread thread new Thread(()->{for (int i 0; i < 10; i) {try {Thread.sleep(100);} catch (InterruptedExc…

2023适合新手的免费编曲软件FL Studio水果21中文版

水果软件即FL Studio&#xff0c;这是一款较为专业的编曲软件&#xff0c;这款软件自带高品质打击乐、钢琴、弦乐以及吉他等107种乐器效果&#xff0c;内置了包括经典电子音色、合成利器3xosc、sytrus、slicex等多种插件&#xff0c;可以帮助音乐制作人创作不同的音乐曲风&…

数据结构进阶 哈希表

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;模拟实现高阶数据结构 哈希表 哈希表 哈希桶哈希概念举例哈希冲突哈希函数哈希冲突的解决方式之一闭散列 --开放定址法哈希表的…

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程

文章目录CalmAn简介安装要求我的设备1>CalmAn压缩包解压&#xff08;caiman文件夹要改名&#xff09;2>conda创建虚拟环境3>requirements依赖包配置&#xff08;包括tensorflow&#xff09;4>caiman安装(mamba install)5>caimanmanager.py install6>PyCharm添…

51单片机独立按键

文章目录前言一、按键原理图二、代码编写三、模块化管理按键总结前言 本篇文章将带大家学习独立按键按键的基本操作。 独立按键式直接用I/O口线构成的单个按键电路&#xff0c;其特点是每个按键单独占用一根I/O口线&#xff0c;每个按键的工作不会影响其他I/O口线的状态。 一…

MongoDB学习笔记【part5】基于 MongoRepository 开发CURD

一、MongoRepository Spring Data 提供了对 mongodb 数据访问的支持&#xff0c;只需继承 MongoRepository 类&#xff0c;并按照 Spring Data 规范就可以实现对 mongodb 的操作。 SpringData 方法定义规范&#xff1a; 注意事项&#xff1a; 不能随便声明&#xff0c;必须要…

汇编语言学习笔记 下

本文承接汇编语言学习笔记 上 上篇文章记录了汇编语言寄存器&#xff0c;汇编语言基本组成部分&#xff0c;数据传送指令&#xff0c;寻址指令&#xff0c;加减法指令&#xff0c;堆栈&#xff0c;过程&#xff0c;条件处理&#xff0c;整数运算的内容 高级过程 大多数现代编程…

day24-网络编程02

1.NIO 1.1 NIO通道客户端【应用】 客户端实现步骤 打开通道指定IP和端口号写出数据释放资源 示例代码 public class NIOClient {public static void main(String[] args) throws IOException {//1.打开通道SocketChannel socketChannel SocketChannel.open();//2.指定IP和端…

你是真的“C”——2023年除夕夜 牛客网刷题经验分享~

2023年除夕夜 牛客网刷题经验分享~&#x1f60e;前言&#x1f64c;BC89 包含数字9的数 &#x1f60a;BC90 小乐乐算多少人被请家长 &#x1f60a;BC91 水仙花数 &#x1f60a;BC92 变种水仙花 &#x1f60a;BC93 公务员面试 &#x1f60a;总结撒花&#x1f49e;&#x1f60e;博…

Android Studio 支持安卓手机投屏

有时当我们在线上做技术分享或者功能演示时&#xff0c;希望共享连接中的手机屏幕&#xff0c;此时我们会求助 ApowerMirror&#xff0c;LetsView&#xff0c;Vysor&#xff0c;Scrcpy 等工具。如果你是一个 Android Developer&#xff0c;那么现在你有了更好的选择。 Android…

Day59| 503. 下一个更大元素 II | 42. 接雨水 --三种方法:1.双指针 2.动态规划 3.单调栈

503. 下一个更大元素 II注意点&#xff1a;初始化了2倍的题目中的nums.size()&#xff0c;最后直接/2即可分清逻辑nums[i] > nums[st.top()]的时候&#xff0c;才进行st.pop()操作class Solution { public:vector<int> nextGreaterElements(vector<int>& nu…

STM32——独立看门狗

目录 看门狗产生背景 看门狗的作用 STM32 独立看门狗 独立看门狗特点 &#xff08;IWDG&#xff09; 独立看门狗常用寄存器 独立看门狗超时时间计算 独立看门狗工作原理 独立看门狗操作库函数 看门狗产生背景 当单片机的工作受到来自外界电磁场的干扰&#xff0c;造…

bert-bilstm-crf提升NER模型效果的方法

1.统一训练监控指标和评估指标评估一个模型的最佳指标是在实体级别计算它的F1值&#xff0c;而不是token级别计算它的的准确率&#xff09;。自定义一个f1值的训练监控指标传给回调函数PreliminaryTP&#xff1a;实际为P&#xff0c;预测为PTN&#xff1a;实际为N&#xff0c;预…

【Java IO流】缓冲流及原理详解

文章目录前言字节缓冲流原理字符缓冲流Java编程基础教程系列前言 前面我们已经学习了四种对文件数据操作的基本流&#xff0c;字节输入流&#xff0c;字节输出流&#xff0c;字符输入流&#xff0c;字符输出流。为了提高其数据的读写效率&#xff0c;Java中又定义了四种缓冲流…