一 绪论
-
Java特性:
①跨平台:一个应用程序能够运行于不同的操作系统平台。利用Java虚拟机实现,运行于操系统之上,解释Java编译后的.class字节码。
②面向对象:利用类和对象的机制将数据和方法封装在一起,通过统一的接口与外界交互,通过类的继承机制实现代码重用。
③可靠性:异常处理、垃圾回收机制。
④安全性:域管理,本地代码和远程代码都可以通过配置策略设定可访问的资源域。
⑤多线程
⑥支持分布式网络应用 -
对C/C++的改进:
-
Java包:
二 Java语言基础
基础复习:简介,命名规范,数据类型,变量,控制结构,数组,Scanner等。
Java语言的字符集采用16位Unicode字符编码,其前128个字符与ASCII字符集相同,之后是拉丁语、希腊语、汉字等。
-
关键字:
public, class, new, static, void等
-
标识符:用户定义的单词。以字母、
_
、$
开头的,字母、数字、_
、$
组成的序列。不能使用关键字。 -
基本数据类型
-
变量和常量
-
运算符:
算术运算符:++,–只能作用于整数类型和字符类型,不能作用于表达式。
关系运算符
位运算符:位运算。
逻辑运算符:对布尔类型进行与 或 非 异或
,运算结果为布尔类型,整数不能进行逻辑运算(!0
错)。
赋值运算符:=,可以与算数、逻辑、位运算符组合成复合赋值运算符。
类型强制转换符:(int) 表达式
。整数类型不能转化为布尔类型(boolean a = 1
错)
条件运算符:? :
括号运算符、字符串连接运算符、点运算符、new运算符。 -
流程控制语句:
-
数组:==引用类型,一个数组变量引用一个数组。==用
new
动态申请数组存储空间,Java根据其数据类型对其初始化。int[] a = new int[length];或 int a[] = new int[length];
-
静态方法:Java没有全局函数,函数声明在类中,称为成员方法,有静态方法和实例方法。
Java Application程序从main()方法开始执行,只能被虚拟机调用。
参数传递:方法调用时,实际参数向形式参数传值,如果是基本数据类型则传递值,引用数据类型传递引用。 -
方法重载:一个类中如果有多个同名方法但带有不同的参数列表(参数类型、个数、次序不同),称为方法重载。
不能用返回值区分,即不能存在两个参数列表相同,返回值不同的方法。因为调用的时候编译器不知道调用哪一个。返回值类型可以改变。
-
递归方法:一个方法本身直接或间接的调用自己。
必须满足:①边界条件(至少有一条初始定义是非递归的);②递推通式 -
字符串:String类,引用类型。存储字符串常量,连接字符串时要重新分配空间保存运算结果字符串。
三 类的封装继承和多态
面向对象基础:类、封装、继承、重写和重载、多态、抽象类、接口、包
- 类是引用数据类型,一个对象引用一个实例,含义为对象保存该实例的引用信息,包括首地址、存储单元的存储结构、引用计数等。两个对象之间的赋值是引用赋值,传递的是对象引用,使得两个对象引用同一个实例,没有创建新的实例。
封装
-
构造方法:创建类的一个实例并对实例的成员变量进行初始化。方法名与类名相同,通过new调用,没有返回值(因为返回对象实例),可以声明多个构造方法。
Java提供默认构造方法(无参数),对各成员变量按其数据类型初始化。如果类声明了构造方法,则Java不再提供默认的。 -
拷贝构造方法:其形式参数是实例。
MyClass mc = new MyClass(1); //实例化一个对象
MyClass mc2 = new MyClass(mc); //用mc复制实例
-
析构方法:
public void finalize()
释放实例,并执行特定操作。Java有资源回收机制,通常不需要析构方法。 -
this引用:this指向调用该方法的对象。①构造器中,引用该构造器正在初始化的对象。②方法中,引用调用该方法的对象。
java 对象的this引用
static修饰的方法中不能使用this引用。
1、static修饰的方法是可以通过类来直接调用的,可以在无实例的情况下调用该方法,此时如果方法中有this,则指向的对象可能根本不存在。
2、static修饰的方法中不能使用this引用,所以static修饰的方法不能访问不使用static修饰的普通成员。
3、java规定,静态成员不能直接访问非静态成员。
4、如果确实需要在静态方法中访问另一个普通方法,则只能重新创建一个对象。 -
equals和==:equals与==的区别
-
静态成员:类中的成员分为静态成员(static修饰)、实例成员。
静态成员属于类,没有创建实例也可以通过类名访问静态成员变量(也能通过对象引用),调用静态成员方法。静态成员方法体内不能访问实例成员,不能使用this。不能声明方法的局部变量为static(static在静态存储区,是共享的。局部变量在动态存储区,且只在方法块中有意义,声明static没意义)。
实例成员属于对象,只有创建了实例才能通过对象访问。
static/final/abstract/interface -
浅拷贝和深拷贝:对于基本数据类型,浅拷贝能够赋值实例(新的存储空间);对于引用数据类型,浅拷贝不能复制对象实例(复制对象指向通一个实例),需要深拷贝。
继承
-
单继承(一个类只能继承一个父类,但可以继承多个接口;不指定继承时,父类是Object)。
-
继承原则:
子类继承父类所有成员变量(包括实例成员变量、静态成员变量)
子类继承父类除构造方法外的成员方法(实例成员方法、静态成员方法、析构方法)访问权限:
子类不能访问父类私有成员(private),能访问public,protected。能访问当前包中父类的缺省权限成员,不能访问其他包中父类的缺省权限成员。
子类不能重写父类的final方法。 -
super():子类用super()调用父类构造函数。
- 子类中所有的构造函数都会默认访问父类中的空参数构造函数,因为子类的构造函数内第一行都有默认的super()语句,super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。
一个类都会有默认的空参数的构造函数,若指定了带参构造函数,那么默认的空参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为父类中没有空参数的构造函数。因此,必须在子类的构造函数中通过this或super(参数)指定要访问的父类中的构造函数。
子类不可以继承父类的构造方法 - 子类默认调用父类构造函数调用的原因是,父类可能有私有字段需要由其构造函数初始化。
java中的父类和子类的构造函数 - 这也是为什么final不能修饰构造函数,因为构造方法不是被继承的,所以用final修饰无意义。
- 子类中所有的构造函数都会默认访问父类中的空参数构造函数,因为子类的构造函数内第一行都有默认的super()语句,super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。
多态
-
子类重定义父类:①重定义父类成员变量,则隐藏父类成员变量(可以用
super.成员变量
引用父类同名成员变量)。②重定义父类成员方法,如果参数列表和返回值类型都相同,则覆盖父类成员方法。如果参数列表不同,则重载父类成员方法。如果参数列表相同而返回值类型不同,编译器报二义性语法错误。 -
根据何时确定执行多态方法中的哪一个,分为编译时多态,运行时多态。
编译时多态:①方法重载,根据实际参数的类型、个数、次序,在编译时能够确定执行重载方法中的哪一个。②方法覆盖,当对象引用本类实例时为编译时多态,否则是运行时多态。运行时多态:父类对象引用子类实例时,在运行时确定所引用对象的实际类型。
-
多态的实现:重载、重写、接口、抽象类和抽象方法;
抽象类
abstract
修饰,抽象类方法只有方法声明没有方法体(有方法体编译器会报错)。- 抽象类不能被实例化。
- 抽象类不一定全是抽象方法。有抽象方法的类必须声明为抽象类。
- 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
- 构造方法、静态成员方法不能声明为抽象方法。
java的抽象方法为什么不能是static、final、private?
我们只定义静态static方法完全OK,因为静态方法是属于类的,所以静态方法必须满足给类调用,如果通过类无法调用,那么这种静态方法肯定是不对的。为了达到这一要求,static方法就必须有方法体,即已经实现了,也就不是抽象方法了。所以静态(static)方法不能是抽象方法,即abstract不能与static同时修饰方法。即没有类抽象方法。
最终类
final
修饰,最终类不能被继承。最终方法不能被子类重写。- 非最终类可以包含最终方法。
四 接口 内部类 泛型
接口
- 接口interface,一组抽象方法(默认都用abstract修饰,所以接口中不能有构造方法)、常量和内嵌类型的集合。可被多个类继承,接口声明的抽象方法在实现接口的多个类中表现出多态性。
- 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个类可以实现多个接口。
- 接口不能包含成员变量,除了 static 和 final 变量。(接口中的变量会被隐式的指定为 public static final 变量)
- 一个接口能继承另一个接口,使用extends关键字。一个接口可以继承多个父接口
public interface People extends A,B,C
。 - 抽象类一般包含多个子类都能使用的方法,接口约定多个互不相关的类之间共同使用的方法。
类只能继承一个抽象类,类能实现多个接口;接口能继承多个接口。
抽象类可以给出部分实现,包括构造方法等;接口没有实现部分,也不能有构造方法。
内部类
-
内部类:在一个类内部进行其他类结构的嵌套操作。
不能与外层类型同名,内部类成员可以与外部类成员同名。
内部类可以继承父类或实现接口。 -
优点:
内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
内部类是另外一种封装,对外部的其他类隐藏。
内部类可以实现java的单继承局限。 -
Java内部类的定义、如何创建内部类、内部类的分类、内部类与外部类的关系
创建:
①在外部类外部 创建非静态内部类
语法:外部类.内部类 内部类对象 = new 外部类().new 内部类();
举例:Outer.Inner in = new Outer().new Inner();
②在外部类外部 创建静态内部类
语法:外部类.内部类 内部类对象 = new 外部类.内部类();
举例:Outer.Inner in = new Outer.Inner();
③在外部类内部创建内部类语法
在外部类内部创建内部类,就像普通对象一样直接创建:Inner in = new Inner();
-
Java中内部类主要分为成员内部类、静态内部类、方法内部类、匿名内部类
泛型
- 是对类型系统的一种强化措施,通过为类、接口、方法设置类型参数,泛型使一个类或一个方法可在多种类型的对象上进行操作,从而减少类型转化。