【Java基础学习】面向对象编程

开始时间: April 10, 2024
结束时间: April 16, 2024
阶段: Done

基础部分

类与对象的关系

  • 类是抽象的,概念的,代表一类事物
  • 对象是具体的,实际的,代表一个具体事物(实例)
  • 类是对象的模板,对象是类的一个个体,对应一个实例

对象在内存中存在形式

class Cat{
	String name;
	int age;
	String color;
}

// new 的过程:加载类的信息
// 属性信息
// 方法信息
Cat cat = new Cat();
cat.name = "Root";
cat.age = 18;
cat.color = "white";

请添加图片描述

类和对象的内存分配机制

  • 栈: 一般存放基本数据类型(局部变量)
  • 堆: 存放对象(Cat cat , 数组等)
  • 方法区:常量池(常量,比如字符串), 类加载信息

Java 创建对象的流程简单分析

Person p = new Person();
p.name = “jack”;
p.age = 10
  • 先加载 Person 类信息(属性和方法信息, 只会加载一次)
  • 在堆中分配空间, 进行默认初始化(看规则)
  • 地址赋给 p , p 就指向对象
  • 进行指定初始化, 比如 p.name ="jack",p.age = 10

方法的调用机制

1、当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2、当方法执行完毕,或者执行到return语句时,就会返回结果值(void无返回值)
3、回到调用方法的地方
4、继续执行方法后面的代码
5、当 main 方法(栈)执行完毕,整个程序退出

Person peo = new Person();
int res = peo.getSum(10,20);
System.out.println("getSum Method return = " + res);

public int getSum(int num1, int num2){
	int res = num1 + num2;
	return res;
}

请添加图片描述

成员方法传参机制

  • 基本数据类型的传参机制【值拷贝】
  • 引用数据类型的传参机制【地址拷贝】

方法重载【overload】

  • Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致
  • 注意事项和使用细节
    • 方法名:必须相同
    • 形参列表:必须不同(形参类型个数顺序,至少有一样不同,参数名无要求)
    • 返回类型:无要求

可变参数

  • Java 允许将同一个类中多个同名、同功能、参数个数不同的方法,封装成一个方法。通过可变参数实现。
public class Method{
	public static void main(String[] args){
		tool t = new tool();
		System.out.println(t.sum(1,2,3));
	}
}

class tool{
	/**
	 * 访问修饰符 返回类型 方法名(数据类型... 形参名) {}
	 */
	public int sum(int ... nums){
		int res = 0;
		for(int i = 0; i < nums.length; i++){
			res += nums[i];
		}
		return res;
	}
}
  • 注意事项和使用细节
    • 可变参数的实参可以为0个或任意多个
    • 可变参数的实参可以为数组
    • 可变参数的本质就是数组
    • 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
    • 一个形参列表中只能出现一个可变参数

构造方法/构造器【constructor】

  • 主要作用是完成对新对象的初始化
    • 方法名和类名相同
    • 没有返回值
    • 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化

对象创建的流程

class Person{
	int age = 90;
	String name;
	Person(String n, int a){ //构造器
		name = n;
		age = a;
	}
}
Person p = new Person("FOUR_A",18);

流程分析:

  • 加载Person类信息(Person.class),只会加载一次
  • 在堆中分配空间(地址)
  • 完成对象初始化
    • 默认初始化:age = 0 name = null
    • 显式初始化:age = 90,name = null
    • 构造器的初始化:age = 18, name = FOUR_A
  • 对象在堆中的地址返回给p(p是对象名,也可以理解成是对象的引用)

this关键字

  • Java虚拟机会给每个对象分配this,代表当前对象
public class This{
	public static void main(String[] args){
		Dog dog = new Dog("FOUR_A",18);
		dog.info();
	}
}

class Dog{
	public String name;
	public int age;

	// 构造器
	public Dog(String name, int age){
		this.name = name;
		this.age = age;
	}

	public void info(){
		System.out.println("name = " + this.name + "age = " + this.age);
	}
}

请添加图片描述

