Java之类和对象

news2024/11/24 1:39:09

一、类和对象

C++和Java都是面向对象编程的语言,而C和Go是面向过程编程的语言.

主要概述一下面向对象编程,也就是op.在面向对象的世界中,一切皆对象.解决问题的途径主要是靠对象之间的交互去完成.

类的模板

类就是对一种事物的概述,比如说猫类,狗类,人类等等,在这些类中,有成员变量和成员方法.变量主要是表示这类中性质的定义,方法则是对这类中行为的概述.

class  类名{
     //成员属性

     //成员方法
}

类的实例化-------对象         

有了类之后,就应该去实例化一个类,称之为对象,而对象就是实实在在的存在的事物,因此对象也成为类的实例化.比如名为王三的这个人,就是由人类实例化出来的.例如:

//定义了人类,里面可以有姓名,年龄,性别等等
class Person{
   String name;
   public void getName(String name){
        this.name=name;
   }
}


public class Main{
   public void static void main(String[] args){
        Person person = new Person('王三')//实例化了一个对象
   }
}

在实例化的过程中,使用new去创建一个对象

使用 . 来访问对象中的成员属性和方法

同一个类可以实例化多个对象,毕竟不可能只有人类中只有一个人吧.

成员变量和局部变量

成员变量:类的内部,方法的外部就是成员变量,成员变量有默认值,当然也可以在定义变量时赋值,不过这个看你未来的项目需求,一般没什么用,其生命周期是从对象创建时开始,到对象销毁就结束.

局部变量:方法内部,无默认值,进入方法创建,出方法结束.

构造方法

构造方法是一种特殊的成员方法,对成员中的成员属性进行赋值的方法.

其方法名和类名一致,没有返回值,在上面的人类中的方法就是一个构造方法.

如果类中没有写构造方法,那么会存在一个隐藏的无参构造方法,但是一旦存在一个构造方法,那么将不会存在任何的构造方法.

如果有多个构造方法,那么就构成重载.对于重载,也就是方法名必须相同,参数列表可以不同,返回值不做要求.因此对于构造方法来说,完全符合要求.

this引用

this一般可以不用,但是习惯使用.

对于this来说,如果实例化两个人类,那么调用方法时,如何得知是哪个对象去调用.其实在每一个方法中都含有一个隐藏的this在形参中,这样就可以知道是哪个对象去调用了这个方法.因此,this表示了当前对象的引用,就看谁调用了这个方法,慢慢理解,第一次接触当然不太容易懂了.值得注意的是静态的并不能使用this,这需要到static才可以了解.大家也可以通过标题跳到static中.

一般有三个用处:

第一个就是调用成员变量,this.name

第二个就是调用成员方法,this.getName( )

第三个就是调用构造方法,this(.....),括号中给出的就是值就是给另一个构造方法的值.举个比方,如果给一个无参构造,那么为了使其有一个特定初始值,因此在构造方法中放一个this(某个/些成员属性的值),这样给其一个特定的值,使得代码不至于太过冗杂.

对象的生成

首先为对象分配内存,这时引用就有了,也就是说对于类来说,不管是自定义的,还是Java给出的,都是相同的,这就是引用.当引用完成后,进调用造方法,这时对象就生成了.

二、三大特性之封装

封装定义

将数据和操作数据的方法进行结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互.

对于我自己的理解来说,就是不用去实现,只去使用就可以了,比如说对于一个字符串来说,使用charAt就可以获得某个字符.这就是面向对象编程的好处.

自定义包:其实就是文件夹,将一些类放于其中.

对于import来说,就是导入包,也就是在类中可以使用自定义包或者Java本身的包.

对于package来说,就是表示当前在哪个包中.

是可以包套包的,也就是无限套娃,可以类比于文件夹来说.

访问修饰限定符

1. private:只能在当前类中进行访问

2. 包访问权限(default):对于同一包中,可以访问其成员

3. protected:需要学到继承才可了解,权限又会增大一步,可以访问不同包的子类

4. public:最宽松的访问权限,任何情况下都可以使用

static成员

使用static修饰的称为静态成员(类成员),还有非静态成员(普通成员)

非静态成员/普通成员都需要对象的引用去调用

