面向对象复习(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() {//调用 m2this.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() {//这里输出的是父类的 aSystem.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() {//调用父类 aSystem.out.println(super.a);//调用当前类 aSystem.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以后
在这里插入图片描述


程序运行

在这里插入图片描述

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

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

相关文章

Ubuntu安装Vins-Fusion(1) —— Ubuntu18.04安装vins

目录 前言 1、准备1.1 安装ROS1.2 安装 Ceres Solver 2、安装 VINS-Fusion3、测试(EuRoC MAV 数据集)3.1、下载数据集3.2 Monocualr camera IMU3.3 Stereo cameras IMU3.4 Stereo cameras 参考 前言 VINS-Fusion 是一种基于优化的多传感器状态估计器&…

Python接口测试实战之搭建自动化测试框架

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一.数据分离:从Excel中读取数据 之前的用例中,数据直接写在代码文件里,不…

C++初学者指南第一步---7.控制流(基础)

C初学者指南第一步—7.控制流(基础) 文章目录 C初学者指南第一步---7.控制流(基础)1.术语:表达式/语句Expressions表达式Statements语句 2.条件分支3.Switching(切换):基于值的分支4.三元条件运算符5.循环迭代基于范围的循环   C…

Java基础 - 练习(三)打印空心菱形

Java基础练习 打印空心菱形&#xff0c;先上代码&#xff1a; public static void diamond() {//控制行数for (int i 1; i < 4; i) {//空格的个数for (int k 1; k < 4 - i; k) {System.out.print(" ");}//控制星星个数的时候和行有关for (int j 1; j <…

linux配置Vnc Server给Windows连接

1. linux 安装必要vnc server和桌面组件 sudo apt -y install tightvncserversudo apt install xfce4 xfce4-goodies2. linux 配置vncserver密码 #bash vncserver参考: https://cn.linux-console.net/?p21846#google_vignette 3. 将启动桌面命令写入.vnc/xstartup # .vnc/x…

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害&#xff0c;以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1&#xff1a;协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…

【YOLOv10改进[注意力]】添加注意力CascadedGroupAttention(2023) + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

本文将进行使用注意力CascadedGroupAttention的实践,助力YOLOv10目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后的参数对比: 目录 一 CascadedGroupAttention 二 使用注意力CascadedGroupAttention 1 整体…

KVB投资安全小知识:你知道情绪面、技术面与基本面的关系吗?

摘要&#xff1a;当涉及到金融市场分析时&#xff0c;情绪面、技术面和基本面是三个重要的方面。它们相互交织&#xff0c;共同影响着市场的走势和投资者的决策。下面我来详细解释它们之间的关系。 情绪面的影响 情绪面指的是投资者情绪和市场情绪&#xff0c;它反映了市场参与…

springboot+vue+mybatis酒店管理系统+PPT+论文+讲解+售后

基于Spring框架的小型宾馆旅客信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户二部分&#xff0c;管理员&#xff1a;首页、个人中心、用户管理、客房类型管理、客房信息管理、客房预订管理、入住登记管理、退房评价管理、系统管理&a…

Qt6之调色板QPaletee

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言Qt之调色板 QPalette什么是 QPalette&#xff1f;QPalette 的作用如何使用 QPaletteQPalette可设置的部分常规操作示例代码和运行效果图 总结 前言 在开发 Qt …

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

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

Servlet实践操作

Servlet运行原理 Tomcat 的代码内置了 main 方法&#xff0c;当我们启动 Tomcat 的时候&#xff0c;就是从 Tomcat 的 main 方法开始执行的 被 WebServlet 注解修饰的类会在 Tomcat 启动的时候就被获取并集中管理 Tomcat 通过反射这样的语法机制来创建被 WebServlet 注解修饰…

PCB设计隐藏的陷进

1、BGA芯片的开窗和过油设计。 加工工艺中&#xff0c;范式过孔都需要盖油设计&#xff0c;实心焊盘需要开窗设计&#xff0c;坚决不能盖油。 2、通孔设计的互联连通性 比如H3芯片的wifi设计&#xff0c;实际上是没有联通的&#xff0c;虽然四层板的中间层有焊盘&#xff0c;但…

【FreeRTOS】估算栈的大小

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 目录 估算栈的大小回顾简介计算说明估计函数用到的栈有多大合计 估算栈的大小 回顾 上一篇文章链接&#xff1a;http://t.csdnimg.cn/Cc8b4 传送门: 上一篇文章 上一篇文章创建的三个任务 /* 创建任务&#xff1a;声 *…

LabVIEW开发为何仿制(致敬)经典成熟软件

​仿制&#xff08;致敬&#xff09;成熟软件进行LabVIEW开发更方便&#xff0c;因其提供了稳定的架构和结构、优化的用户体验和界面设计、技术规范和标准、稳定性和可靠性。结合用户手册和现有操作进行仿制&#xff0c;就像小米致敬保时捷一样&#xff0c;可以提高开发效率、降…

vivado SITE

描述 SITE是一个设备对象&#xff0c;表示许多不同类型的逻辑资源之一 可在目标Xilinx FPGA上获得。 SITE包括SLICE/CLB&#xff0c;它们是基本逻辑元件&#xff08;BEL&#xff09;的集合&#xff0c;如 查找表&#xff08;LUT&#xff09;、触发器、多路复用器&#xff0c;携…

QT/基于TCP的服务端实现

代码 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),p(new QTcpServer(this))//给服务器指针申请空间 {ui->setupUi(this); }Widget::~Widget() {delete ui; }void W…

实测:三款垃圾CPU推理Llama3 8B

经常有一些朋友问我本地运行大模型的电脑需要什么样的配置。其实一些常用大模型的运行需要的硬件并不像我们想象的那样高不可攀。不要被那些复杂的技术术语所吓倒&#xff0c;关键在于亲自动手尝试。 “不试&#xff0c;怎么知道呢&#xff1f;” 这句话道出了真理。今天&#…

【Linux】基础IO_1

文章目录 六、基础IO1. C语言的文件接口2. 系统文件I/O 未完待续 六、基础IO 1. C语言的文件接口 我们知道 文件 文件内容 文件属性 。即使是一个空文件&#xff0c;仍然会在磁盘中占据空间。那打开文件是什么意思呢&#xff1f;其实文件打开的意思就是&#xff1a;将文件从…

力扣每日一题 6/19 排序+动态规划

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2713.矩阵中严格递增的单元格数【困难】 题目&#xff1a; 给你一个下标从…