焦点热门:java第三章复习资料

2023-01-19 20:47:07 来源:哔哩哔哩

第三章(主要从Word复制编辑过来,格式可能有些问题,比如代码未缩进)

第三章


(相关资料图)

*继承:一个类继承于已有类的属性与行为,并可以增加新的属性与行为。Java只支持类的单继承,每个子类只能有一个直接父类,但是它可以有多个间接的父类。子类继承所有祖先的属性和行为,可以增加变量和方法,修改继承的方法(覆盖(override)/重载(overloading))

*继承的语法形式:

[修饰符] class SubClass/子类名 extendsSuperClass/父类名 {

类体

}

注:如果没有extends,则该类默认是 java.lang.Object(超级父类)的子类,使用super子类调用父类特定的构造方法。

*子类Sub继承了父类Base的哪些内容呢?分为两种情况:

 (1)当Sub和Base位于同一个package中:Sub继承Base中public、protected和默认访问级别的成员变量和成员方法。

 (2)当Sub和Base位于不同的package中:Sub继承Base中public和protected访问级别的成员变量和成员方法。

*覆盖:如果子类不需使用从超类继承来的方法的功能,则可以声明自己的同名方法,但方法具体实现不同,称为方法覆盖。 如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配(完全相同),则子类的方法就覆盖了父类的方法。

*方法覆盖的约束条件:

1. 子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型完全一致

2. 方法覆盖只存在于子类和(直接/间接)父类之间。在同一个类中方法只能被重载,不能被覆盖;

3. 子类方法不能抛出比父类方法更多的异常

4. 子类方法不能缩小父类方法的访问权限(可以放大);

5. 父类的private、final方法不能被子类覆盖;

6. 父类的static方法可以被子类覆盖为static方法,不能修改为非static方法,同理反向也不可以修改

7.父类的abstract方法可以被子类覆盖,两种途径:

子类直接实现父类的abstract方法;子类重新声明父类的abstract方法。

注:派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类。 

8. 父类的非abstract方法可以被子类覆盖为abstract方法。

*重载:是指类的多个方法(包括从父类继承的方法)的方法名相同,但参数不同,实现的功能有内在联系。

*重载方法必须满足的条件:

1.方法名相同;

2.方法的参数类型、个数、顺序至少有 1 项不相同;

3.方法的返回类型可以不相同;

4.方法的修饰符可以不相同;

例子:在Sample类中加入方法

public class Sample{

public void amethod(int i, String s){ }

//加入其他方法

}

下面哪些方法可以加入到Sample类中,并且保证编译正确呢?

A)public void amethod(String s, int i){} (可以)

B)public int amethod(int i, String s){return 0;} (不可以)

C)private void amethod(int i, String mystring){} (不可以)

D)public void Amethod(int i, String s) {} (可以)

E)abstract void amethod(int i); (不可以)

*方法重载与覆盖的异同

Overload和Override的相同点:

1. 都要求方法同名。

2. 都可以用于抽象方法和非抽象方法之间。

Overload和Override的不同点:

1. 方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致。

2. 方法覆盖要求返回类型必须一致,而方法重载对此不做限制。

3. 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。

4. 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。

5. 父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。

*构造方法与this/super

构造方法:是一种特殊的成员方法,用于创建对象(new语句),方法名必须与类名完全相同,无返回值。常用this、super来调用。可以重载,但不能被子类继承。

注:在实例方法中,访问当前对象的引用,使用this;能在构造方法或实例方法中使用this,在静态方法和静态代码块内不能使用this。 在构造方法中,通过super 调用父类的构造方法,但不能与this同时出现在子类的一个构造方法中;只能在构造方法或实例方法内使用super,在静态方法和静态代码块内不能使用super ,用法同this。

*用this语句来调用其它构造方法时,必须遵守以下语法规则:

只能在一个构造方法中用this 语句来调用类的其他构造方法,而不能在成员方法中用this 语句来调用类的其他构造方法。假如在一个构造方法中使用了this 语句,它必须作为构造方法的第一条语句(不考虑注释语句)。 只能用this 语句来调用其他构造方法,而不能通过构造方法名来直接调用构造方法。

*通过super 语句调用父类的构造方法时,必须遵守以下语法规则:  

 在子类的构造方法中,不能直接通过父类构造方法名调用父类的构造方法,而是要使用super 语句;如果在子类的构造方法中有super 语句,它必须作为构造方法的第一条语句(不考虑注释语句) ,不能与this同时出现在子类的构造方法中。