this 的注意事项和使用细节

  • this 关键字可以用来访问本类的属性、方法、构造器
  • this 用于区分当前类的属性和局部变量
  • 访问成员方法的语法:this.方法名(参数列表);
  • 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一
    条语句)
  • this 不能在类定义的外部使用,只能在类定义的方法中使用

中级部分

IDE快捷键

  • 删除当前行, 默认是 ctrl + Y 自己配置 ctrl + d
  • 复制当前行, 自己配置 ctrl + alt + 向下光标
  • 补全代码alt + /
  • 添加注释和取消注释 ctrl + / 【第一次是添加注释,第二次是取消注释】
  • 导入该行需要的类 先配置 auto import , 然后使用 alt+enter 即可
  • 快速格式化代码 ctrl + alt + L
  • 快速运行程序 自己定义 alt + R
  • 生成构造器等 alt + insert【提高开发效率】
  • 查看一个类的层级关系 ctrl + H[学习继承后,非常有用]
  • 将光标放在一个方法上,输入 ctrl + B , 可以定位到方法 [学继承后,非常有用]
  • 自动的分配变量名 , 通过 在后面假 .var[老师最喜欢的]
  • 模板快捷键

**包的本质:**创建不同的文件夹/自录来保存类文件

包的作用:

  • 区分相同名字的类
  • 当类很多时,可以很好的管理类
  • 控制访问范围

包的命名:com.公司名.项目名.业务模块

访问修饰符

访问修饰符本类同包子类不同包
public✔️✔️✔️✔️
protect✔️✔️✔️
default✔️✔️
private✔️

面向对象编程三大特征

封装【encapsulation】

  • 把抽象出的数据【属性】和对数据的操作【方法】封装在一 起,数据被保护在内部,程序的其它部分只有通过被授权的操作【方法】,才能对数据进行操作。

  • 封装的实现步骤

    • 将属性进行私有化 private 【不能直接修改属性】

    • 提供一个公共的set方法,用于对属性判断并赋值

      // Xxx表示某个属性
      public void setXxx(类型参数名){
      	//加入数据验证的业务逻辑
      	属性=参数名:
      }
      
    • 提供一个公共的(public)get方法,用于获取属性的值

      public dataType getXxx(){ 
      	//权限判断,再返回Xxx某个属性
      	return XX;
      }
      

继承

  • 当两个类的属性和方法有很多是相同的,可以用继承提高代码的复用性

  • 继承的基本语法

    class childClass extends parentClass{}
    
  • 子类就会自动拥有父类定义的属性和方法

  • 父类又叫超类,基类.

  • 子类又叫派生类。

  • 继承的细节问题

    • 子类继承了所有的属性和方法非私有的属性和方法可以在子类直接访问,,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
    • 子类必须调用父类的构造器, 完成父类的初始化
    • 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译
    • 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
    • super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
    • super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
    • java 所有类都是 Object 类的子类, Object 是所有类的基类
    • 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
    • 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制
  • 继承的内存布局

    public class ExtendsTheory{
    	public static void main(String[] args){
    		Son son = new Son();
    	}
    }
    
    class GrandPa{
    	String name = "grandpa";
    	String hobby = "buybuybuy";
    }
    
    class Father extends GrandPa{
    	String name = "father";
    	int age = 38;
    }
    
    class Son extends Father{
    	String name = "son";
    }
    

    请添加图片描述

super 关键字

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

  • super 和 this 的比较

区别点thissuper
访问属性访问本类中的属性,如果本类没有此属性则从父类中继续查找从父类开始查找属性
调用方法访问本类中的方法,如果本类没有此方法则从父类继续查找从父类开始查找方法
调用构造器调用本类构造器,必须放在构造器的首行调用父类构造器,必须放在构造器的首行
特殊表示当前对象子类中访问父类对象

方法重写

  • 方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法
  • 注意事项和使用细节
    • 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。
    • 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
    • 子类方法不能缩小父类方法的访问权限
  • 对方法的重写和重载做一个比较
名称发生范围方法名形参列表返回类型修饰符
重载【overload】本类必须一样类型、个数、顺序 至少 有一个不同无要求无要求
重写【override】父子类必须一样必须一样子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类子类方法不能缩小父类方法的访问权限

