java对象和类
类
类是构造对象的模板,由类构造对象的过程称为创建类的实例,由java编写的所有代码都位于某个类的内部。
封装
封装是与对象有关的重要概念,形式上看封装只是将数据和行为组合在一个包内,并对对象使用者隐藏了数据的实现方式。
对象中的数据称为实例域,操纵数据的过程称为方法。每个特定的类实例对象都有一组特定的实例域值,这些值的集合就是这个对象的当前状态。
实现封装的关键在于绝不能让类的方法直接访问其他类的实例域,程序仅通过对象的方法域对象数据进行交互
对象
对象的三个特征:行为,标识,状态
同一个类的所有对象实例,由于支持相同的行为而具有家族式的相似性,对象的行为是用可调用的方法定义的。
状态:每个对象都保存着描述当前特征的信息,这就是状态,对象状态的改变必须通过调用方法来实现(若可以不调用方法就可以改变对象状态,就是说明封装性遭到破环)。
标识:对象的状态并不能完全描述一个对象,每个对象都有一个唯一的身份(标识),作为一个类的实例,每个对象的标识永远是不同的,状态也存在差异
设计类
在面向对象的程序设计时没有所谓的定都main函数开始,而是先从设计类开始,然后再往每个类中添加方法。
识别类的简单规则:寻找名词,方法对应动词
类之间的关系
依赖(users-a):一个类的方法操纵另一个类对象,就是依赖
应尽可能将相互依赖的类降至最少,即令类之间的耦合度最小
聚合(has-a):类A的对象包含类B的对象
继承(is-a):是一种比总是特殊与一般关系的
java中使用类
java中没有类就无法做任何事情,但并不是所有类都有面向对象特征的,例Math类,Math类只封装了功能,没有数据,也不必担心生成对象以及初始化实例域。
对象与对象变量
想要使用对象必须先构造对象,并指定初始状态,然后对对象应用方法。
java中,使用构造器构造新实例,构造器名字与类名一样,想要构造一个Date对象,就需要在构造器钱买你加上new操作符,返回了该对象的引用。
可以将其保存在对象变量中,在栈内存中的对象变量指向了堆内存中的Date对象,对象变量没有实际包含一个对象,仅仅是引用一个对象。java中任何对象变量的值都是对存储在另一个地方的一个对象的引用。局部变量不会自动初始化位null,必须通过new操作符或将他们设置位null进行初始化
自定义类
设计复杂应用程序需要各种主力类,通常这些类中没有main方法,却有自己的实例域和实例方法,想要创建一个完整的程序,应将若干类组合在一起,其中有一个类有main方法
在一个类中只能有一个公共类,可以有任意数目的非公共类,
class ClassName{
}
构造器(方法):
与类同名,在构造对象的时候,构造器就伴随new操作符的执行被调用,为实例域赋初值。每个类有默认无参的构造器并可以有多个构造器,其参数不同(方法的重载),构造器没有返回值,在自己设置了有参构造器的时候会默认的无参构造器不会生效,需要手动将其写出来
隐式参数与显式参数:
显式参数是出现在方法名后括号中的参数
隐式参数(方法的调用者也叫方法调用的目标或接收者)是在调用方法名前的类对象,在每个方法中关键字this代表隐式参数,可以不写
基于类的访问权限
方法可以调用所调用对象的私有数据,一个方法可以访问所属类的所有对象的私有数据
私有方法
在实现一个类时,由于公共数据非常危险,所以应该将所有数据域都设置为私有的,在某些情况下,方法也可能设计为私有的。
有时,当希望将一个程序划分成若干个独立的辅助方法,通常这些方法不应该成为共有接口的一部分,由于特们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序,这样的方法最好设计为私有的
只要方法是私有的,他就不会被外部的其他类操作调用,可以将其删去。
final实例域
实例域可以定义为final的,构建对象时必须初始化这样的域,必须确保在每一个构造器执行后,这个域的值被设置,并且在之后的操作中,不能再对其修改赋值。
final修饰符大都应用于基本数据类型,或不可变类的域,如果类中的每个方法都不回改变其对象,这种类就是不可变的类,例:String类
静态域于静态方法:
静态域:
将域定义为static,则每个该类对象都会共享该静态域,静态域属于类不是与任何独立的对象。
静态常量:
如果没有static,那么只有final修饰的常量就是该类的一个实例域,需要通过类实例来访问,并且每个对象都有自己的一份拷贝,System.out.print其内部就是 public static final PrintStream out=...,因为声明为final所以无法将其他打印流赋给它。(System类中的setOut方法时一个本地方法,不是java语言实现的,本地方法可以绕过java的语言存取控制机制)
静态方法:
是一种不能向对象实施操作的方法,其没有隐式参数(方法的调用者),静态方法不能访问实例域,因为其不能操作对象,但是它能操作自身类中的静态域
使用静态方法的两种情况:
1.方法中不需要访问对象的状态,其所需要的参数都是通过显式参数提供的
2.方法只需要访问类的静态域
工厂方法
在类中return返回 new了一个对象,并提供了一系列的方法让调用者可以调用其中的某个方法就能获取想要的结果
静态工厂方法的使用主要有两个原因:
1.构造器方法必须于类同名,只能使用重载,容易出现错误
2.使用构造器时,无法改变所构造的对象类型
方法的参数
java程序设计语言对对象采用的时按值传递(表示方法接收的是调用者提供的值),引用调用(方法接收的是调用者索提供的变量地址)
java中方法参数的使用:
1.一个方法不能修改一个基本数据类型的参数(在方法中对参数进行修改,但在外部调用时,该参数值并未发生改变,因为在方法中调用时是使用的参数的拷贝)
2.一个方法可以改变一个对象参数的状态(当参数是对象的引用时,通过拷贝的引用操作对象,对象的状态会发生改变)
3.一个方法不能让对象参数引用一个新的对象(将两个对象参数在内部交互引用,但交换引用的依旧是拷贝,在方法外则没用了)
对象构造
对象的构造就是为了定义对象的初始状态,对象的构造有多种机制
重载
有相同的名字,不同的参数,便产生了重载,调用构造器时根据参数不同来匹配调用相应的构造方法
无参构造器
会默认提供一个无参构造器,其状态会设置为适当的默认值(默认域初始化,域与局部变量的不同,必须明确地初始化方法中的局部变量,但是如果没有初始化类中的域,将会被自动化为默认值)。
如果类中重载了有参构造方法,而调用无参构造方法,则会报错,必须手动写出无参构造方法
显示域初始化
通过重载类的构造方法,可以采用多种形式设置类的实例域的初始状态,确保不管怎样调用构造器,每个实例都可以被设置为一个有意义的初值。
在执行构造器之前,会先执行赋值操作。
调用另一个构造器
可以使用this关键字调用另一个构造器,可以使对公共构造器代码部分只编写一次
初始化块
java一共有3种初始化数据的方法:
在构造器种设置值
在声明种赋值
初始化块:在一个类的声明种可以包含多个代码块,只要构造类的对象,这些类就会被执行
如果对类的静态域进行初始化比较复杂则可以使用静态初始化块,在类第一次加载时,将会执行对静态域的初始化,否则默认的初始值是0,false或null。
所有静态初始化语句以及静态初始化块都依照类定义的顺序执行