面向对象复习(java)

文章目录

    • 在本地 cmd 编译
    • 包规则
    • import(导包)
  • this
    • this 访问实例方法
    • this 访问构造方法
  • super
    • super 访问父类构造器
    • super访问父类方法
    • super 访问父类属性
  • 构造方法
  • 访问权限
  • 封装
  • 继承
    • 细节
    • 方法重写(覆盖)
    • 子父类同名变量问题
    • 关于子父类方法的继承问题
  • 多态
    • 向上转型和向下转型
    • 动态绑定机制
  • IDEA 常用快捷键
  • JVM 体系结构

作用:1. 区分相同名字的类,2. 当类很多时,可以很好管理类,3. 控制访问范围

如果类用了包,类名就是 包 + 类名
包的本质就是文件夹



在本地 cmd 编译

本地使用包,要用 java -d + 编译后存放的目录 + java 源文件路径 ,-d 会自动生成包(文件夹)



包规则

  • 包名命名规范中要求全部小写
  • 包名命名规范:公司域名 + 项目名 + 模块名 + 功能名


import(导包)

假设 main 类在 A 包,Utils 类在 B 包

用到别的包的东西,必须要用 包名 + 类名 访问
因为类名已经变成(类名 + 包名了)

package A;

public class Main {
    public static void main(String[] args) {
       //静态方法:类名(包名+类名).方法名访问
        B.Util.use();
    }
}
package B;

public class Util {
    public static void use() {
        System.out.println("调用到了 B 包下的 use");
    }

}

编译的时候记得两个类都要编译


在同一个包下的话,包名可以省略,如果不在同一个包,想省略,要用 import 导入包

import B.Util(表示可以省略 B)

package A;

//导入 表示导入 B 包里面的 Util(可以省略B)
import B.Util;

public class Main {
    public static void main(String[] args) {
      	//导入 B 包了 所以包名可以省略
        Util.use()
    }
}
package B;

public class Util {
    public static void use() {
        System.out.println("调用到了 B 包下的 use");
    }

}

举几个例子:

import java.lang.System;//表示可以 java.lang.System 类可以省略 java.lang
import java.lang.Math;//表示可以使用 java.lang.Math 可以省略 java.lang
import static java.lang.Math.sin;// static java.lang.Math.sin 可以省略 java.lang.Math
import static java.lang.Math.* //表示 static java.lang.Math 下的所有 方法和变量可以省略 java.lang.Math 
//语法糖
import static java.lang.Math.*;
public class Main {
    public static void main(String[] args) {
        double a = sin(13.1);
    }
}

注意

- java.lang. * 包会系统会自动导入

  • import 语句只能出现在 package 和 class 定义之间
  • import java.util.*:这个 * 表示导入 java.util包下的所有类,这个会浪费元空间




this

  • this 表示对当前对象的引用
  • this 存储在 实例方法帧栈的局部变量表 第 0 个位置
  • 在构造方法中只能出现在第一行
  • static 方法中 不能用 this ,因为帧栈表中没有
  • 可以用来区分当前类的属性和局部变量


this 访问实例方法

this.方法名(参数列表)

public class Test {
    public static void main(String[] args) {
        new A().m1();
    }
}


class A {
    void m1() {
    	//调用 m2
        this.m2();
    }

    void m2() {
        System.out.println("调用到 m2 了");
    }
}


this 访问构造方法

访问构造器语法:this(参数列表); 注意只能在构造器中使用

public class Test {
    public static void main(String[] args) {
        new A();
    }
}


class A {
    int a = 0;

    public A() {
    	//调用另一个构造
        this(10);
    }

    public A(int a) {
        this.a = a;
        System.out.println("调用到另一个构造了");
    }


}



super

super 代表父类的引用,用于访问父类的属性,方法,构造器


  • 访问父类的属性,但是不能访问父类的 private 属性,语法:super.属性名

  • 访问父类的方法,不能访问父类 private 方法,语法:super.方法名(参数列表)

  • 访问父类构造器,语法:super(参数列表),只能放在构造器第一句,只能出现一句

super 访问父类构造器

