类与对象


Abstract

Body

instanceof

文件后缀名

.py
.c
.cpp
.java
成员函数/成员方法/行为

interface接口

可类比C++中抽象类

IDEA快捷键操作

ctrl+shift+enter 自动换行
eclipse:sysout;
idea-U:sout;

对象的声明(建立)与引用

Java 无指针,但this依然存在;

this.width=width

(当类的成员变量与函数参数相同时)

Java声明对象一定要用new

Rect rect;

rect 的值是null(没有这样一个对象),此时rect并没有在“堆内存”中开辟空间。

对象的“引用”本质上就是一个对象在堆内存的地址,所不同的是,在Java中,用户无法向C/C++那样直接操作这个地址。

形象的例子:一次引用就是拿一只手牵着话筒的线,话筒就是地址,用手拿话筒线牵话筒线就是引用,再用另一只手牵话筒就是另一次引用。

%%实例化过程(声明对象+引用对象)

Rect rc1=new Rect();//没有被任何对象引用,Java自动回收机制
rc1=new Rect();

(C++不用delete删除会造成运行内存永久泄露,直到程序运行完为止)
“new Rect()”就是使用new关键字,来调用构造方法Rect(),创建一个真实的对象,并把这个对象在“堆内存”中的占据的内存首地址赋予rc1,这时rc1才能称为一个实例化的对象。

匿名对象

  1. 对于一个对象实例化的操作来讲,对象真正有用的部分是在堆内存里面,而栈内存只是保存了一个对象的引用名称(严格来讲是对象在堆内存的地址)
  2. 匿名对象就是指,只开辟了堆内存空间,而没有栈内存指向的对象(没有被其他对象所引用)
  3. 由于匿名对象没有栈内存指向,所以其只能使用一次,之后就变成无法找寻的垃圾对象,故此会被Java自动回收机制回收。

当创建一个对象后,Java虚拟机Java Virtual Machine(JVM)就会给这个对象分配一个自身的引用——this。由于this是和对象本身相关联的,所以
this只能在类中的非静态方法中使用
因为静态方法与静态属性是属于类的,所以直接用类名访问比较好。(不推荐用this访问静态方法)

静态成员属于类,而不属于某个具体对象,只要类存在它们就存在。

静态属性及静态方法属于类,它们与具体的对象无关,所以静态属性及静态方法是没有this的。

system.out.println(st1.toString());

toString是继承而来的

继承而来的。。。。。。①

  1. 不写用的继承来的
  2. 写了用的自己重载的

toString返回在Java虚拟机中的地址,不是在运行内存中的地址。

构造函数

(特殊函数)

  1. 没有返回值类型(void表明返回值为空值,与没有返回值类型有区别)
  2. 函数名与类名完全一致
  3. 在声明对象时被系统自动调用,声明后系统其他地方不能调用

(一种理解方式 believe it or not)
其实构造函数是有返回值的,但这个返回值是一个对象。

构造函数可重载

C++在构造函数初始化是可写默认值(虽然不被推荐)
,但这种操作在Java中不被允许,不要在Java构造函数初始化时写默认值。

C++默认值未初始化是乱码,对结果有影响;但在Java中则有安全性

  1. 基本类型的默认值为0(数字的默认值是0)
  2. 对象的默认值为null

string不能继承

解释型语言&编译型语言

解释型语言是指它常用的执行机制是使用一个“解释器”来执行,解释器对于程序是一句一句“翻译”成机器语言来一句一句执行,例如shell脚本语言。

编译型语言是指它常用的执行机制是使用一个“编译器”来编译成机器语言,然后你就可以直接运行(执行)这个编译成的“可执行文件”。例如C语言你也可以为解释型语言(如shell脚本语言)写个编译器来编译,这样它就成了“编译语言”

强类型语言&弱类型语言

强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。

java、.NET、C/C++等都是强制类型定义的。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。

与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值

  1. 强类型语言 Java C C++(变量被指明类型)
  2. 弱类型语言 Python(所有变量无类型)

静态成员

属于类,而不属于某个具体对象,只要类存在它们就存在。

静态类在类内部声明自己(这种操作只能放在静态方法里)
这种操作在界面设计GUI中很常见

动态方法中则不行,会引发无穷调用(一直套娃下去)

eg

class MainClass{public static void main(String[] args){MainClass c1=new MainClass();}void test(){}
}

上述代码中,c1不包含main,再写一个静态方法也不会被c1包含,c1中只有test(动态方法)

再次强调,static属于某个类而不是某个对象;

没必要在构造函数中做过于复杂的操作,只做初始化操作就好。过于复杂的操作可交由另外的成员函数在其他函数中直接调用。

参数的

  1. 类型
  2. 数量
    至少一个不同即可重载
    (参数名与函数名不参与比较)

override 复写

java.lang.Object

是所有类的祖先

IDEA-U中特有表述方式

register(no:20)

标准表示方式

register(20);

println()也被重载了多次

构造方法(同①式)

  1. 不写

UML图

(在考试中会出现)

UML-Unified Modeling Language
统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。

UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建模方面,特别是在软件架构层次,已经被验证有效。

UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。

基本类型可以作为对象而存在,

基本类型的类

  1. Integer//int
  2. Character//char
  3. Double//double
    涉及装箱与开箱,回忆C++转换构造函数
    将基本数据类型转化为对象

类对象声明+创建格式
----- Rect rc=new Rect();
------ 声明 ----- 创建

rc是一个引用,Java中对对象的所有操作都是地址引用

public 类方法,类变量相当于全局方法,全局变量。

动态方法&静态方法

动态方法可以调用
所有方法

  1. 成员方法
  2. 静态方法

静态方法只能调用静态方法

C++父类指针指向子类对象,调用
方法
不是父类的方法,而是子类继承的方法
Java多态是天然的
方法重载是一种多态表现
操作一定要在方法内部操作
Java类变量
是属于某个类而不是某个对象
是一种另外意义上的全局变量(访问受限的全局变量)
与C++中的全局变量不同

shout->cat
shout->dog

不写继承默认继承Object类

Java声明对象,引用对象
引用即用两根线牵着同一个变量
例子暂时找不到


st相当于st.toString()的隐式调用

每个对象都是对对象的引用,而不是对象本体,对象无本体。

Java中判断对象是否相等,内存地址

  1. 一样,相同
  2. 不一样,不是同一个对象

先声明成员变量,再定义方法

成员变量与局部变量的区别

成员变量 局部变量
类中方法外 方法内部或者方法声明上
堆内存 栈内存
随着对象的存在而存在,随着对象的消失而消失 随着方法的调用而存在,随着方法的调用完毕而消失
有默认的初始化值(数值类型默认初始化值为0) 没有默认的初始化值,必须先定义(赋值),才能使用
  1. 局部变量不同与成员变量,局部变量只在方法中有效,而成员变量在整个类中都有效
  2. 局部变量与其声明的位置顺序有关,而成员变量与其声明的位置顺序无关
  3. 若局部变量的名字和成员变量的名字相同,那么成员变量会被隐藏,即在方法体中成员变量暂时是无效的
  4. 当想使用方法中被隐藏的成员变量,可以使用关键字 this 进行调用
  5. 成员变量有默认值,而局部变量没有默认值,因此在使用局部变量时,要确保该局部变量是有初始值的,否则程序报错

4.eg
对于第三点,如果方法中局部变量的名字与成员变量的名字相同,那么方法就隐藏了成员变量,如果想在该方法中使用被隐藏的成员变量,必须使用关键字this

class Tom{int x=10,y;void f(){int x=5;y=x+this.x;}
}

其中,y得到的值是15

5.eg
成员变量有默认值,但
局部变量没有默认值,因此在使用局部变量之前,必须保证局部变量有具体的值。

class InitError{int x=10,y;void f(){int m;//m没有默认值,x=y+m;}
}
  1. 在Java中,构建对象时所需要的内存从堆中分配。 这些对象通过new指令“显式”建立,放弃分配方式类似于数据结构中的链表。
  2. 堆内存在使用完毕后,是由垃圾回收(Garbage Collection,简称GC)器“隐式”回收的。
  3. 在这一点上,是和C/C++是有显著不同的,在C/C++中,堆内存的分配和回收都是显式的,均由用户负责,如果用户申请了堆内存,而在使用后忘记释放,则会产生“内存溢出”问题——可用内存存在,而其他用户却无法使用。
  4. 堆的优势是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。
  5. 其缺点为,由于要在运行时才动态分配内存,相比于栈内存,它的存取速度较慢。

References

[1]https://blog.csdn.net/xwx_100/article/details/83212067
[2]https://baike.baidu.com/item/%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80/9563849
[3]https://baike.baidu.com/item/UML%E5%9B%BE/6963758?fr=aladdin


Edition

3rd edition:2021/9/28
4th edition:2021/10/6

Java实用教程笔记 类与对象相关推荐