*思考:为什么super( )和this( )语句只能作为构造方法中的第一条句出现?// 创建子类对象

为什么super( )和this( )语句不能同时在一个构造方法中出现?// 都是为创建子类对象,重复创建了

*Object类:java.lang.Object是Java的根类/超级父类,所有Java类不需要import和extends说明,就自动继承于Object类,它包含了所有Java类的公共属性与行为。

*对象的相等与同一

相等(equal):两个对象(引用变量)具有相同的类型与属性值

  同一(identical):两个引用变量指向同一个对象。 “ = = ”

两个对象同一,则肯定相等;两个对象相等,则不一定同一。

*Object类中equals( )方法的原始定义代码为:

public booleanequals (Object obj){

return (this == obj );  //比较2个引用变量指向的对象首地址是否相同

}    //不是比较2个对象的属性值是否相等

注:Object类中equals( )方法判断两个对象的地址是否相同,而不是判断两个对象的属性的值是否相同,要判断两个对象的属性的值是否相同,不能使用Object类中equals( )方法,而是需要在类声明对equals方法进行覆盖。

例子:

public class TestEquals {

public static void main(String[] args) {

String s1=“123”; //实例化同一个String对象!!

String s2="123";

System.out.println(“s1 equals s2:”+s1.equals(s2)); //true

System.out.println(“s1==s2:”+(s1==s2)); //打印true !!

TestEquals v1=new TestEquals(); //实例化两个对象!!

TestEquals v2=new TestEquals();

System.out.println("v1 equals v2:"+v1.equals(v2)); //false

System.out.println("v1==v2:"+(v1==v2)); //打印false

Integer int1 = new Integer(1);

Integer int2 = 1 ;

System.out.println(int1==int2); //打印false

System.out.println(int1.equals(int2)); //打印true

//int1和int2引用的不是同一个对象,但内容相同

}

}

*Object类:toString( )方法:返回当前对象的字符串表示和内存位置,实际应用中,通常覆盖toString( )方法为对象提供特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用覆盖的toString( )方法。

例子:

public class ObjectInstance {

@Override

public String toString() { // 覆盖toString()方法

// return super.toString();

return "大家好,我是ObjectInstance类的对象实例。";

}

public static void main(String[] args) {

ObjectInstance obj = new ObjectInstance();

System.out.println("输出实例对象:\n" + obj);

}

}

*String类

String的对象创建:3种方法

(1)使用字符串常量自动创建      String str=“Hello” ;

(2)使用连接符“+ ”创建      String str=“Hello” +“Java” ;

(3)使用String的构造方法创建  String str2= new String( str );

//通过String引用变量或字符串常量传递给构造方法;

  public String(char str[ ]) //将整个字符数组赋给String构造方法;

  public String(char str[ ], int offset, int count)

//将字符数组的一部分赋给String构造方法,offset 为起始下标,count为子数组(字符串)的长度。

*final(最终的、不可改变的)可以修饰非抽象类、非抽象方法和变量。final修饰的成员方法不允许被子类覆盖,final修饰的变量(成员变量、局部变量)表示取值不会改变的常量。

final方法的优点:

1)可以防止子类对父类关键方法的修改(覆盖),增加代码的安全性;

2)final方法被调用时,可以提高执行速度。

例子:

import static java.lang.Math.PI;

class Parent{

final double getPI() {  //终结方法

return Math.PI;

}

}

public Class Child extends Parent{

double getPI() {   //错!不允许覆盖父类中的终结方法

return 3.14;

}

}

*static变量(类变量/静态变量),在类的内部,可以在任何方法内直接访问静态变量;在其它类中可以通过

类名(不用创建类的实例)来访问静态变量。

类变量/静态变量的 2 个作用:

①如类的所有实例都包含一个相同的常量属性,可以将该属性定义为静态常量类型(类变量),从而节省内存空间。

②能被类的所有对象实例共享的属性,可作为实例之间交流共享的数据。

*static方法(类方法/静态方法)静态方法必须被实现,静态方法用来表示某个类所特有的功能,功能的实现不依赖于类的具体实例或子类,当前类必须为静态方法提供方法实现,不能定义为抽象方法。

关键词: BASE EQUALS SUPER THIS FINAL STRING Java SAMPL

上一篇:
下一篇: