类(class)是构造对象的模板或蓝图。前端
对象表示一个能够明确标识的实体。每一个对象都有本身独特的标识、状态和行为。
对象的状态(特征或属性,即实例变量),由该对象的数据域来表示。
对象的行为(对象执行的动做,即功能),由方法来定义。java
每一个类都有构造方法。若是没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在建立一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类能够有多个构造方法。
下面是一个构造方法示例:编程
public class Puppy{ public Puppy(){ } public Puppy(String name){ // 这个构造器仅有一个参数:name } }
对象是根据类建立的。在Java中,使用关键字new来建立一个新的对象。建立对象须要如下三步:安全
下面是一个建立对象的例子:编程语言
public class Puppy{ public Puppy(String name){ //这个构造器仅有一个参name System.out.println("小狗的名字是 : " + name ); } public static void main(String[] args){ // 下面的语句将建立一个Puppy对象 Puppy myPuppy = new Puppy( "tommy" ); } }
经过已建立的对象来访问成员变量和成员方法,以下所示:ide
/* 实例化对象 */ Object referenceVariable = new Constructor(); /* 访问类中的变量 */ referenceVariable.variableName; /* 访问类中的方法 */ referenceVariable.methodName();
Java语言提供了不少修饰符,主要分为如下两类:函数
修饰符用来定义类、方法或者变量,一般放在语句的最前端。线程
Java中,可使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不一样的访问权限。设计
咱们能够经过如下表来讲明访问权限:指针
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不一样包) | 其余包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | Y/N | N |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |
为了实现一些其余的功能,Java 也提供了许多非访问修饰符。
synchronized 和 volatile 修饰符,主要用于线程的编程。
静态变量:
static 关键字用来声明独立于对象的静态变量,不管一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表获得数据,而后计算这些数据。
对类变量和方法的访问能够直接使用 classname.variablename 和 classname.methodname 的方式访问。
final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被从新赋值。被 final 修饰的实例变量必须显式指定初始值。
final 修饰符一般和 static 修饰符一块儿使用来建立类常量。
final 方法
类中的 final 方法能够被子类继承,可是不能被子类修改。
声明 final 方法的主要目的是防止该方法的内容被修改。
final 类
final 类不能被继承,没有类可以继承 final 类的任何特性。
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装能够被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须经过严格的接口控制。
封装最主要的功能在于咱们能修改本身的实现代码,而不用修改那些调用咱们代码的程序片断。
适当的封装可让程式码更容易理解与维护,也增强了程式码的安全性。
封装的优势
继承的概念
继承是java面向对象编程技术的一块基石,由于它容许建立分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具备父类的实例域和方法,或子类从父类继承方法,使得子类具备父类相同的行为。
多态是同一个行为具备多个不一样表现形式或形态的能力。
多态就是同一个接口,使用不一样的实例而执行不一样操做
多态性是对象多种表现形式的体现。
多态存在的三个必要条件
多态的实现方式
方式一:重写:Java 重写(Override)与重载(Overload)。
方式二:接口
方式三:抽象类和抽象方法
重载: 发生在同一个类中,方法名必须相同,参数类型不一样、个数不一样、顺序不一样,方法返回值和访问修饰符能够不一样,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;若是父类方法访问修饰符为 private 则子类就不能重写该方法。
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 必定不能修改 |
返回类型 | 能够修改 | 必定不能修改 |
异常 | 能够修改 | 能够减小或删除,必定不能抛出新的或者更广的异常 |
访问 | 能够修改 | 必定不能作更严格的限制(能够下降限制) |
== : 它的做用是判断两个对象的地址是否是相等。即,判断两个对象是否是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
equals() : 它的做用也是判断两个对象是否相等。但它通常有两种使用状况:
举个例子:
public class test1 { public static void main(String[] args) { String a = new String("ab"); // a 为一个引用 String b = new String("ab"); // b为另外一个引用,对象的内容同样 String aa = "ab"; // 放在常量池中 String bb = "ab"; // 从常量池中查找 if (aa == bb) // true System.out.println("aa==bb"); if (a == b) // false,非同一对象 System.out.println("a==b"); if (a.equals(b)) // true System.out.println("aEQb"); if (42 == 42.0) { // true System.out.println("true"); } } }
说明:
hashCode()介绍
hashCode() 的做用是获取哈希码,也称为散列码;它其实是返回一个int整数。这个哈希码的做用是肯定该对象在哈希表中的索引位置。
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
散列表存储的是键值对(key-value),它的特色是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(能够快速找到所须要的对象)
为何要有 hashCode
咱们先以“HashSet 如何检查重复”为例子来讲明为何要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其余已经加入的对象的 hashcode 值做比较,若是没有相符的hashcode,HashSet会假设对象没有重复出现。可是若是发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。若是二者相同,HashSet 就不会让其加入操做成功。若是不一样的话,就会从新散列到其余位置。(摘自《Head first java》第二版)。这样咱们就大大减小了 equals 的次数,相应就大大提升了执行速度。
经过咱们能够看出:hashCode() 的做用就是获取哈希码,也称为散列码;它其实是返回一个int整数。这个哈希码的做用是肯定该对象在哈希表中的索引位置。hashCode() 在散列表中才有用,在其它状况下没用。在散列表中hashCode() 的做用是获取对象的散列码,进而肯定该对象在散列表中的位置。
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口一般以interface来声明。一个类经过继承接口的方式,从而来继承接口的抽象方法。
接口并非类,编写接口的方式和类很类似,可是它们属于不一样的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,不然该类要定义接口中的全部方法。
接口没法被实例化,可是能够被实现。一个实现接口的类,必须实现接口内所描述的全部方法,不然就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们能够成为一个空指针,或是被绑定在一个以此接口实现的对象。
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
用途:
在平常的第三方应用开发过程当中,常常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就能够利用Java的反射机制经过反射来获取所需的私有成员或是方法。固然,也不是全部的都适合反射,以前就遇到一个案例,经过反射获得的结果与预期不符。阅读源码发现,通过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,不然返回实际值起到保护用户的隐私目的。
反射机制的相关类
与Java反射相关的类以下:
类名 | 用途 |
---|---|
Class类 | 表明类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 表明类的成员变量(成员变量也称为类的属性) |
Method类 | 表明类的方法 |
Constructor类 | 表明类的构造方法 |