→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

<Java SE 详解> 序列二-

1、类是一种抽象的概念,对象是类的一种具体表现形式,是具体的概念。先有类,然后由类来生成对象(Object)。对象又叫做实例(Instance);

 

2、类由两大部分构成:属性及方法。属性一般由名词表示,方法一般由动词表示;

 

3、如果一个Java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,换句话说,定义的多个类可以都不是public的;

 

4、在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递的方式统一是值传递(pass by value),Java中没有传引用(pass by reference)的概念

 

5、方法重载(Overload):表示两个或多个成员方法名称相同,但是方法参数不同。方法参数不同有三重含义:1> 参数个数不同; 2> 参数类型不同; 3> 参数顺序不同。

  注意:方法的返回值对重载没有任何影响,即方法的返回值不是方法的signature,但是方法重写(Override)需要有一致的方法返回值;

 

6、构造方法重载:只需看参数即可。如果想在一个构造方法中调用另外一个同类中的构造方法,那么可以使用this(...)的方式调用,this(...)括号中的参数表示目标构造方法的参数列表。this(...)必须要作为构造方法的第一个语句,换句话说,this()之前不能有任何可执行的代码;

 

7、继承(Inheritance):Java是单继承的,意味着一个类智能从另一个类继承(父类,基类 base class),Java中继承使用extends关键字;

 

8、当生成子类对象时,Java默认首先调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象。接下来再去调用子类的构造方法,生成子类的对象。要想生成子类对象,首先需要生成父类的对象,没有父类对象就没有子类对象。比如说:没有父亲就没有孩子;

 

9、super关键字:super表示对在子类对象生成之前首先生成的父类对象的引用。

 

10、如果子类使用super(...)显式的调用父类的某个构造方法,那么在执行的时候就会寻找与super(...)所对应的构造方法,而不会再去寻找父类的不带参数的构造方法。与this一样,super也必须要作为子类构造方法的第一条执行语句,前面不能有其他任何语句;

 

11、关于继承的3点:

  a> 父类有的,子类也有;

  b> 父类没有的,子类可以增加;

  c> 父类有的,子类可以改变。

 

12、关于继承的注意事项:

  a> 构造方法不可被继承;

  b> 方法和属性可以被继承;

  c> 子类的构造方法隐式的调用父类的无参构造方法;

  d> 当父类没有不带参数的构造方法时,子类需要使用super(...)方式来显式地调用父类的构造方法,super指的是对父类对象的引用;

  e> super(...)语句必须是子类构造方法中的第一行语句。

 

13、方法覆写(Override):必须是子类与父类的某一个方法

  a> 返回类型一致

  b> 方法名称一样;

  c> 参数数量、类型、顺序一致;

这样我们就说子类与父类的方法构成了覆写关系;

覆盖与覆写概念的区别:

  覆盖与覆写两个概念是在C#中被区别的,但是在Java中统一被指定为覆写,而对于实例方法没有覆盖的概念,对于类方法仅仅是覆盖概念

  1、覆盖:派生类不能删除它所继承的任何成员,但是它可以隐藏他们;但是当用基类引用指向子类对象的时候,通过基类接口仅仅能访问基类对象中原有的成员,而不能访问在对象的子类部分中相同签名的成员,如例1。但是这种情况使用的不多,多数是使用覆写;

  2、覆写:比覆盖的概念更进一步,覆写可以使基类的引用访问“升至”派生类内部。即通过基类接口可以访问对象的子类部分中“相同签名的成员”,但此时不能再访问基类中相同签名的成员,这意味着基类中的相同签名的成员仿佛已经不存在了,存在的只有子类中的成员,但是在子类的内部还是可以使用basesuper关键字去访问基类中的同签名成员。

  注意:不论是覆盖还是覆写均可以使用basesuper关键字去指向父类对象中的成员。

覆写与覆盖区别的例子:

覆盖:(C#代码)

using System;

namespace super
{
class Program
{
static void Main(string[] args)
{
SomeClass sc = new OtherClass(); //使用子类中掩盖的成员
sc.Method1(sc.Field1); //使用子类中掩盖的成员
//输出的是"SomeClass.Method1: SomeClass Field1"
}
}
class SomeClass
{ //基类
public string Field1 = "SomeClass Field1";
public void Method1(string value)
{
Console.WriteLine("SomeClass.Method1: {0}", value);
}
}

class OtherClass : SomeClass
{ //子类
new public string Field1 = "OtherClass Field1"; //隐藏基类成员变量
new public void Method1(string value)    //隐藏基类成员方法
{
Console.WriteLine("OtherClass.Method1: {0}", value);
}
}
}

覆写:(Java代码)

package cn.edu.bupt.baseKnowledge;

public class OverrideTest {
public static void main(String[] args) {
SuperClass sc = new DerivedClass();
sc.print(); //打印 "in the super class \n in the derived class"
}
}

class SuperClass {
public void print() {
System.out.println("in the super class");
}
}

class DerivedClass extends SuperClass {
public void print() {
super.print();
System.out.println("in the derived class");
}
}

 

14、方法覆写和方法重载之间的关系:重载发生在同一个类内部的两个或多个方法;覆写发生在父类和子类之间,覆写一定是伴随着继承过程发生的;

  Overload方法时:方法需要具有相同的signature(name, plus the number and type of its parameters)即可;

  Override方法时:两个类中的方法不但需要具有相同的signature,而且需要具有相同类型的返回值。

15、当两个方法形成了覆写的关系时,可以在子类成员方法中通类似于过super.run()的方式调用父类中的run()成员方法,其中super.run()不必放在子类成员方法中的第一行语句,因为此时父类对象已经构造完毕,可以在需要调用的地方调用即可,先调用父类的run()成员方法还是先调用子类的run()方法是根据程序的逻辑决定的;

 

16、在定义一个类的时候,如果没有显式的指定该类的父类,那么该类就会继承于java.lang.Object类(JDK提供的一个类,Object类是Java中所有类的直接或间接父类)。

 

17、多态(Polymorphism):我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的实例对象。说白了就是一句话:子类就是父类,但父类不是子类。  十八-30:00

 

18、多态是运行期的行为而不是编译期的行为;

posted on 2012-02-14 20:12  阿童沐  阅读(291)  评论(0)    收藏  举报