本文为java中对象与类等的基本知识,包括方法、构造、析构、静态域、初始化、包、路径等。

对象与对象变量

  在Java中,任何对象变量的值都是对存储在另外一处的一个对象的引用。new操作符的返回值也是一个引用。

  可以把Java中的数据类型分为两类,一类是基本数据类型,即前面提到的8种基本数据类型(4种整型,2种实数,1种字符,1种布尔);另一类是引用类型(reference type)。

   

  下列语句:

  Date deadline = new Date();

  有两个部分。表达式new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用,这个引用被存储在变量deadline中。

  可以显示地将对象变量设置为空(null)

  应该将Java的对象变量看作是C++的对象指针。

  引用类型是用在对象上的,一个对象可以被多个引用所指向,但同一时刻,每个引用只能指向唯一的一个对象。如果一个对象被多个引用所指向,那么无论哪个引用对对象属性进行了修改,都会反映到其他的引用当中。

  C++中没有空引用,并且引用不能被赋值。

  所有的Java对象都存储在堆中。变量包含的是指向堆对象的指针。引用存放的是对象的地址

  在Java中使用clone方法来获得对象的完整拷贝。

用户自定义类

  在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。

  源文件名必须与公有类的名字相匹配。

  当编译源程序时所有使用到的类都会被编译。

方法

  Java中所有的方法都必须在类的内部定义,但并不像C++那样把类内部定义的方法作为inline,是否将某个方法作为内联方法是Java虚拟机的任务。

  若需要返回一个可变数据域的拷贝,就应该使用clone。

构造器

  构造器即构造函数,工作方式与C++基本相同。但是所有的Java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用。

  如果在编写一个类时没有编写构造器,系统就会提供一个默认构造器(默认构造器是指没有参数的构造器)。系统提供的这个默认构造器会将所有的实例域设置为默认值。

  如果类中至少提供了一个构造器,但是没有提供默认的构造器,那么在构造对象时若不提供构造参数就视为不合法。用户如果希望不提供参数时,所有域拥有默认的值,可以提供一个空的默认构造器。

  如果构造器的第一个语句形如this(…),那么这个构造器将调用同一个类的另一个构造器。

  注意:在C++中一个构造器不能调用另一个构造器,必须将抽取出的公共初始化代码编写成一个独立的方法。

方法参数

隐式参数与显式参数

  每一个方法中,this表示隐式参数,表示对象。

  显式参数是列在方法括号中的数值。

方法参数的传递

  C++有值调用和引用调用,引用参数标有&符号。

  Java程序设计语言使用值调用,方法得到的是参数值的一个拷贝。

  即对于Java中的方法参数传递,无论传递的是原生数据类型,还是引用类型,统一是传值(pass by value)。

  对于基本数据类型来说,方法中的变量被初始化为实参的一个拷贝,方法结束后,原来的在方法外部的变量并不改变,而方法中的变量不再使用。

  对于对象引用来说,方法中的变量被初始化为对象引用值的拷贝,即一个对象的引用。方法可以改变一个对象参数的状态。

  但是认为Java对对象采用的是引用调用,这种理解是不对的。如果将两个对象的引用的拷贝在方法中交换,这样并不能够真的交换这两个对象。这说明一个方法不能让对象参数引用一个新的对象。

静态域与静态方法

静态域:

  如果将域定义为static,那么每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有一份自己的拷贝。

静态常量:

  public static final double PI=3.1415926535;

  public static final PrintStream out=…;

静态方法:

  静态方法是不能向对象实施操作的方法。即没有隐式的参数this。

  main方法是一个静态方法,因为在启动程序的时候还没有任何一个对象。

  (每个类可以有个main方法,这是对类进行单元测试时一个常用技巧。)

  因为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是静态方法可以访问自身类中的静态域。

  以下两种情况使用静态方法:

    1.当一个方法不需要访问对象状态,所有参数都是通过显示参数提供的。

    2.当一个方法只需要访问类的静态域。

显式域初始化

  在执行构造器之前先进行赋值,当一个类的所有构造器都希望将相同的值赋予某个特定的实例域时,这种方法特别有用。

  初始值不一定是常量,域可以调用方法来进行初始化。

静态初始化:

  对静态域进行初始化可以将代码放在一个块中,并标记关键字static。在类第一次加载的时候,将会进行静态域的初始化,与实例域一样,静态域的默认初始值为false或null,除非将它们显式设置成其他值。

  所有的静态初始化语句以及静态初始化块  都将按照类定义中出现的顺序执行。

对象析构与finalize方法

  Java有自动的垃圾回收器,不需要人工回收内存,所以不支持析构器。

  当使用了内存之外的其他资源,如文件或使用了系统资源的另一个对象的句柄,在这种情况下,当资源不再需要的时候,将其回收和再利用十分重要。

  可以为任何一个类添加finalize方法,该方法将在垃圾回收器清除对象之前被调用。在实际应用中,不要使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够被调用。

  如果某个资源需要在使用完毕后立刻被关闭,就需要人工管理。提供一个类似dispose或close这样的方法,用来做相应的清理。如果一个类使用了这样的方法,当对象不再使用时一定要调用它。

  package将类组织起来。

  所有标准的Java包都处于java和javax包层次中。

  使用包的主要原因是确保类名的唯一性,Sun公司建议将公司的英特网域名以逆序的形式作为包名,并且对于不同的项目使用不同的子包。

  包嵌套的唯一目的是管理唯一的名字。从编译器的角度来看,嵌套的包之间没有任何关系。每一个都拥有独立的类集合。

