Java实用教程笔记 类与对象
类与对象
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才能称为一个实例化的对象。
匿名对象
- 对于一个对象实例化的操作来讲,对象真正有用的部分是在堆内存里面,而栈内存只是保存了一个对象的引用名称(严格来讲是对象在堆内存的地址)
- 匿名对象就是指,只开辟了堆内存空间,而没有栈内存指向的对象(没有被其他对象所引用)
- 由于匿名对象没有栈内存指向,所以其只能使用一次,之后就变成无法找寻的垃圾对象,故此会被Java自动回收机制回收。
当创建一个对象后,Java虚拟机Java Virtual Machine(JVM)就会给这个对象分配一个自身的引用——this。由于this是和对象本身相关联的,所以
this只能在类中的非静态方法中使用。
因为静态方法与静态属性是属于类的,所以直接用类名访问比较好。(不推荐用this访问静态方法)
静态成员属于类,而不属于某个具体对象,只要类存在它们就存在。
静态属性及静态方法属于类,它们与具体的对象无关,所以静态属性及静态方法是没有this的。
system.out.println(st1.toString());
toString是继承而来的
继承而来的。。。。。。①
- 不写用的继承来的
- 写了用的自己重载的
toString返回在Java虚拟机中的地址,不是在运行内存中的地址。
构造函数
(特殊函数)
- 没有返回值类型(void表明返回值为空值,与没有返回值类型有区别)
- 函数名与类名完全一致
- 在声明对象时被系统自动调用,声明后系统其他地方不能调用
(一种理解方式 believe it or not)
其实构造函数是有返回值的,但这个返回值是一个对象。
构造函数可重载
C++在构造函数初始化是可写默认值(虽然不被推荐)
,但这种操作在Java中不被允许,不要在Java构造函数初始化时写默认值。
C++默认值未初始化是乱码,对结果有影响;但在Java中则有安全性
- 基本类型的默认值为0(数字的默认值是0)
- 对象的默认值为null
string不能继承
解释型语言&编译型语言
解释型语言是指它常用的执行机制是使用一个“解释器”来执行,解释器对于程序是一句一句“翻译”成机器语言来一句一句执行,例如shell脚本语言。
编译型语言是指它常用的执行机制是使用一个“编译器”来编译成机器语言,然后你就可以直接运行(执行)这个编译成的“可执行文件”。例如C语言你也可以为解释型语言(如shell脚本语言)写个编译器来编译,这样它就成了“编译语言”
强类型语言&弱类型语言
强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
java、.NET、C/C++等都是强制类型定义的。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。
与其相对应的是弱类型语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值
- 强类型语言 Java C C++(变量被指明类型)
- 弱类型语言 Python(所有变量无类型)
静态成员
属于类,而不属于某个具体对象,只要类存在它们就存在。
静态类在类内部声明自己(这种操作只能放在静态方法里)
这种操作在界面设计GUI中很常见
动态方法中则不行,会引发无穷调用(一直套娃下去)
eg
class MainClass{public static void main(String[] args){MainClass c1=new MainClass();}void test(){}
}
上述代码中,c1不包含main,再写一个静态方法也不会被c1包含,c1中只有test(动态方法)
再次强调,static属于某个类而不是某个对象;
没必要在构造函数中做过于复杂的操作,只做初始化操作就好。过于复杂的操作可交由另外的成员函数在其他函数中直接调用。
参数的
- 类型
- 数量
至少一个不同即可重载
(参数名与函数名不参与比较)
override 复写
java.lang.Object
是所有类的祖先
IDEA-U中特有表述方式
register(no:20)
标准表示方式
register(20);
println()也被重载了多次
构造方法(同①式)
- 写
- 不写
UML图
(在考试中会出现)
UML-Unified Modeling Language
统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。
UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建模方面,特别是在软件架构层次,已经被验证有效。
UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。
基本类型可以作为对象而存在,
基本类型的类
- Integer//int
- Character//char
- Double//double
涉及装箱与开箱,回忆C++转换构造函数
将基本数据类型转化为对象
类对象声明+创建格式
----- Rect rc=new Rect();
------ 声明 ----- 创建
rc是一个引用,Java中对对象的所有操作都是地址引用
public 类方法,类变量相当于全局方法,全局变量。
动态方法&静态方法
动态方法可以调用
所有方法
- 成员方法
- 静态方法
静态方法只能调用静态方法
C++父类指针指向子类对象,调用
方法
不是父类的方法,而是子类继承的方法
Java多态是天然的
方法重载是一种多态表现
操作一定要在方法内部操作
Java类变量
是属于某个类而不是某个对象
是一种另外意义上的全局变量(访问受限的全局变量)
与C++中的全局变量不同
shout->cat
shout->dog
不写继承默认继承Object类
Java声明对象,引用对象
引用即用两根线牵着同一个变量
例子暂时找不到
st相当于st.toString()的隐式调用
每个对象都是对对象的引用,而不是对象本体,对象无本体。
Java中判断对象是否相等,内存地址
- 一样,相同
- 不一样,不是同一个对象
先声明成员变量,再定义方法
成员变量与局部变量的区别
成员变量 | 局部变量 |
---|---|
类中方法外 | 方法内部或者方法声明上 |
堆内存 | 栈内存 |
随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
有默认的初始化值(数值类型默认初始化值为0) | 没有默认的初始化值,必须先定义(赋值),才能使用 |
- 局部变量不同与成员变量,局部变量只在方法中有效,而成员变量在整个类中都有效
- 局部变量与其声明的位置顺序有关,而成员变量与其声明的位置顺序无关
- 若局部变量的名字和成员变量的名字相同,那么成员变量会被隐藏,即在方法体中成员变量暂时是无效的
- 当想使用方法中被隐藏的成员变量,可以使用关键字 this 进行调用
- 成员变量有默认值,而局部变量没有默认值,因此在使用局部变量时,要确保该局部变量是有初始值的,否则程序报错
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;}
}
- 在Java中,构建对象时所需要的内存从堆中分配。 这些对象通过new指令“显式”建立,放弃分配方式类似于数据结构中的链表。
- 堆内存在使用完毕后,是由垃圾回收(Garbage Collection,简称GC)器“隐式”回收的。
- 在这一点上,是和C/C++是有显著不同的,在C/C++中,堆内存的分配和回收都是显式的,均由用户负责,如果用户申请了堆内存,而在使用后忘记释放,则会产生“内存溢出”问题——可用内存存在,而其他用户却无法使用。
- 堆的优势是在于动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。
- 其缺点为,由于要在运行时才动态分配内存,相比于栈内存,它的存取速度较慢。
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实用教程笔记 类与对象相关推荐
- Java实用教程笔记 类与对象(续)
类与对象(续) 实例变量(动态变量) 类变量(静态变量)(数据共享)static(尽量写成public(private和protected毫无意义)) 实例方法(既可访问静态数据,又可访问动态数据)A ...
- Java实用教程笔记 输入、输出流
输入.输出流 期末考试会从10.1考到10.5 源&目的地 10.1File类 创建一个File对象的构造方法 文件属性 目录 创建目录 列出目录中的文件 FilenameFilter接口 辨 ...
- Java实用教程笔记 子类与继承
子类与继承 Unity 游戏仿真 C#与Java语法差不多 java.lang.Object Object是所有类的祖先类/始祖类 任何一个类最终都能转化为Object类的对象 Java库中的类是基础 ...
- Java实用教程笔记 内部类与异常类
内部类与异常类 Review Note 只有我能用,不希望别人用(内部类的基本思想) .class文件的生成个数 匿名类 匿名类都是一次性的(当前这一次,以后不能用) Conclusion Revie ...
- Java实用教程笔记 泛型与集合框架
泛型与集合框架 Generics 链表 LinkedList < E >泛型类 接口回调 常用方法 LinkedList< E >泛型类实现Link< E >泛型接 ...
- Java实用教程笔记 Java多线程机制
Java多线程机制 泛型要考,后来又说不考了 多线程不考 12.1 进程与线程Process and Thread 12.2Java中的线程Threads in Java 线程的状态与生命周期The ...
- Java实用教程笔记 常用实用类
常用实用类 8.1 String类 判断引用是否为同一变量 常量池vs非常量池(动态区) equals 输出对象为内存地址的方式 "==" 运算结果为ture/false的比较方式 ...
- Java实用教程笔记 接口与实现
接口与实现 6.1接口(中间人) 接口方法全为public abstract 接口中没有构造函数,方法可以抛出异常 接口没有任何函数逻辑(对外开放) 接口可继承 接口.类(内部类.匿名类)都会生成cl ...
- Java实用教程笔记 子类与继承2
子类与继承2 Review 继承方式比较 继承后子类对父类的访问权限说明 super关键字作用(2个) 构造函数的调用顺序 没有参数的构造函数即为默认构造函数 Lecture notes final关 ...
最新文章
- [LeetCode] 回溯算法
- 阐述Session加载实体对象的过程
- CCF NOI1054 扫雷游戏
- 【ZOJ - 3211】Dream City (01背包类问题,贪心背包)
- 办公自动化-发送邮件功能-无格式-有格式-带附件-0225
- Android 关于fragment切换重新加载的解决分享给大家
- 谈谈应届生应聘的一点看法
- 9, Java NIO SocketChannel
- 新版标准日本语中级_第六课
- 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)
- 笑傲江湖 琴箫合奏之曲
- 小米运动app关联支付宝
- eclips 安装问题
- 思科交换机密码清除方法记录
- 微信小程序 WebSocket 通信 —— 在线聊天
- 深度学习入门笔记(十八):卷积神经网络(一)
- Shell脚本中的循环
- 任意地址读写驱动提权(cred、VDSO、modprobe_path、core_pattern、修改内核指针提权)
- 基于HDF的LED驱动程序开发(2)
- Win10升级Win11必备的5款免费软件
热门文章
- leetcode_linearList03
- notepad++ 设置常用快捷键
- 对.net知识结构相关讲解
- ASP.NET存取图片到数据库
- java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处
- c语言 将url图片存到本地_一个22万张NSFW图片的鉴黄数据集?我有个大胆的想法……...
- mysql引擎层存储层_MySQL存储底层技术:InnoDB底层原理解读
- Jquery string 和 json相互转换的方法
- java中关于DecimalFormat四舍五入的用法
- centos8网络配置开启wifi_CentOS 7.5 最小安装开启 WIFI 连接的设置方法