1、 第三章,第四章内容总结 -Mr yang 多态性: 发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。动态绑定:一、使用父类类型的引用指向子类的对象;二、该引用只能调用父类中定义的方法和变量;三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)四、变量没有被重写(覆盖)的概念,”重写“的概念只针对方法, 1.方法重载:在同一个类中定义了两个以上的同名的方法,但是它们拥有不同的参数列表。1.1 重载的条件:参数不同a.个数不相同b.类型不同*c.顺序不同注意:与方法的返回类
2、型无关,和访问修饰符无关2.方法重写:在子类中定义了一个和父类中相同的方法,父类的方法在子类中就被覆盖了(隐藏了).3.动态绑定:父类的引用指向子类的对象,如果调用的方法在子类中被重写,则调用子类重写了的方法。如果调用的方法在父类中没有定义,则报错。访问修饰符:1.public2.protected3.private4.默认的方法修饰符:1.static:静态方法中不能访问非静态的变量和方法,也不能使用 this 和 super 关键字static 关键字修饰的代码不依赖具体的对象实例. 总是比普通的代码块先加载2.final:能修饰类,方法,属性。2.1:final 修饰类时:该类不能被继承
3、.2.2:final 修饰方法时:该方法不能被重写.2.3:final 修饰类的成员属性时:声明时就要赋值,或者在构造方法中给它赋值 .final 修饰类的属性时:必须在声明时赋值final 修饰局部变量:如果在声明时没有赋值,则在后面的代码中可以有一次给它赋值的机会,一旦赋值则该变量的值不可更改。final 修饰的变量是引用类型时指引用不能更改,引用指向的对象的属性值是可以更改的.Final 表示最终的3.abstract:修饰类,方法.抽象方法使用 abstract 修饰符修饰抽象方法只能在抽象类中声明。即:如果一个类中存在一个或以上的抽象方法,则该类也要声明为抽象类。3.1:抽象类不能实
4、例化对象。3.2:抽象类中可以有抽象方法,也可以有普通方法。3.3:构造方法不能声明为抽象的,因为子类无法覆盖。3.4:子类继承抽象类时必须重写父类中所有的抽象方法,否则自己也要声明为抽象类.3.5:可以声明抽象类的引用指向子类的对象。 动态绑定 4 接口: 关键字 interface 声明接口。解决 java 不能多重继承的机制。1.接口中的方法都是抽象的。2.接口中的方法默认时 public 和 abstract,所以 public 和 abstract 可以省略.3.接口中可以声明属性,属性默认为 public static final4.接口使用关键字 interface 声明,使用
5、implements 实现接口.问题: 接口和抽象的区别 ? 相同点区别 :继承 : 代码的可重用性抽象类 : 代码的灵活性 固定的方法 (数据库 )接口: 代码的可扩展性 java 访问权限修饰符 public protected default private 用法总结 首先声明: java 中,default 这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是 default。为了条理清晰,分三种不同情况来总结。一 访问权限修饰符修饰成员变量和方法public:表明该成员变量和方法是共有的,能在任何情况下被访问。protected:必须在同一包中才能被访问及其子类
6、中可以(说的比较简单,看个例子就明白了)eg:class A protected int weight;protected int f( int a,int b ) / 方法体 假设 B 与 A 在同一个包中,则class Bvoid g()A a=new A();A.weight=100;/合法A.f(3,4); /合法特别说明:什么是在同一个包中?答:用 package 打包在一起的 class ,叫在同一个包中。( 不明白,举个例子)eg:在 JDK 的 srcjavaio 中,你会看到许多 java 类,第一句源代码都是 package java.io;没有使用 package 打包的
7、,在同一目录下的类也会被视做同一个包。default:在这种情况下中,同包中的子类。区别在第二和第三种情况中。 eg: class A int weight ;int f( int a,int b ) / 方法体 假设 B 与 A 在同一个包中,则class Bvoid g()A a=new A();A.weight=100;/合法A.f(3,4); /合法private: 只能在本类中访问。eg: class Test private int money;Test()money=2000;private int getMoney()return money;public static voi
8、d main(String args)Test te=new Test();te.money=3000; /合法int m=te.getMoney(); /合法System.out.println(“money=“+m);PS: 实际上,把重要的数据修饰为 private,然后写一个 public 的函数访问它,正好体现了 OOP 的封装特性,是 OOP 安全性的体现。二 访问权限修饰符修饰类1,不能用 protected 和 private 修饰类。2,用 default 修饰的类叫友好类,在另外一个类中使用友好类创建对象时,要保证它们在同一包中。三 访问权限修饰符与继承这里的访问修饰符指的
9、是修饰成员变量和方法。可以分为两种情况:1,子类与父类在同一包中此时只有声明为 private 的变量与方法不能被继承(访问 )。eg:class Fatherprivate int money ;int weight=100;class Son extends Fatherviod f()money=10000;/ 非法weight=100; / 合法2,子类与父类不在同一包中此时 private 与 default 均不能被继承 (访问), protected 与 public 可以。eg:Father.javapackage com.aaapublic class Fatherint h
10、eight ;protected int money=120;public int weight;protected int getMoney()return money;void setMoney(int newMoney)money=newMoney;Son.javapackage com.bbbimport com.aaa.Father;public class Son extends Fathervoid f()money=10000;/合法/height=170;/非法, height 为 default 修饰的变量System.out.println(money);/输出结果是 1
11、0000/setMoney(300); /非法int number=getMoney(); /合法System.out.println(number);/输出结果是 10000public static void main(String args)Son sss=new Son();sss.f();所以,访问权限修饰符权限从高到低排列是 public ,protected ,default, private。Java 中的 abstract,static,final 修饰符abstract 修饰符abstract 使用对象:类、接口、方法介绍:类中包括没有实现的方法,不能被实例化。如果是一个
12、abstract 方法,则方法体为空,该方法的实现在子类中被定义,并且包含一个 abstract 方法的类必须是一个 abstract类abstract 修饰符表示所修饰的类没有完全实现,还不能实例化。如果在类的方法声明中使用 abstract 修饰符,表明该方法是一个抽象方法,它需要在子类实现。在下面的情况下,类必须是抽象类:1.类中包含一个明确声明的抽象方法;2.类的任何一个父类包含一个没有实现的抽象方法;3.类的直接父接口声明或者继承了一个抽象方法,并且该类没有声明或者实现该抽象方法。如下例所示:abstract class A1public int v1;abstract void t
13、est();abstract class A2 extends A1 public int v2;class Sample extends A2 void test() 因为包含一个抽象方法 test,类 A1 必须被声明为抽象类。它的子类 A2 继承了抽象方法test,但没有实现它,所以它也必须声明为抽象类。然而,A2 的子类 Sample 因为实现了test,所以它不必声明为抽象的。注意:如果试图创建一个抽象类的实例就会产生编译错误;如果一个类是非抽象类却包含一个抽象方法,就会产生编译错误;构造函数和静态函数以及 Final 修饰的函数不能使用 abstract 修饰符;接口缺省为 abs
14、tract。 Static 修饰符static 使用对象:类、方法、变量、初始化函数通常,在创建类的实例时,每个实例都会创建自己实例变量。但是在变量的声明中可以使用 Static 修饰符,它表明该成员变量属于类本身,独立于类产生的任何对象。这种成员变量称为静态变量(静态属性)。方法的声明中也可以使用 static 修饰符,表明该方法从属于类本身。静态属性和静态方法不需要创建实例就可以使用。典型的例子是 java.lang 包中的 System 类中的方法和变量。我们常用System.out.println(“message”);输出信息,并没有创建 System 的实例,是因为 println
15、 方法声明为 System 类的静态方法,它不需创建实例就可以使用。下面的例子会帮助你更深刻的理解 Static 修饰符。注意各个代码块的加载次序。class Samplestatic int s1=3;static int s2;static void display() System.out.println(“s1=“+s1);System.out.println(“s2=“+s2);staticSystem.out.println(“static block“);s2=s1+1;public static void main(String args)Sample.display();一旦
16、这个类被调用,所有的静态变量都被初始化,s1 被赋为 3,然后运行 static 块,这将打印出一段消息,并且把 s2 赋为 s1+1,即 4。然后解释器调用 main 成员函数,它调用了成员函数 display,该函数输出 s1 和 s2 的信息。运行结果如下:C:java Samplestatic blocks1=3s2=4通过上面的例子还可以看出,一个静态成员函数可以通过它所属的类名来调用。注意:在静态成员函数中只能直接调用其它的静态成员函数或引用静态属性,否则会造成编译错误。静态成员函数中也不能使用 this 或者 super,因为它们是和类的对象相关联的。final 修饰符final
17、 使用对象:类、方法、变量介绍:被定义成 final 的类不允许出现子类,不能被覆盖,字段值不允许被修改。如果一个类是完全实现的,并且不再需要继承子类,则它可以声明为 Final 类。如果final 类的名字出现在另一个类声明的 extends 字句的后面就会产生编译错误。这表明 final类不能有任何的子类。类不能同时被声明为 abstract 和 final,因为 abstract 类中的abstract 方法永远没有机会被实现。例如:class FinalSamplefinal int MAX_VALUE = 100; public static void main(String args) FinalSample a =new FinalSample();System.out.print(a.MAX_VALUE);表示,MAX_VALUE 的值为 100,并且不能再更改。final 变量用大写标识符是一个一般的约定。