JavaSE———类与对象

来源:互联网 发布:网络打假教程 编辑:程序博客网 时间:2024/05/26 09:57
java语言和c语言中的char类型的区别?
java中char类型以Unicode编码,占两个字节
C语言中的char类型以ASCII码表示,占一个字节
编辑器操作java文件,解释器加载类(.class)

封装

数据隐藏,将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的具体实现方式

实例域(属性)——对象中的数据

方法(函数)——操纵数据的过程

封装的关键在于不能让类中的方法直接访问其他类中的数据(实例域),程序只通过方法进行数据交互

对象的主要特性

行为——可以对对象施加的方法

状态——施加方法后对象的响应

标识——辨别区分具有相同行为和状态的对象

注:状态影响行为(例如:一个状态是已收货的订单将拒绝删除行为)

类之间的关系

依赖(users-a)——一个类的方法操纵另一个类的对象

聚合(has-a)——A类对象中包含B类的对象

继承(is-a)——A类扩展了类B,A中不但有B的方法和属性,还有自己额外的功能和属性

注:减少依赖,会减少耦合度

构造器

一种特殊的方法,用于构造并初始化对象名字与类名一致,调用时使用new关键字

构造器总是伴随着new的执行而被调用,且不能对一个已经存在的对象调用构造器实现重新设置实例域

总结:与类同名、一个类中可以有多个【重载】、参数可以是0个和多个、没有返回值、伴随new执行被调用

注:类中没有编写构造方法,会默认提供一个无参构造;类中编写带参构造,就不会提供无参构造

调用构造器的具体步骤:

1.所有域被默认初始化为默认值

2.按照在类中声明出现的次序,依次执行所有初始化语句以及初始化块

3.如果构造器调用了另一个构造器,先执行另一个构造器主体

4.最后执行这个构造器主体

注:所有static修饰的初始化语句以及代码块都按照类加载的顺序而执行

变量和对象

新声明的对象并没有包含一个对象,可以为这个变量初始化一个对象,这时变量引用对象

注:java中所有对象都存在堆中,变量存在栈中

    两个相近有不相等的浮点值进行相减时,返回值可能是0

java中使用一个未初始化的变量会产生运行时错误,C++中使用未初始化的随机结果

更改器/访问器

更改器——setter,调用后,当前对象变化

访问器——getter,调用后,当前对象没有变化,只是获取一个结果值

源文件

一个源文件可以有多个类

只能有一个public修饰的公有类,可以有多个非公有类

源文件名和public类名一致

编译含有多个类的源文件将生成多个class文件

两个java源文件A.java和ATest.java,且ATest.java中调用了A类,两种编译的情况

1.javac A*.java ——> A.java和ATest.java都被编译

2.javac ATest.java——>A.java和ATest.java都被编译

javac时首先会编译出ATest.class类文件,ATest.class中使用了A,所以会去主动找A.class,如果找不到就找A.java,然后再将A.java文件编译成class文件

如果A.java文件后期修改了,java编译器也会重新自动编译A.java文件

隐式参数和显式参数

隐式参数——没有出现在方法的参数列表中,常用this关键字表示

显式参数——直接出现在参数列表中的参数

类中的访问器方法如果返回值是可变对象会破坏类的封装性

因为返回的是一个可变对象的引用(地址),很可能导致类的属性未经由方法调用就发生了改变

如果需要返回一个可变对象的引用,可以返回这个可变对象的克隆(e.g:strBuffer.clone())

一个类的方法可以访问这个类的所有对象的私有域

final关键字

修饰实例域(类的属性)——属性值不可改变,所以没有setXxx()方法

修饰基本数据类型和不可变类

修饰可变的类,这个变量是指对象的引用不可变,内容可以修改

static关键字(随类的加载而加载

修饰实例域(类的属性)——每个类中只有一个这样的实例域,但是这个类的所有对象都可以共享这个实例域,属于类,而不属于类对象

static final(静态常量)——PI、System.out等

修饰方法——不能向对象实施操作的方法,对类实施操作

参与运算时,不使用对象,所以没有隐式参数

静态方法不能操作非静态属性,因为静态方法不能操纵对象,但可以访问自身类中的静态属性

调用(类名调用、对象调用,但是执行结果和对象没有任何关系)

e.g:工厂方法、main方法(不操作对象,因为启动程序时还没有对象,main方法执行并创建程序需要的对象,常用于单元测试)

方法参数

java中总采用按值调用方法参数,参数值都是拷贝得来的,方法并不能修改任何参数变量的内容

当参数是对象引用时,只是将引用的地址值传过来(可以改变对象参数的状态,但是引用没变,并没引用一个新的对象,所以引用值并没有变化)

重载

多个方法,相同方法名,不同参数列表,和返回值类型没有关系

默认值

数值——0;布尔——false;对象——null

局部变量必须明确初始化;属性(实例域)如果没明确初始化,会自动初始化为默认值

初始化域

构造器中设置

声明时赋值

使用初始化代码块(构造类的对象时,优先执行初始化代码块,再执行构造方法)

finalize方法——回收资源

1.垃圾回收器清除对象前调用(实际应用中,很少使用,因为无法确定何时调用)

2.System.runFinalizerOnExit(true)方法确保finalizer方法在java关闭前调用,但是不安全

3.Runtime.addShutdownHook添加一个关闭钩

4.人工管理,调用close方法关闭资源

类设计技巧:

  1. 私有数据
  2. 对数据进行初始化
  3. 尽量少用基本数据类型(用类代替多个基本数据类型)
  4. 根据实际情况,编写域的访问器和更改器
  5. 职责过多的类可以适当分解成两个
  6. 优先使用不可变的类(一定程度上保证线程安全)







原创粉丝点击