使用static的成员,不依赖于对象,而是直接跟类相关.置于方法区.直接使用类名就可以访问.

静态成员方法内部不能使用直接使用非静态成员的变量和方法,有因为当main函数中使用某类的静态成员方法时,是不需要实例化对象的,但是普通成员变量需要必须得实例化后才可以,因此在静态成员方法内部不能直接使用非静态成员的变量或者方法,如果要使用,那么就需要new.

对于静态成员变量来说,可以就地初始化,也就是直接赋值,还可以通过代码块进行赋值,也可以通过get和set方法,但此时也应将方法设为静态的,否则没有什么意义.比如说有非静态的成员变量,但要想初始化还需要去实例化一个对象,那么毫无作用,本来就是想通过类名直接访问的.

代码块

1. 普通代码块:有花括号括起来的代码块,定义在方法内部,我觉得没什么作用

public int getAgew(){
    {
        System.out.println("给出此人的年龄");
    }
    return this.age;
}

2. 构造代码块:类内部,方法外部,用来初始化非静态成员.先执行构造代码块,再执行构造方法.可以类比于将此代码块置于构造方法的最前端.如果有多个构造代码块,则看顺序,谁在前面,先执行谁的.

//比如下述结构,最后name被赋值是赵四,而不是王五
//因为先执行王五,再执行赵四

{
      this.name="王五";
}
      public String name="赵四";

3. 静态代码块:最先被执行,并且只被执行一次,并且如果只是静态代码块的话,按顺序执行

只要使用到类,就会被执行,而是是第一次使用到类,第二次使用则不会被执行,只执行一次

//使用static修饰

static{
     name="王五";
     System.out.println("禅师");
}
     public static String name="赵四";

 代码块执行的大致顺序就是

静态代码块 - > 实例代码块(构造代码块块) - > 构造方法

三、三大特性之继承(extends)

基本概念

class Cat extends Animal{


}

上述代码中,子类就是猫类,也称作派生类.

父类就是动物类,也称作基类/超类

意义

就是减少代码的冗杂度,加强代码的复用性.

super的使用

super和this类似,this指代的是当前对象属性,super则是指代父类的属性.

切记:但是super并不是代码父类对象的引用,子类继承和父类,但是使用时只是new了子类对象,而没有new父类对象,因此不可称作父类对象的引用,super只能称作关键词.

super也有三个作用:引用父类成员变量/引用父类成员方法/进行构造方法的调用

值得注意的是,使用this进行构造方法的调用时,需要将其放在第一行,而super进行父类构造方法的调用时,也需要放在第一行,因此两者不能同时使用.并且在子类中进行使用构造方法时,要先将父类的构造方法使用super构造好,不然无法使用.如果父类有无参的构造方法,那么在子类中,super()可不写.

对方法的调用

另外,在进行使用时,一般都是采用就近原则的方法:如果一个方法子类有,那么就调用子类的;子类没有,再去调用父类的.如果子类和父类都有,那么还是调用子类的,如果想要调用父类的,那么就需要用到super来进行调用.

代码块的终极执行顺序

先执行父类的静态代码块   - >   再执行子类的静态代码块   - >   无论是谁的静态代码块,都只能使用一次,没有第二次使用机会   - >   再执行父类的实例化代码块   - >   再执行父类的构造方法   - >   再执行子类的实例化代码块   - >   最后执行子类的构造方法   - >   我认为实例化代码块这个东西,不管有没有花括号,都会进行执行.并且对于同一类代码块,按照定义的先后顺序执行.

继承方式

单继承方式,也就是一个类只能继承另一个类,而不能继承多个,和C++有区别,C++有多种继承方式.

final

和C中的const差不多,表示常量的意思,并且必须赋初值.

例如:有一个数组

final int[] array = new int[]{1,2,3};

这表示引用不能变,但是其中的值还可以变.如何理解这个问题呢?

 如图所示,表示的引用也就是0X9,其实是0X9不能变,但是0X9指向的值是可以变的,也就是1,2,3是不受其约束的,可以随意改变值,需要多画图理解.

四、三大特性之多态

基本概念

多喵喵;而狗在叫时就是汪汪叫.态是三大特性之一,更是一种思想.当不同子类去调用父类时,会获得不同的结果.比如猫在叫时就是