public class Test {
    public static void main(String[] args) {
        new B(10);
    }
}


class A {
    int a = 10;

    public A(int a) {
        System.out.println("调用了父类构造");
        this.a = a;
    }
}

class B extends A{
    //调用父类构造,在构造本类
    public B(int a) {
        super(a);
    }
}


super访问父类方法

public class Test {
    public static void main(String[] args) {
        new B().sm();
    }
}


class A {
    int a = 10;
    public A(){};

    public void fm() {
        System.out.println("调用到了父类方法");
    }
}

class B extends A{
    //调用父类构造,在构造本类
    public void sm() {
        super.fm();
    }

}

super 访问父类属性

public class Test {
    public static void main(String[] args) {
        new B().sm();
    }
}


class A {
    int a = 10;
    public A(){};

}

class B extends A{

    int a = 20;

    public void sm() {
        //这里输出的是父类的 a
        System.out.println(super.a);
    }

}

如果多个基类(上下类中)都有同名成员,使用 super 访问遵循就近原则,也就是从父类开始一直找到 Object 类



super 和 this 区别
一个是从本类开始找到 Object , 一个是从 父类开始找到 Object




构造方法

  • 一个类可以定义多个不同的构造器,即构造器重载
  • 构造器名要和类名相同
  • 构造器是完成对象的初始化
  • 在创建对象时,系统自动调用该类的无参构造
  • 如果没有构造器就默认调用无参构造,系统会自动生成
  • 如果定义了有参构造,那就不会自动生成无参构造



访问权限

在这里插入图片描述




封装

没有 static 修饰的类中的变量 叫 实例变量
没有 static 修饰的类中的变量 叫 实例方法

封装就是把对象所有 “状态”(属性)”行为“(方法) 统一封装到一个类中,隐藏了对象内部的具体实现细节,向外界提供有限的访问接口,实现对象的保护



代码实现

1. 属性私有化
2. 对外提供public 的 get set 方法

class A {
    private int a;
    private int b;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }
}



继承

当多个类存在相同 属性,方法,从这些类可以抽象出父类,在父类中定义这些相同的属性和方法,所有子类不需要重写定义这些方法,继承就行

java 是单继承机制


细节

  • 除了构造方法和私有的不继承下来,其他都继承下来

  • 子类构造的时候父类一定会先构造,而且默认情况调无参构造,如果没有无参构造,就要用 super 去指定父类哪个构造器,完成初始化工作

  • super() 和 this() 都只能放在构造器第一行,所以,两个方法不能共存在一个构造器

  • 所有类的顶层父类都是 Object 类

  • 用据称必须满足 is-a(泛化关系) ,例如 Cat is Animal


方法重写(覆盖)

发生覆盖的条件

  • 具有继承关系
  • 相同的返回值类型,相同的方法名,相同的形参列表
  • 访问权限不能变低,可以变高 (public protected, 默认,private【最低】)
  • 抛出异常不能变多,可以变少
  • 返回值类型可以是父类方法返回值类型的子类
  • 方法覆盖说的是实例方法,和实例变量无关


子父类同名变量问题

public class Test {
    public static void main(String[] args) {
        new B().test();
    }
}


class A {
    int a;
}

class B extends A{
    int a = 10;

    public void test() {
        //调用父类 a
        System.out.println(super.a);
        //调用当前类 a
        System.out.println(this.a);
        System.out.println(a);
    }
}


关于子父类方法的继承问题

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

        // test 方法继承到 B 但是返回的还是 父类的 a
        // 因为这个方法的源头就是 a,通过虚函数表传承了
        // 除非是重写了 test 方法
        System.out.println(new B().test());
    }
}


class A {
    int a;

    public int test() {
        return a;
    }
}

class B extends A{
    int a = 10;
}



多态

降低耦合度,提高程序过程


向上转型和向下转型

向上转型

父类引用指向子类对象
编译类型看左边,允许类型看右边

public class Test {
    public static void main(String[] args) {
        //向上转型
        father f = new Son();
    }
}


class father{
    
}

class Son extends father {
    
}

编译类型决定了,能调用哪些东西,也就是子类独有的就用不了了需要向下转型,才能访问

