9-30java

深入构造器

 //Demo11_struct

系统为这个对象的属性进行默认初始化,这种默认初始化把所有基本类型的属性设为0(对数值型属性),或false(对布尔型属性),把所有引用类型的属性设置为null

 如果在一个类内提供了多个构造器,就形成了构造器的重载,通常建议为Java类保留无参数的构造器。构造器一般设置为public以便其他的方法来访问。

 

继承

java创建某个类的对象时,系统会隐式地创建该父类的对象,只要有一个子类对象的存在,则一定存在一个与之对应的父类对象,

super和this一样,都不能出现在static的方法中,static修饰的方法时属于类的,而super和this是面向对象的

重载(overload):主要发生在同一个类的多种同名方法之间

重写(override):主要发生在父类与子类父类与子类的同名方法之间

非static的内部类不允许有static成员

 

多态

编译时类型和运行时类型不一致,就会出现所谓的多态。

baseclass ds = new subclass();

baseclass 为编译类型,而subclass为运行时类型

对象ds是无法执行父类未曾提供的方法的

java 和c++多态有几点不同:o,
1.java 里用基类引用指向子类,自动会调用子类方法。
2.C++ 里用基类指针指向子类,函数还是调用基类函数代码快,尽管数据是子类对象数据。pt=&grad1; pt->display();没有输出pay。
3.C++ 如果要实现多态的话要声明为虚函数。

子类其实是一种特殊的父类,因此JAVA允许把一个子类对象直接赋值给父类引用变量,无需任何类型转换,或者被称为向上转型(upcasting),向上转型由系统自动完成。

当把一个子类对象直接赋值给父类引用变量,例如上面的baseclass ds = new subclass();这个ds引用变量的编译时类型是BaseClass,而运行时类型是SubClass,当运行时调用该引用变量的方法时,其方法行为总是像子类方法的行为,而不是像父类的方法行为,这将出现相同类型的变量,执行同一方法时呈现出不同的行为特征,这就是所谓的多态。如果ds要调用子类具有的而父类不具有的方法,是不行的(除非用反射的办法),因为代码会在编译的时候发生错误。

引用变量在编译阶段只能调用其编译时类型所具有的方法,运行时则执行它运行时类型所具有的方法,因此,编辑java代码时,引用变量只能调用申明该变量时所用类里包含的方法,例如Object p = new Person();代码定义一个变量P。则这个P只能调用Object类的方法,而不能调用Person类里定义的方法。

 

引用变量的强制类型转换:

编译时类型 对象名 = new 运行时类型;

编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用的对象真的包含该方法,如果需要让这个引用变量来调用它运行时类型的方法,则必须将它强制类型转换为运行时类型,强制类型转换需要借助于类型转换运算符。

注意:

引用类型的转换只能把一个父类变量转换成子类类型,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误,如果把一个父类实例转化为子类实例,则必须这个对象实际上是子类实例才行(即编译时类型是父类类型,而运行时类型是子类类型), 

 

组合

如果需要复用一个类,除了把这个类当作基类来继承以外,还可以把该类当成另一个类的组合成份,从而允许新类直接复用该类的public方法,不管是继承还是组合,都允许在新类(对于继承就是子类)中直接复用旧类的方法。

组合相对于继承的不同之处在于,组合相当于把旧类对象作为新类的属性嵌入,用以实现新类的功能,用户看到的是新类的方法,而不能看到嵌入对象的方法。因此,通常需要在新类中使用private修饰嵌入对象

 

posted @ 2017-09-30 14:55  mesakii  阅读(157)  评论(0编辑  收藏  举报