多态的实现条件

向上转型,重写,继承

向上转型

在子类继承父类后,实例化对象时体现的一种性质.如下述代码中猫类继承动物类.

在发生向上转型以后,只能调用父类的成员变量和方法而不能调用子类的成员变量和方法.

Dog cat = new Cat();

向下转型

向下转型是有危险性存在的,可以利用instanceof进行判断

Animal animal = new Cat();
Cat cat = (Cat)animal;

这就是向下转型,当向下转型发生后,子类的方法和属性也可以调用.

重写

重写指的就是在子类中重写父类的方法.

重写中,方法名,参数列表和返回值都必须相同,而访问修饰限定符子类中的必须大于等于子类中的,我们称之为协变类型.

在重写的过程中,private/static/final修饰的都不可以重写

动态绑定

多态的基础就是动态绑定

动态绑定需要向上转型,重写,通过父类引用,调用子类和父类重写的方法

特点:编译时,不能确定方法的行为;当运行时,才能确定

优点:代码更加灵活

缺点:不能调用子类的特有的方法

静态绑定

其实就是重载

优点:编译时已经确定调用的方法

五、抽象类(abstract)

类中没有足够的信息来完成对类的一个描述称之为抽象类.

在抽象类中,可以没有抽象成员方法和抽象成员属性,但是在普通类中绝对不能有抽象属性和方法.

抽象类就是为了被继承,当抽象方法被继承之后,必须重写其中的抽象方法,如果没有将抽象方法都重写完,那么要将子类也定义类抽象类

既然为了被继承,则重写中不能使用的在抽象中也不能被使用

六、接口(interface)

接口就是抽象类的更进一步,不能实例化,只能被接.

在接口中,方法都是默认的public abstract

属性都是public  static  final,因此必须初始化,没有构造方法

但是jdk8开始,可以写default修饰的方法(这是普通方法)

可以有static方法

使用implements来继承接口

虽然类只能继承一个,但是接口确可以多继承.

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

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

相关文章

为什么WEB端通常采用3DTILES 格式进行发布?

为什么WEB端通常采用3DTILES 格式进行发布? 随着互联网技术的发展和普及,Web端三维数据可视化和呈现越来越受到关注和重视。在这个背景下,采用合适的标准格式进行数据发布和交换变得尤为重要。3DTILES是一种新型的三维数据标准格式,具有多种…

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 目录 数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化基本介绍模型描述程序设计学习小结基本介绍 MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 模型描述 局部费歇尔…

Linux之【多线程】线程互斥(锁)线程同步(条件变量)

Linux之【多线程】线程互斥(锁)&线程同步(条件变量) 一、引入:线程安全问题二、浅谈""和"- -"非原子性操作三、Linux线程互斥3.1 互斥量-->mutex⚠️3.1.1 互斥锁的理解3.1.2 深入了解锁的…

倾斜摄影超大场景的三维模型的顶层合并的优势浅析

倾斜摄影超大场景的三维模型的顶层合并的优势浅析 倾斜摄影超大场景的三维模型的顶层合并具有以下优势: 1、三维可视化效果好:通过倾斜摄影技术可以获得高分辨率的地面影像,将其与三维建模相结合可以生成非常逼真的三维场景。这种高度可视化…

SpringBoot事务管理-5个面试核心类源码刨析

“简单的事重复做,你就是专家;重复的事用心做,你就是赢家。” 在开始讲解SpringBoot事务之前,我们先来整体回顾下事务的概念及特性,便于我们了解SpringBoot是如何解决事务相关问题的,另外这部分也是面试必…

Windows安装配置Tomcat服务器教程 - 外网远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 转载自cpolar文章:外网访问本地Tomcat服务器【cpolar内网穿透】…

Cadence (1) 手动制作SMD封装

前提:软件版本 焊盘设计 :Pad Designer16.6PCB设计 :PCB Editor16.6PCB参考:LP Viewer 10.2 文章目录 SMD封装制作(R0603)封装信息SMD焊盘制作新建工程添加焊盘库路径到PCB EditorPCB Editor设计预处理放置焊盘放置丝印放置1脚标识…

【10.HTML入门知识-CSS元素定位】

