Java基础

05 类和对象

2017-01-25  本文已影响10人  acc8226

面向对象是Java最重要的特性。Java是彻底的、纯粹的面向对象语言,在Java中“一切都是对象”。本章将介绍面向对象基础知识。

面向对象

面向对象的开发过程: 其实就是不断的创建对象,使用对象,指挥对象做事情。
面向对象的设计过程: 其实就是在管理和维护对象之间的关系。

面向对象的特征:

什么是类

Java中用类Class来描述事物.是具体事物的抽象,概念上的定义。

类定义包括类声明和类体两部分,类定义的语法格式如下:
[public][abstract|final] class className [extends superclassName] [implements interfaceNameList] {类体}

对象的创建

创建对象及访问对象成员

  1. 声明对象与声明普通变量没有区别 ,格式:type objectName; 
    声明并不为对象分配内存空间,而只是分配一个引用
  2. 实例化对象。分为两个阶段:为对象分配内存空间和初始化对象,首先使用new运算符为对象分配内存空间,然后再调用构造方法初始化对象。格式如下:new 类的构造方法();
  3. 通过引用变量访问对象成员

什么是方法

方法, 在C语言时代也成为函数. 指的是定义在类中的具有特定功能的一段独立小程序.

方法声明

参数传递

  1. 基本数据类型的参数传递是以传值的方式进行,即将实际参数的值传递给形参; 在方法内对形参的修改只影响形参单元,不影响实参
  2. 引用类型(如对象、数组等)参数传递是按地址进行传递的。在方法内对形参的访问实际是访问所指引用对象

方法的特点:
将功能代码进行封装,便于对该功能进行调用. 只有被调用才被执行,提高了代码的复用性. (注意不能在函数的内部定义方法)

方法的重载(Overload):

方法的覆盖(Override)

不允许子类方法的访问修饰符比父类有更多的限制。例如:子类不能将父类的public方法定义为protected方法。但可以将父类的private方法在子类中重新定义为public方法.通常将子类方法访问修饰符与父类保持一致.

构造方法

作用: 给对象进行初始化

构造方法的特点

一个类默认有一个空参数的构造函数,这个构造函数的权限与所属类一致. 如果类被public修饰,则默认的构造函数也被public修饰.总之默认构造函数的权限是随着类而变化.

对象的初始化和构造方法

在创建对象时,要给对象的属性成员分配内存空间,同时进行初始化。

  1. 如果定义属性成员时没有指定初值,则系统自动指定初值.在定义属性成员时也可以指定初值.public class Point {private int x=10; ……
  2. 指定初值的另一种办法是通过初始化块来设置对象的初值(也叫做构造代码块,它是给所有对象进行统一初始化)。
    //注意首先是按照属性定义的初值,然后是初始化块,
  3. 最后是构造方法:构造方法是给对相关设置初值的规范方法,构造方法是根据方法参数给对象属性赋不同的值

成员变量

声明类体中成员变量语法格式如下:
[public | protected | private ] [static] [final] type variableName; //成员变量

成员方法

[public | protected | private ] [static] [final | abstract] [native] [synchronized] type methodName([paramList]) [throws exceptionList] { //方法体 }

静态(static)方法

用static修饰的属性是属于类的静态属性, 相应的成员变量为类变量

  1. 类变量的访问形式
  1. 给类变量赋初值
    默认赋值即可,也可以用静态初始化代码块 static{count=100;}
    //静态初始化代码的执行是在main方法执行前完成。
  2. 被static修饰的类成员特点:是共享数据, 随着类的加载而加载, 优先于对象存在, 被所有对象所共享, 可以直接被类名调用.

静态方法 (当功能内部没访问对象特有数据时使用)

用 static修饰的方法称为静态方法,也叫类方法. 在static方法中只能处理类变量,也可访问其它static方法,但绝不能直接访问任何归属对象空间的变量或方法.

tip: 创建某个工具类, 只提供相应的静态方法, 为了让某个类不能创建对象, 可以私有化构造函数.

理解this和super

出现在类的实例方法或构造方法中,this代表所在函数所属对象的引用 .用this作前缀可访问当前对象的实例变量或成员方法.

  1. this.实例变量;
  2. this.成员方法;
  3. this(参数),用来调用同类其他构造方法.注意this语句只能定义在构造函数的第一行,因为初始化要先执行.

而super和this差不多,都是一个引用指向自身和上一级父类罢了

对象初始化过程总结

  1. new 用到了class文件,所以先回找到class文件并加载到内存
  2. 执行类的static {}代码块
  3. 在堆内存中开辟空间,分配内存地址
  4. 在堆内存中建立对象的特有属性,病默认初始化
  5. 对属性显示初始化;
  6. 构造代码快初始化{};
  7. 构造函数初始化;
  8. 将内存地址赋给栈内存变量.

使用包组织类

在Java中为了防止类、接口、枚举和注释等命名冲突引用了包(package)概念,包本质上命名空间(namespace)。在包中可以定义一组相关的类型(类、接口、枚举和注释),并为它们提供访问保护和命名空间管理。

package语句定义包,package语句应该放在源文件的第一行,在每个源文件中只能有一个包定义语句,并且package语句适用于所有类型(类、接口、枚举和注释)的文件。定义包语法格式如下:package pkg1[.pkg2[.pkg3…]];

Java API简介: Java中按包来组织类.包的组织采用分层结构,与文件系统中的目录的组织对应一致.通常将逻辑相关的类放在同一个包中.
包将类的命名空间进行有效划分,同一包中不能有两个同名的类. Java系统提供的类库也成为Java API, 是系统提供的已实现的标准类的集合.

建立包

创建包就是在指定目录路径下创建一个 子文件夹 ,这个包中所有类的字节码文件将存放在该文件夹下.

方法1: 创建一个test子目录,将源程序文件存放到该目录,在该目录下利用javac编译源代码,或者在别处编译完程序后将字节码文件拷贝到该目录即可。
方法2: 采用带路径指示的编译命令: 格式:javac –d destpath Point.java

编译器将自动在destpath指定的目录下建一个test子目录,并将产生的字节码文件保存到该子目录下

典型用法是源程序放在当前目录下,
用如下命令编译 javac –d . Point.java
编译后将在当前目录自动创建test子目录

包的引用

  1. 在引用类时使用包名作前缀例 :new java.util.Date()
  2. 用import语句加载需要使用的类。例:import java.util.Date; 然后在程序中可以直接通过类名创建对象, 如:new Date();
  3. 用import语句加载整个包, 用*号代替类名位置。 它将加载包中的所有的类。例:import java.util.*;

小知识:使用javadoc制作帮助文档 
javadoc -d destpath -version -author Tools.java

封装性与访问控制

Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有


Java类成员的访问控制

提示 访问类成员时,在能满足使用的前提下,应尽量限制类中成员的可见性,访问级别顺序是:私有级别→默认级别→保护级别→公有级别。

对象销毁

对象不再使用时应该销毁。C++语言对象是通过delete语句手动释放,Java语言对象是由垃圾回收器(Garbage Collection)收集然后释放,程序员不用关心释放的细节。自动内存管理是现代计算机语言发展趋势,例如:C#语言的垃圾回收,Objective-C和Swift语言的ARC(内存自动引用计数管理)。

垃圾回收器(Garbage Collection)的工作原理是:当一个对象的引用不存在时,认为该对象不再需要,垃圾回收器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。

上一篇 下一篇

猜你喜欢

热点阅读