多态

  • 方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的

  • 对象的多态

    • 一个对象的编译类型运行类型可以不一致
    • 编译类型在定义对象时,就确定了,不能改变
    • 运行类型可以变化
    • 编译类型看定义时=号的左边,运行类型看=号的右边
    //animal : 编译类型, Dog : 运行类型
    Animal animal = new Dog(); 
    
    //animal 的运行类型变成了 Cat
    animal = new Cat();
    
  • 多态注意事项和细节

    • 多态的前提是:两个对象(类)存在继承关系
    • 多态的向上转型
      • Animal animal = new Cat(); // Cat->Animal
      • 可以调用父类【Animal】中的所有成员(需遵守访问权限)
      • 不能调用子类【Cat】中特有成员
      • 最终运行效果看子类的具体实现
    • 多态向下转型
      • Cat cat =(Cat)animal; // Animal->Cat
      • 只能强转父类【animal】的引用,不能强转父类的对象【Cat()】
      • 要求父类的引用必须指向的是当前目标类型的对象
      • 当向下转型后,可以调用子类类型中所有的成员

Java 的动态绑定机制

  • 当调用对象方法的时候,该方法会和该对象【运行类型】的内存地址/运行类型绑定
  • 当调用对象属性时,没有动态绑定机制,哪里声明,那里使用

Object 类

  • ==equals 的对比
    • ==: 一个比较运算符
      • 既可以判断基本类型,又可以判断引用类型
      • 如果判断基本类型,判断的是是否相等
      • 如果判断引用类型,判断的是地址是否相等
    • equals: Object类中的方法,只能判断引用类型
      • 默认判断的是地址是否相等
      • 子类中会重写该方法,用于判断内容是否相等

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

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

相关文章

基于Springboot+Vue的Java项目-校园管理系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

mysql,oracle,sql server中的默认事务隔离级别查看

一 、事务 一个事务中的一系列的处理操作要么全部成功&#xff0c;要么全部失败。在数据库操作中&#xff0c;一项事务&#xff08;Transaction&#xff09;是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元。 事务的处理结果有两种&#xff1a; 1&#xff09;当…

使用AI动作捕捉制作动画图像——Viggle AI教程

使用AI动作捕捉制作动画图像——Viggle AI教程 在数字媒体时代&#xff0c;动画制作已经成为一种流行的艺术形式。最近&#xff0c;我在网上发现了一个非常有趣的AI动画制作工具——Viggle AI。这个工具不仅简单易用&#xff0c;而且目前还是免费的。在这篇博客中&#xff0c;我…

DHCP小实验

实验要求&#xff1a; 看拓扑有两个网段则我们首先需要对200.1.1.0/26进行子网划分&#xff0c;划分为两个子网&#xff0c;为200.1.1.0/27和200.1.1.32/27 我门就可以一边一个网段了&#xff0c;左边为200.1.1.0/27&#xff0c;右边为200.1.1.32/27 1、配置PC1&#xff0c;2…

腾讯EdgeOne产品测评体验——不仅仅是加速,更是您数字安全的坚实盾牌!

EdgeOne 是什么--- 下一代CDN 腾讯云推出的边缘安全加速平台 EO&#xff08;Tencent cloud EdgeOne&#xff0c;下文简称为 EdgeOne&#xff09; 是基于腾讯边缘计算节点提供加速和安全的解决方案。即对标传统的 CDN 网络分发节点&#xff0c;但是其在加速和安全防护的方面有更…

从建表语句带你学习doris_表索引

1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望&#xff1a;智能化与便利性引领未来 无人零售&#xff0c;这一依靠智能化技术如人工智能、物联网、和大数据的零售模式&#xff0c;正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物&#xff0c;提供了24小时服务&#xff0…

Redis集群机制及一个Redis架构演进实例

Replication&#xff08;主从复制&#xff09; Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。为了实现主从复制&#xff0c;我们准备三个redis服务&#xff0c;依次命名为master&#xff0c;slave1&#xff0c…

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

MySQL 实例employee表综合查询

