Java-3-继承

Ø 课堂讨论要点:

 

1.包(package)的概念

 

     一个好的类名,大家都爱使用,那么在相同类名的情况下,将很难区分类的主人, 所以我们必须给类起一个范围限定(归属), JAVA中是通过包的机制来解决的。

 

     案例:

       张三写的学生类  zhangsan. Student

       李四写的学生类  lisi.Student

       王五编写了一个程序使用到了上述两个学生类:

         zhangsan.Student s=new zhangsan.Student();

    

     包是一种逻辑结构,是一个类的归属标志,同一个包中不能出现雷同的类名。

包在物理上是如何实现的?是通过磁盘目录来表示的。

 

包名也有可能出现雷同的现象,为了避免这种情况的发生,我们一般使用单位的域名倒装来作为包名,因为域名不会出现重复,一个域名作为包名将可能在磁盘上创建多个层级目录。

 

为了避免你所编写的类,在后续的系统中出现使用上问题,请不要书写无包类/默认包类(default package).

 

案例:

package edu.fzu.cs;    //package关键字,说明这个类所属的包

public class Student {

 

}

 

2. 包装类(wrapper)

   任何基本类型:byte, int , long, float ,double, boolean,char (16bits) ….. (JAVA没有无符号数据类型, char 是 utf-8编码的)

 

   在JAVA中都有一个类类型与其对应。

   Int à java.lang.Integer  (java.lang java语言包, lang=language, 

java.lang包中的所有的类在任何JAVA程序中都由编译器默认导入,语法是:

import java.lang.*

由于lang包里头的类使用极度频繁,是语言扩展和服务类,为降低程序员的导入负担,该包下的所有类由编译器帮助导入,用户无需手动导入。

)

   

   包装类的主要作用:

a) int à Integer

b) float à Float

c) double à Double

d) boolean à Boolean

e) char à Character

f) long -> Long

g) byte -> Byte

 

1. 弥补基本类型的语意缺失

基本类型无法表示:“没有”

float mark;     0 

Float mark     0 , null

2. 为基本类型提供服务

       System.out.println(Integer.toBinaryString(100));

   System.out.println(Integer.toHexString(100));

   System.out.println(Integer.parseInt("12")+1);

 

   装箱(inbox)和拆箱(outbox)

 

   代表了类类型和基本类型之间的转换行为。

 

   手动版本:

   Integer b = new Integer(10);

   Int a = b.intValue;

 

   自动版本:

   Integer b=30;    à  Integer b=new Integer(30);

   Int a=b;         à  int a =b.intValue();

 

   因为基本类型和类类型之间的换转操作频繁,SUN公司在高版本的JDK中提供了自动装箱和拆箱操作,由编译器帮助你书写转换代码。

 

   在JDK5以上版本才支持自动装箱和拆箱操作。

 

3. String类了解

    

String s=new String("abc");

String m=new String("abc");

 

通过new String()语法将告诉编译器创建新对象,所以这里创建两个字符串对象。

    System.out.println(s==m);

String a="xyz";

String b="xyz";

System.out.println(a==b);

为了兼容C开发者的习惯,SUN也允许不写new String,而字符串赋值。

    当”xyz”这个字符串对象在内存中不存在的时候,系统将创建一个字符串对象,当已经存在的时候,系统将复用这个对象。

 

字符串的不变性(immutable)

任何字符串对象一旦被创建,就不能被更改,通过引用变量导致字符串的修改,都将导致新字符串对象的创建。

 

a=a+"mn";

System.out.println(a==b);

 

    大量的字符串相加操作会产生大量的字符串对象,比如:

    String a=”superstar”;

    a=a+”m”;

    如果有涉及到较多的字符串相加操作,请使用StringBuffer类。

    

     String s=" this is a book! ";

System.out.println(s.length()); //求字符串长度

System.out.println(s.trim().length()); //去除头尾空格

System.out.println(s.toUpperCase());

System.out.println("aBcD".toLowerCase());

System.out.println(s.indexOf('s')); //找出s这个字符在字符串中首次出现的位置

System.out.println(s.lastIndexOf('s'));//找出s这个字符在字符串中最后一次出现的位置

System.out.println(s.indexOf("book")); //找出子串出现的位置

System.out.println(s.indexOf("world!"));

System.out.println(s.toCharArray()[3]);

System.out.println(s.charAt(3));

System.out.println(s.concat("hello,world!")); //字符串相加

System.out.println("abc".compareTo("bca"));  //-1,0,1

System.out.println("abc".compareTo("abc"));  //-1,0,1

System.out.println("cbc".compareTo("bca"));  //-1,0,1

System.out.println("Abc".compareToIgnoreCase("aBc"));

System.out.println(s.contains("book"));

System.out.println(s.endsWith("! "));

System.out.println(s.isEmpty()); //是否为空

System.out.println(s.replace('s''m'));

System.out.println(s.valueOf(1));

System.out.println(1+"");

System.out.println("abcdefg".substring(3));

    System.out.println("abcdefg".substring(3,6));

 

    4. 继承

       一个类可以继承另外一个类,获得这个类的所有属性和方法,然后它可以增加一些自己特有的方法,构成自己的“私有财产”。

        任何一个java类如果没有指定其继承哪个类的话,默认都是继承Object.

        任何一个java类都能且仅能继承1个类。(单继承)

        无论一个java类继承哪个类,其都是Object的子类。

 

a. 继承环境下的对象构造

 

子类对象的构造,除了完成自身部分的构造之外,还必须完成父类部分的构造。

 

子类构造过程,如果没有完成体内父类部分构造,则构造未完成,编译失败。

 

子类在构造中,必须承担体内父类部分的构造任务,而这个任务是由子类调用父类构造方法来实现的,有的时候,子类调错了父类构造方法,导致构造失败。

 

子类在构造过程中,必须“先父亲后自己”的原则完成构造。

 

如果子类构造方法,没有显式指出调用哪个父类构造方法,编译器将自动在子类构造方法的首行写上super(), 调用父类的无参构造方法完成子类内部父类部分的构造工作。

Given:

1. public class Plant {

2. private String name;

3. public Plant(String name) { this.name = name; }

4. public String getName() { return name; }

5. }

1. public class Tree extends Plant {

2. public void growFruit() { }

3. public void dropLeaves() { }

4. }

Which is true? (choose two)   BD

A. The code will compile without changes.

B. The code will compile if public Tree() { super(“fern”); } is added to the

Tree class.

C. The code will compile if public Plant() { Tree(); } is added to the Plant class.

D. The code will compile if public Plant() { this(”fern”); } is added to

the Plant class.

E. The code will compile if public Plant() { super(”fern”); } is added to

the Plant class.

 

b. 继承环境下的引用变量指向问题

 

标配指向:

Tiger t=new Tiger("tiger",4,"yellow");

Animal a = new Animal();

 

继承环境下的非标配指向:

Animal a= new Tiger("tiger",4,"yellow");

Tiger t=new Animal();

 

父类引用变量可以指向子类对象

因为子类对象中也包含父类部分。

我们可以用”is判断法”来测试。

 

父类引用变量指向子类对象,在父类引用变量眼中,只看到子类对象的父类部分,只能调用父类部分功能,就好像该对象“萎缩”了一样。

 

子类引用变量不能指向父类对象

首先,“is判断法“ 通不过

其次,有“膨胀“的问题

在子类引用变量眼中,其所指向的对象就是子类对象,其会尝试发出一些父类对象不具备的功能指令,把父类对象膨胀成子类对象,这是不允许的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章