静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
所有的Java程序都以类class为组织单元
面向对象三大特征:封装、继承、多态
防止该类的代码和数据被外部类定义的代码随机访问
成员变量一般设为private,使用setter和getter访问
成员变量和局部变量区别使用this关键字,this关键字只能在方法内部使用。
向上转型:通常基类在顶部,而导出类在其下部散开,因此转型为一个基类就是在继承图中向上移动,即向上转型,更泛化的类型。
向下转型:同上,向下转为更具体的类型。
向上转型是安全的,向下转型几乎是不安全的,需要进行运行时检查,可以通过参数化类型机制解决,即泛型。
通过 extends 关键字可以声明一个类是从另外一个类继承而来的。
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
class 子类 extends 父类 {}
所有的类都是继承于java.lang.Object
super关键字:实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
final 关键字声明类可以把类定义为不能继承的
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
类如果不含公有或受保护的构造器无法被继承。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态存在的三个必要条件:继承、重写、父类引用指向子类对象
多态的实现方式:重写、接口、抽象类和抽象方法
重写(Override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
返回类型、方法名、参数类型及个数都要与父类相同
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
访问权限不能比父类中被重写的方法的访问权限更低。
当需要在子类中调用父类的被重写方法时,要使用super关键字。
重载(Overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
使用abstract修饰
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
如果一个类包含抽象方法,那么该类必须是抽象类。
任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
interface 接口名[extends 父接口1,父接口2,…]//可多继承
{0~多个常量定义//变量隐式为public staticfinal
0~多个抽象方法定义…//只能用public abstract修饰
}
class 类名 extends 父类 imlements 接口1,接口2,…{…}
接口没有构造方法
接口支持多继承
接口不能包含成员变量,除了static final 变量
接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
标记接口
最常用的继承接口是没有包含任何方法的接口。
标识接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
标识接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。
抽象类和接口的区别
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
java 1.8开始支持接口中定义静态方法、可以有default方法。
C++ |
Java |
虚函数(可被基类引用) |
普通函数 |
纯虚函数 |
抽象函数 |
抽象类 |
抽象类 |
虚基类 |
接口 |
Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
package pkg1[.pkg2[.pkg3…]]; //创建
import package1[.package2…].(classname|*); //使用
系统中的包
java.(功能).类
java.lang.(类) 包含java语言基础类
java.util.(类) 包含java中各种工具类
java.io.(类) 包含输入、输出相关功能类
l 无参构造器为默认构造器,定义构造器系统将不会自动创建默认构造器。
l 可以用this调用一个构造器(不能调用两个,类似于super调用父类构造器),必须将调用置于最起始位置。
l finalize()方法,虚拟机释放对象空间前自动调用该方法,不能直接调用,不等于析构函数,垃圾回收只与内存有关,尽量不使用finalize方法。
l 静态块:用static声明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
父类静态成员和静态块、子类静态成员和静态块、父类构造方法、子类构造方法