目录 表关系图&#xff1a; 例题&#xff1a; 1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 2.列出所有员工的姓名及其直接上级的姓名。 3.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 4.列出部门名称和这些部门的员工信…

正五边形C语言绘制方法

正五边形C语言绘制方法 平面几何大家都学过&#xff0c;基本的概念就是点、线、面&#xff0c;三角形、矩形、圆形和椭圆形&#xff0c;还有就是多边形。学几何时都强调用圆规直尺三角板作图&#xff0c;学到角度就用到量角尺。那时我对五角星&#xff0c;六角星很感兴趣。后来…

【攻防世界】lottery

弱比较代码审计 本题已提供源码&#xff0c;如果没提供&#xff0c;输入/robots.txt&#xff0c;发现/.git function buy($req){require_registered();require_min_money(2);$money $_SESSION[money];//接受用户原有money$numbers $req[numbers];//接受输入的数字$win_num…

生产者消费者模型之环形队列

引入 以电影院买票为例 去电影院看电影需要先买票&#xff0c;如果买过票了&#xff0c;哪怕我们没有去看电影&#xff0c;在电影票的有效期内&#xff0c;电影院对应的座位就是属于你的。 买票的本质&#xff1a;对资源&#xff08;座位&#xff09;的预订。 信号量 本质…

【VUE】Vue项目打包报告生成:让性能优化触手可及

Vue项目打包报告生成&#xff1a;让性能优化触手可及 Vue.js是一款流行的前端框架&#xff0c;开发者在使用Vue.js构建项目时&#xff0c;生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源&#xff0c;生成打包报告是一个不可或缺的步骤。本文将介绍几种在…

光纤收发器的注意事项

光纤收发器有各种不同的类别&#xff0c;而实际使用中最受关注的是根据光纤收发器的不同类别&#xff1a;SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时&#xff0c;必须小心使用不同的端口。 1.光纤收发器与100Base TX设备&#xff08;交…

RAKsmart:硅谷裸机云多IP服务器性能评测

在云计算领域&#xff0c;裸机云作为一种结合了传统物理服务器与云计算优势的服务模式&#xff0c;近年来备受关注。硅谷裸机云作为业界佼佼者&#xff0c;以其出色的性能和稳定性赢得了众多用户的青睐。今天&#xff0c;我们就来评测一下硅谷裸机云的多IP服务器性能。 首先&am…

JVM基础第二篇

目录 垃圾回收 如何判断对象可以回收 引用计数法 可达性分析算法 定义 哪些对象可以作为GC roots&#xff1f; 四种引用 1.强引用 2.软引用&#xff08;SoftReference&#xff09; 3. 弱引用&#xff08;WeakReference&#xff09; 4. 虚引用&#xff08;PhantomRefe…

OpenHarmony轻量系统开发【6】驱动之ADC按键

摘要&#xff1a;本文简单介绍如何操作ADC去读取电压&#xff0c;并且实现开发板上3个ADC按键检测的功能 适合群体&#xff1a;适用于润和Hi3861开发板&#xff0c;L0轻量系统驱动开发 文中所有代码仓库&#xff1a;https://gitee.com/qidiyun/hihope-3861-smart-home-kit 6…

FL Studio v21.2.3.4004 中文永久版网盘下载(含Key.reg注册表补丁)

软件介绍 FL Studio21水果编曲软件汉化版是一款专业的音乐制作软件&#xff0c;被广泛地应用于电子音乐、hip-hop、流行乐等多种音乐类型的制作。该软件提供了丰富的音频编曲工具和音乐效果器&#xff0c;让用户可以轻松地创作出高品质的音乐作品。同时&#xff0c;这也是一款…

在比特币中,1 sat 是多少美元?

普通人绝对想不到&#xff0c;比特币能在2024年达到这个价值&#xff0c;早知道的话&#xff0c;我当初就是破釜沉舟也得买一个啊。 而在4月19号&#xff0c;也将迎来比特币再次减半。减半并不是说玩家手中的比特币要被突然减去一半&#xff0c;而是在后续的挖矿过程中&#xf…