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.闭包和回调

闭包是一种能被调用的对象,它保存了创建它的作用域的信息,我们可以将非静态内部类当成面向对象领域的闭包。

通过闭包,可以实现回调。所谓的回调,就是某个方法一旦获得了内部类对象的引用后,就可以在合适的时候反过来调用外部类实例的方法。所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法

 

posted @ 2017-10-24 20:43  mesakii  阅读(139)  评论(0编辑  收藏  举报