10-24JAVA
1.instanceof
示例: A instanceof B
判断前面的对象是否为后面的类
返回 true 或者 false
bob instanceof (Student)
ex:
Object hello = "Hello"; hello instanceof Object; //返回true
2.继承与组合
继承可以实现类的重用,但是会破坏封装,因此在设计父类的时候应当注意
1.隐藏父类的内部数据,设置为private,不让子类访问
2.私有的方法,用private;必须给子类调用,但是不希望被重写,使用final;不希望被其它类访问,使用protect
3.尽量不要在父类的构造器中调用将要被子类重写的方法
组合:把该类当成另一个类的组合成分,允许新类直接复用该类的方法,
继承是对已有的类进行一番改造,以此获得一个特殊的版本,即将一个抽象的类改造成一个适用于某些特定需求的类,
组合是将一个类嵌入到另一个类中
继承需要符合 is - a 的关系,
组合需要符合has -a的关系
3.初始化块
初始化块没有名字也没有标识,以{...}的结构包裹,初始化块只在创建java对象的时候隐式执行,而且在执行构造器前执行。
声明的优先级大于赋值
ex:
{a=6;}int a = 9; System.out.println(a);
结果是9
而不是报错
实际的过程是:
int a;
a = 6;
a = 9;
初始化块不接受任何的参数
4.静态初始化块
static{ ...}
静态初始化块是为类服务的,因此静态初始化块总是会比一般的初始化块先执行。
系统加载并初始化某些类时,总是保证该类的所有父类(包括直接父类和间接父类)全部加载并初始化,
5.final
final 可以修饰变量,方法和类,系统不允许为final变量重新赋值,子类不允许覆盖父类的final方法,final类不能派生子类,因此,通过final可以实现不可变类
6.基本数据类型的包装类
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
7.将一个特定的字符串转化为基本类型变量
ParseXXX(String a)
ex:
String intStr = "123"; int it = Integer.parseInt(intStr); String floatString = "4.56"; float ft = Float.parseFloat(floatString);
String ftStr = String.valueOf(2.345f)
将基本类型转化为字符串的另一种方法:
//intStr为"5" String intStr = 5 + "";
8.toString
是一个实现自我描述的方法。该方法通常用于实现这样一个功能:当程序员直接打印该对象时,系统将会输出该对象的“自我描述”的信息,用以告诉外界该对象具有的状态信息
Object类提供的toString方法总能返回该对象实现类的类名+@+hashCode值,可以通过在类中添加public String toString{。。。}来改写真正的自我描述
9.==和equals比较运算符
==用于判断两个变量是否相等,若两个变量是基本类型的变量,且都是数字型,(不一定要求数值类型相同),都会返回true,当若为引用型变量,则它们必须指向同一对象才行,但使用equals则就算对象不同,也会返回true
10.static
static修饰的关键字就是类成员,static关键字不能修饰构造器,,static修饰的类成员属于整个类,不是属于单个实例的
11.java可以包含的六大成员:
{属性,方法,构造器,初始化块,内部类,枚举类}
static可以修饰属性,方法,初始化块,内部类和枚举类
以static修饰的成员就是类成员,类成员属于整个类,不属于单个对象
类属性的生存范围几乎等同于该类的生存范围,当类初始化完成后,类属性也初始化完成
类属性既可以通过类来访问,也可以通过对象来访问,但是对象访问类属性时,其实不是访问该对象该对象所具有的属性,因为当系统创建该类的对象时,是不会为类属性再一次分配内存的,也不会再一次对类属性进行初始化,
也就是说,对象根本不包括对应类的类属性,通过对象访问类属性只是一种假象,通过对象访问的依旧是该类的类属性,可以理解为,当通过对象来访问类属性时,系统会在底层转换为通过该类来访问类属性
!!!!C#不允许通过对象来访问类属性,对象只能访问实例属性,类属性必须通过实例来访问
!!!!类成员(包括方法、初始化块、内部类和枚举类)不能访问实例成员(包括属性、方法、初始化块、内部类和枚举类),因为类成员是属于类的,类成员的作用于比实例成员的作用于要大,
12.单例类
这个类始终只能创建一个实例,则这个类被称为单例类
做法:
以private修饰该类的构造器,使用一个属性来保存曾经创建的对象
ex:
class Singleton { //使用一个变量来缓存曾经创建的实例 private static Singleton intance; //以private修饰构造器,以达到隐藏构造器的目的 private Singleton(){} //创建一个方法,加入自定义的控制,保证只产生一个Singleton对象 public static Singleton getInstance() { if(instance == null) { instance = new Singleton; } return instance; } }
13.final 修饰符
final 修饰变量时,表示该变量一旦获得初始值后就不可改变,final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。
!!与普通成员变量不同的是,final成员变量(包括实例属性和类属性)必须由程序员显式地初始化,系统不会对final成员变量进行隐性的初始化
!!如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中进行对该final变量赋初始值,但只能赋值一次,不能重复赋值
!!final修饰的形参不能被赋值
!!final修饰的引用类型变量不能被重新赋值,但可以改变引用型变量所引用对象的内容
!!final修饰的方法不可被重写(不希望子类重写父类的方法时可以采用该方法),但是父类中为 private final void test();这样的形式时,说明这个方法只在当前类可见,对子类时不可见的,因此子类中出现public void test()时是合法的,因为这个是属于子类的方法
!!final类——不可以有子类
14.不可变类
创建该类的实例后该实例的属性是不可改变的
实现方法:
1.使用private和final修饰符来修饰该类的属性
2.提供带参数的构造器,用于根据传入参数来初始化类的属性
3.只含有getter()方法,不含setter方法
15.抽象类
抽象方法和抽象类必须由abstract修饰符定义,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法。
抽象类不能被实例化
public abstract void test(); //这是一个抽象方法 public void test(){} //这是一个普通的方法
抽象类不能创建实例,它只能当成父类来被继承,从语义上看,抽象类是从多个具体的类中抽象出来的父类,它具有跟高层次的抽象,从多个具有相同特征的类中抽象出一个抽象类,以这个类作为其子类的模板,从而避免了子类设计的随意性
16.更彻底的抽象:接口(interface)
接口不能包含普通方法,接口里的所有方法都是抽象方法
接口不提供任何实现,接口体现的是规范和实现分离的哲学
一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类
接口里不能包含构造器和初始化块定义,
接口里可以包含属性(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口)和枚举类定义
接口里的所有成员都必须以public修饰
系统自动为接口里定义的属性增加public static final修饰符,
系统自动为接口里的方法添加public abstract修饰符
一个接口可以同时继承多个父接口
接口体现的是一种规范
抽象类体现的是模板式设计
17.内部类
内部类提供了更好的封装
内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,但外部类不能访问内部类的实现细节
匿名内部类适用于创建那些仅需要一次使用的类
当调用非静态内部类实例时必须有一个非静态内部类实例,而非静态内部类实例必须寄存在外部类实例中
非静态内部类的对象必须寄存在外部类对象中,而外部类对象则不必一定有非静态内部类对象,即外部类对象存在不能说明内部类对象存在,但反之一定成立
外部类的静态方法、静态代码块不能访问非静态的内部类,包括不能使用非静态内部类定义变量,创建实例等,总之,不允许在外部类的静态成员中直接使用非静态内部类
静态内部类: 这个内部类时归属于外部类的而不是外部类的对象
局部内部类:内部类的定义在外部类的某个方法内,只属于该方法
匿名内部类:适合创建那种只需要一次使用的类,创建匿名内部类时会立刻创建一个该类的实例,这个类定义立刻消失,匿名内部类不能重复使用。
18.闭包和回调
闭包是一种能被调用的对象,它保存了创建它的作用域的信息,我们可以将非静态内部类当成面向对象领域的闭包。
通过闭包,可以实现回调。所谓的回调,就是某个方法一旦获得了内部类对象的引用后,就可以在合适的时候反过来调用外部类实例的方法。所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法