运行时:先找本类,如果有则调用,如果没有则找父类,再没有就父类的父类


向下转型

强制转换成子类类型

public class Test {
    public static void main(String[] args) {
        //向上转型
        father f = new Son();
        //向下转型
        Son s = (Son) f;
    }
}


class father{

}

class Son extends father {

}

向下转型后,可以调用子类类型中所有的成员



动态绑定机制

  1. 当调用对象方法时,该方法会和该对象的运行类型绑定
  2. 当调用读写属性时候,没有动态绑定机制,哪里声明,哪里使用

属性直接访问看编译类型,如果是在函数里面就哪里声明用哪里的无动态绑定机制

举例

public class Test {
    public static void main(String[] args) {
        //向上转型
        father f = new Son();
        //返回 10,因为父类声明了,就用父类的
        f.fm(); 
    }
}


class father{
    
    int a = 10;
    
    public int fm() {
        return a;
    }

}

class Son extends father {
    int a = 11;
}



IDEA 常用快捷键

  • 切换选项卡:alt + 左右方向键
  • 自动是生成变量:.var
  • 删除一行:ctrl + y
  • 查找某个类:敲两次 shift
  • for 快捷键:for+变量名
  • 在一个类中寻找方法 ctrl + F12
  • 单行注释: ctrl + /
  • 多行注释: ctrl + shift + /
  • 多行编辑:按 alt 别松手,鼠标拖动多行,完成多行编辑
  • 查看源码:按 ctrl 别松手,鼠标移动到对应的类名下,出现下划线,点进去
  • 快速向下转型并生成变量名:变量名.castvar



JVM 体系结构

在这里插入图片描述


这只是规范,想要如何设置还是看实现

在这里插入图片描述

符号引用:类名, 属性名,方法名
本地方法栈:有 native 的方法就往这里压


在这里插入图片描述



Hotpot 实现

JDK 6

在这里插入图片描述
在这里插入图片描述


JDK7

在这里插入图片描述


JDK8以后
在这里插入图片描述


程序运行

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长

今天,很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”?初创公司的创始人为何需要重视这个策略?这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环&#xff08…

NV-Embed论文阅读笔记

这是NVIDIA的一篇论文,LLM通常使用的是GPT的decoder范式作为一个生成模型,文章探讨如何利用这样的decoder生成模型来实现BERT这样的encoder的功能,即提取有效的embedding。现有的方法提取embedding的方式无非是 1 mean pooling; 2…

算法竞赛数论杂题

menji 和 gcd 题目: 一开始以为是只有l不确定,r是确定的,这样的话我们可以枚举r的所有约数,然后对其每个约数x进行判断,判断是否满足题意,具体做法是先让l % x如果 0则该约数可行,如果不可行…

蚓链数字化生态平台,开启企业未来新篇章!

在如今数字化浪潮势不可挡的时代,企业发展可谓是机遇与挑战并存!而蚓链数字化生态平台系统的出现,绝非是给企业一套平平无奇的营销方案或工具那么简单。 它赋予企业的,是在产业生态链中获取海量数据价值的关键且强大的能力&#x…

嵌入式linux系统中SPI子系统验证03

今天主要给大家分享一下,如何使用SPI总线进行验证的方法。 第一:SPI验证流程 1. echo 1 > /dev / spidev3.0 2.逻辑分析仪抓波形 3.十六进指转化为十进制 4.ASCII字符代码表匹配 第二:SPI验证结果 第三:设备…

kotlin函数

1、函数定义 // 下边定义了main函数 fun main() {} 2、函数的类型 // foo函数定义 fun foo () {} // 对应无参类型 () -> Unit fun foo (a: Int):String {} // 对应有参类型 (Int) -> String 3、函数的引用 函数的引用类似C语言中的函数指针,可用于函数传…

鸿蒙HarmonyOS实战:渲染控制、路由案例

条件渲染 简单来说,就是动态控制组件的显示与隐藏,类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中,数据一般是后端返回来的对象格式,对此我们需要进行遍历&#…

图解Linux内核(基于6.x):解读Linux内存反向映射之匿名映射