1 标准流(Normal Flow) 默认情况下,元素都是按照normal flow(标准流、常规流、正常流、文档流【document flow】)进行排布  从左到右、从上到下按顺序摆放好  默认情况下,互相之间不存在层叠现象 1.1…

【13.HTML-动画】

1 CSS属性 - transform 1.1 位移 - translate translate的百分比可以完成一个元素的水平和垂直居中: 1.2 缩放 - scale 1.3 旋转 - rotate 1.4 transform-origin 形变的原点 1.5 倾斜 - skew 1.6 transform设置多个值 2 transition动画 2.1 认识transition动画 2…

Java反射(原理剖析与使用)

一、反射机制是什么 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 2、Java属于先编译再运行的语言&a…

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

该题对于模型的考察难度较低,难度在于数据的搜集以及选取与处理。 这里推荐数据查询的网站:中国碳核算数据库(CEADs) https://www.ceads.net.cn/ 国家数据 国家数据​data.stats.gov.cn/easyquery.htm?cnC01 以及各省市《统…

第四届“长城杯”信息安全铁人三项赛决赛RE-obfuscating

这里主要是加了混淆 这里要用到IDA的一个插件D810和去混淆脚本deflat.py。值得注意的是deflat.py无法在主逻辑去混淆,这里可以参考这篇文章的脚本利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)。在使用deflat.py和这文章中的脚本轮…

【AI折腾录】stable web ui基础【sd安装、lora vae embedding hyperwork等基础概念】

目录 一 sd安装二 目标三 sd基础3.1 模型3.2 vae(Variational autoencoder,变分自编码器)3.3 embedding3.3.1 安装方式3.3.2 使用方式 3.4 Lora3.4.1 lora组成3.4.2 使用:3.4.3 效果3.4.4 测试不同CFG效果 3.5 hypernetworks 超网…

LeetCode_BFS_DFS_中等_1376.通知所有员工所需的时间

目录 1.题目2.思路3.代码实现(Java) 1.题目 公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。 在 manager 数组中,每个员工都有一个直属负责人&#xff0c…

UE5实现距离测量功能

文章目录 1.实现目标2.实现过程2.1 Widget2.2 蓝图实现3.参考资料1.实现目标 UE5在Runtime环境下测量两个空间点位之间的绝对距离,并支持多段线的距离测量,GIF动图如下所示: 2.实现过程 实现原理比较简单,首先是基于PDI绘制线,有关绘制点和绘制线的可以看本专栏之前的文章…

css弹性布局

目录 1、实现弹性布局的前提:给父元素设置display:flex; 2、flex-direction:确定主轴方向 3、flex-wrap:是否换行 4、justify-content:主轴对齐方式 5、align-items:交叉轴对齐方式 6、align-content&#xff1a…

AWSFireLens轻松实现容器日志处理

applog应用程序和fluent-bit共享磁盘,日志内容是json格式数据,输出到S3也是JSON格式 applog应用部分在applog目录: Dockerfile文件内容 FROM alpine RUN mkdir -p /data/logs/ COPY testlog.sh /bin/ RUN chmod 777 /bin/testlog.sh ENTRYP…

人工智能技术在建筑能源管理中的应用场景

人工智能技术在建筑能源管理中的应用场景(龙惟定),2021 摘 要 本文简要介绍了建筑能源管理(building energy management, BEM) 的概念。并从5个方面阐述了 BEM 对人工智能(AI) 技术的需求,即楼宇控制需要由从顶到底的基于物理模…

03-Vue技术栈之生命周期

目录 1、什么是生命周期2、分析生命周期2.1 生命周期钩子函数2.2 生命周期钩子函数的作用2.3 生命周期钩子函数图例2.4 生命周期钩子函数的应用 3、生命周期总结 1、什么是生命周期 又名:生命周期回调函数、生命周期函数、生命周期钩子。是什么:Vue在关…

ChatGPT实现编程语言转换

编程语言转换 对于程序员来说,往往有一类工作,是需要将一部分业务逻辑实现从服务端转移到客户端,或者从客户端转移到服务端。这类工作,通常需要将一种编程语言的代码转换成另一种编程语言的代码,这就需要承担这项工作…