类的导入

  一个类可以使用所属包中的所有类,以及其他包中的公有类。

  访问另一个包中的共有类有两种方式:

  1.在每个类名之前添加完整的包名。如:

  java.util.Date today = new java.util.Date();

  2.使用import语句(位于源文件顶部,package语句的后面)导入一个特定的类或者整个包。如:

  import java.util.*;

  还可以导入一个包中的特定类:

  import java.util.Date;

静态导入

  import语句不仅可以导入类,还增加了导入静态方法和静态域的功能。

  import static java.lang.System.*;

将类放入包中

  要想将一个类放入包中,就必须将包的名字放在源文件的开头。如:

  package com.horstmann.corejava;

  如果没有在源文件中放置package语句,那么这个源文件中的类就被放置在一个默认包中,默认包是一个没有名字的包。

虚拟机如何定位类

  类存储在文件系统的子目录中,类的路径必须与包名匹配。

  另外,还可以利用JAR实用程序将类文件添加到归档文件中。在一个归档文件中,可以包含多个类文件和子目录,这样既可以节省又可以改善性能。

  类路径所列出的目录和归档文件是搜寻类的起始点,是所有基目录的集合,基目录中的子目录可以用于包含类文件。

  设置类路径的方法取决于编译环境。如果使用JDK,那么就有两种选择:为编译器和字节码解释器指定-classpath选项,或者设置CLASSPATH环境变量。

  具体的设置细节取决于操作系统。

  句点.表示当前目录,Windows环境中,各基目录以分号;间隔。

  由于运行时库文件(在jre/lib与jre/lib/ext目录下的rt.jar和一些其他的JAR文件)会被自动地搜索,所以不必将它们显式地列在类路径中。

  为编译器设置类路径:

  javac –classpath …

  也可以用-cp代替-classpath

  javac编译器总是在当前目录中查找文件,而java解释器仅在类路径中有.目录的时候,才查看当前目录。

包作用域

  标记为public的部分可以被任意的类使用;

  标记为private的部分只能被定义它们的类使用。

  如果没有指定public或private,那么这个部分可以被同一个包中的所有方法访问。

Java读书笔记05 类与对象相关推荐

  1. Java学习笔记_类和对象

    ·类:是一组相关属性和行为的集合,可以看成是一类事务的模板,使用事物的属性特征和行为特征来描述该类事物. ·属性:该事物的状态信息 ·行为:就是该事物能够做什么 ·对象:一类事物的具体体现,对象是类的 ...

  2. Java学习笔记1——类和对象

    面向对象 对象:万物皆对象 面向对象 类:模子,属性+方法,类是对象的类型,是具有相同属性和方法的一组对象的集合 对象属性:对象拥有的各种特征,"对象有什么" 对象方法:对象执行的 ...

  3. Head First Java学习笔记(2):类与对象

    类 1.类是定义同一类所有对象的变量和方法的蓝图或原型. 2.实例变量的值由类的每个实例提供.当创建类的实例时,就创建了这种类型的一个对象,然后系统为类定义的实例变量分配内存.然后可以调用对象的实例方 ...

  4. Java基础笔记_6_类和对象_成员变量

    一 类和对象 类是抽象的概念,是对象的模板 对象是具体的事物,是类的具体实例 创建类的语法 public class 类名{  // 类内容 } 创建对象的语法 new 关键字就是实例化对象的意思.& ...

  5. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  6. Java读书笔记(4)-多线程(二)

    Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...

  7. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 --移位 think in java 读书笔记 2 -- 套接字 think in java 读书笔记 3 -- 数据报 概要 1. 套接字基本知识 2 ...

  8. Java读书笔记(8)-单例模式

    Java读书笔记(8)-单例模式 今天在阅读<Effective Java 2>第3条时,获知一种使用枚举enum实现单例模式的新方法,然而书上并没有就此展开深入说明,于是上网查阅了一些资 ...

  9. 推荐系统实践读书笔记-05利用上下文信息

    推荐系统实践读书笔记-05利用上下文信息 本章之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context ...

最新文章

  1. ACM-ICPC 2018 焦作赛区网络预赛 J(二分+JAVA高精)
  2. WebService的两种方式SOAP和REST比较 (转)
  3. LeetCode-剑指 Offer 04. 二维数组中的查找
  4. 寻找一个字符串中所有重复字符的索引
  5. Kafka解惑之Old Producer(2)——Sync Analysis
  6. mvn打包并部署本地tomcat_maven项目自动打包部署到tomcat中
  7. github windows客户端
  8. androidStudio快捷键概览
  9. lol游戏挂机软件_“本不想挂机,但系统不让重连!”LOL成“挂机联盟”,5局3挂机...
  10. Spring全家桶视频教程
  11. ArcGIS 各版本产品补丁荟萃
  12. word embedding和contextual embedding
  13. 【Photoshop】Photoshop 64Bit与Camera Raw安装包
  14. 一个屌丝程序猿的人生(二十一)
  15. 技术分享 | 开发板网口热插拔自动获取IP地址
  16. 交通灯keil程序加2位数码管_51单片机红绿灯两个数码管显示实验报告
  17. _pickle.UnpicklingError: unpickling stack underflow
  18. 笔记|数据分析:指标体系中的标准化方法
  19. 【安全资讯】《网络产品安全漏洞管理规定》出台,漏洞披露者的紧箍咒?
  20. 2021年总结以及2022年的计划

热门文章

  1. javaScript tips —— z-index 对事件机制的影响
  2. PAT Basic 1048
  3. 一些意想不到的小bug。
  4. HackerRank Week of Code 26
  5. Scrum 团队成立 -- 软件工程
  6. Delphi APP 開發入門(五)GPS 定位功能
  7. 想当然是编程最大的坑,记更新删除过期cookie无效有感
  8. Heritrix 3.1.0 源码解析(八)
  9. Android实现系统关机和重启
  10. (1)51单片机NOP指令