文章目录 📑前言一、匿名映射的mapping二、推荐阅读2.1 一图速览2.2 内容简介 📑前言 内存映射中,我们经常讨论的是由虚拟内存定位物理内存(也就是folio或者page),实际上在很多场景中(比如内存回…

【C语言】C语言入门宝典:核心概念全解析

. C语言专栏 | C专栏 👉 个人主页 👈 前言 此篇文章我们主要是宏观的了解一下什么是C语言,C语言里面有那些知识点,所有的知识点我们此篇只是以入门为主,点到为止,简单易懂,后期的文章会一 一详…

【APP_PDD】数据采集案例拼多多APP_抓包分析_①

那远山呼唤我 曾千百次路过 半山腰摘几朵 便飘向歌颂者 那份简单 离开后 就再也没见过 单程票的火车 一路上哼着歌 🎵 王睿卓/Damn5z《重生之我在异乡为异客》 使用charles抓包 操作app后发现,刚打开app时可以抓到零散的数据包&am…

京东h5st4.73

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! lianxi a15018601872 …

Vue CLI,Vue Router,Vuex

前言 Vue CLI、Vue Router 和 Vuex 都是 Vue.js 生态系统中的重要组成部分,它们在构建 Vue 应用程序时扮演着关键角色。 Vue CLI Vue CLI 介绍 Vue CLI 是 Vue.js 的官方命令行工具,用于快速搭建 Vue.js 项目。它提供了一个图形界面(通过…

C语言练习01-循环

一、打印五行五列的三角形 如下图&#xff1a; #include<stdio.h>int main() {for (int i 1;i < 5; i){for (int j i; j < 5; j){printf("*");}printf("\n");}return 0; }#include<stdio.h>int main() {for (int i 1;i < 5; i){f…

MATLAB直方图有关函数的关系

histogram Histogram plot画直方图 histcounts 直方图 bin 计数 histcounts是histogram的主要计算函数。 discretize 将数据划分为 bin 或类别 histogram2 画二元直方图 histcounts2 二元直方图 bin 计数 hist和histc过时了。替换不建议使用的 hist 和 histc 实例 hist → \r…

18个机器学习核心算法模型总结

最强总结&#xff01;18个机器学习核心算法模型&#xff01;&#xff01; 大家好~ 在学习机器学习之后&#xff0c;你认为最重要的算法模型有哪些&#xff1f; 今儿的内容涉及到~ 线性回归逻辑回归决策树支持向量机朴素贝叶斯K近邻算法聚类算法神经网络集成方法降维算法主成…

【因果推断python】44_评估因果模型2

目录 累积弹性曲线 累积增益曲线 考虑差异 关键思想 累积弹性曲线 再次考虑将价格转换为二元处理的说明性示例。我们会从我们离开的地方拿走它&#xff0c;所以我们有弹性处理带。我们接下来可以做的是根据乐队的敏感程度对乐队进行排序。也就是说&#xff0c;我们把最敏感…

day13 二叉树的遍历

一、二叉树的递归遍历 题目链接&#xff1a; 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历 文章讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E…

苍穹外卖---编辑员工(P27-P29)

一、需求分析与设计 &#xff08;1&#xff09;产品原型 在员工管理列表页面点击 "编辑" 按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击 "保存" 按钮完成编辑操作。 员工列表原型&#xff1a; 修改…

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系(m_coord)

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系&#xff08;m_coord&#xff09; 0. 引言1. m_proj使用方法2. 结语 0. 引言 上一篇介绍了m_proj函数用于初始化投影&#xff0c;本篇介绍的函数m_coord用于初始化地理坐标系或地磁坐标系&#xff0c;地理/地磁坐标系和投影…

数学建模----单源最短路径模型建立和求解

目录 1.引言和声明 2.单源最短路径 3.建立模型 4.代码求解 1.引言和声明 &#xff08;1&#xff09;最近又在准备学习matlab,有了一些新的理解和体会&#xff0c;记录一下&#xff1b; &#xff08;2&#xff09;这个首先要声明两个符号&#xff0c;这两个符号也是今天才知…