  1. Java实用教程笔记 类与对象(续)

    类与对象(续) 实例变量(动态变量) 类变量(静态变量)(数据共享)static(尽量写成public(private和protected毫无意义)) 实例方法(既可访问静态数据,又可访问动态数据)A ...

  2. Java实用教程笔记 输入、输出流

    输入.输出流 期末考试会从10.1考到10.5 源&目的地 10.1File类 创建一个File对象的构造方法 文件属性 目录 创建目录 列出目录中的文件 FilenameFilter接口 辨 ...

  3. Java实用教程笔记 子类与继承

    子类与继承 Unity 游戏仿真 C#与Java语法差不多 java.lang.Object Object是所有类的祖先类/始祖类 任何一个类最终都能转化为Object类的对象 Java库中的类是基础 ...

  4. Java实用教程笔记 内部类与异常类

    内部类与异常类 Review Note 只有我能用,不希望别人用(内部类的基本思想) .class文件的生成个数 匿名类 匿名类都是一次性的(当前这一次,以后不能用) Conclusion Revie ...

  5. Java实用教程笔记 泛型与集合框架

    泛型与集合框架 Generics 链表 LinkedList < E >泛型类 接口回调 常用方法 LinkedList< E >泛型类实现Link< E >泛型接 ...

  6. Java实用教程笔记 Java多线程机制

    Java多线程机制 泛型要考,后来又说不考了 多线程不考 12.1 进程与线程Process and Thread 12.2Java中的线程Threads in Java 线程的状态与生命周期The ...

  7. Java实用教程笔记 常用实用类

    常用实用类 8.1 String类 判断引用是否为同一变量 常量池vs非常量池(动态区) equals 输出对象为内存地址的方式 "==" 运算结果为ture/false的比较方式 ...

  8. Java实用教程笔记 接口与实现

    接口与实现 6.1接口(中间人) 接口方法全为public abstract 接口中没有构造函数,方法可以抛出异常 接口没有任何函数逻辑(对外开放) 接口可继承 接口.类(内部类.匿名类)都会生成cl ...

  9. Java实用教程笔记 子类与继承2

    子类与继承2 Review 继承方式比较 继承后子类对父类的访问权限说明 super关键字作用(2个) 构造函数的调用顺序 没有参数的构造函数即为默认构造函数 Lecture notes final关 ...

最新文章

  1. [LeetCode] 回溯算法
  2. 阐述Session加载实体对象的过程
  3. CCF NOI1054 扫雷游戏
  4. 【ZOJ - 3211】Dream City (01背包类问题,贪心背包)
  5. 办公自动化-发送邮件功能-无格式-有格式-带附件-0225
  6. Android 关于fragment切换重新加载的解决分享给大家
  7. 谈谈应届生应聘的一点看法
  8. 9, Java NIO SocketChannel
  9. 新版标准日本语中级_第六课
  10. 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)
  11. 笑傲江湖 琴箫合奏之曲
  12. 小米运动app关联支付宝
  13. eclips 安装问题
  14. 思科交换机密码清除方法记录
  15. 微信小程序 WebSocket 通信 —— 在线聊天
  16. 深度学习入门笔记(十八):卷积神经网络(一)
  17. Shell脚本中的循环
  18. 任意地址读写驱动提权(cred、VDSO、modprobe_path、core_pattern、修改内核指针提权)
  19. 基于HDF的LED驱动程序开发(2)
  20. Win10升级Win11必备的5款免费软件

热门文章

  1. leetcode_linearList03
  2. notepad++ 设置常用快捷键
  3. 对.net知识结构相关讲解
  4. ASP.NET存取图片到数据库
  5. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处
  6. c语言 将url图片存到本地_一个22万张NSFW图片的鉴黄数据集?我有个大胆的想法……...
  7. mysql引擎层存储层_MySQL存储底层技术:InnoDB底层原理解读
  8. Jquery string 和 json相互转换的方法
  9. java中关于DecimalFormat四舍五入的用法
  10. centos8网络配置开启wifi_CentOS 7.5 最小安装开启 WIFI 连接的设置方法