本章主要知识结构如下: 面向对象的特征(三点):
封装继承多态Java中的访问控制符有public, protected, private以及默认四种。
第7页的表格如下: 表格中第一列表示类的属性或方法前面的修饰符,ABCD代表不同级别的类,如下图:
从表格中可以看出,类前修饰符有两个,分别是public与缺省。若为缺省,则该类无法被包外的类所访问,仅可以被包中的类访问,若为public则可以被包外的类访问。
下面用一个例子来展示类前修饰符为public时,不同包与相同包内的类的访问情况。
首先在com.resource包中定义一个SomeVar类,其含有3种修饰符修饰的变量。package com.resource; public class SomeVar { public String varPublic = "Public"; protected String varProtected = "Protected"; private String varPrivate = "Private"; } 然后com.resource包中建立SamePack类,package com.resource; public class SamePack { public static void main(String[] args){ SomeVar sv = new SomeVar(); System.out.println(sv.varPublic); // 无报错 System.out.println(sv.varProtected); // 无报错 System.out.println(sv.varPrivate); // The field SomeVar.varPrivate is not visible } } 这里会在引用varPrivate变量时报错,表明private修饰的变量无法被包内其他的类访问,只能被本类访问。在com.run包内建立RunVar类,package com.run; import com.resource.SomeVar; public class RunVar { public static void main(String[] args){ SomeVar sv = new SomeVar(); System.out.println(sv.varPublic); // 无报错 System.out.println(sv.varProtected); // The field SomeVar.varProtected is not visible System.out.println(sv.varPrivate); // The field SomeVar.varPrivate is not visible } } 由于RunVar类与SomeVar类不在同一个包内,所以其不能访问SomeVar类的varProtected与varPrivate属性。子类继承了父类的所有属性和方法, 但只有public、protected的属性和方法在子类中是可见的,private修饰的属性和方法仅对本类(父类)课件。
下面用一个例子来说明:
class FatherPlane{ public String namePub = "Public name"; protected String namePro = "Protected name"; private String namePri = "Private name"; } class SonPlane extends FatherPlane{ public void setName(String name_){ this.namePri = "new private"; // The field FatherPlane.namePri is not visible } } public class RunPlane{ public static void main(String args[]) { SonPlane sp = new SonPlane(); System.out.println(sp.namePub); // 无报错 System.out.println(sp.namePro); // 无报错 System.out.println(sp.namePri); // The field FatherPlane.namePri is not visible } }组合的概念:组合就是在一个类里面使用已经定义好的类对象的引用,并通过发消息的形式调用该对象的属性和方法。
组合的作用:组合不会破坏旧类的封装,整体类与局部类之间松耦合,独立性强,非常灵活,也无需担心继承所带来的一系列权限问题。
举例如下:
class Int{ int value=10; void changeValue(int v){ this.value = v; } } class NewInt{ Int a = new Int(); // 在NewInt类中调用Int类的对象引用,则为组合 void changeValue(int v){ a.changeValue(v); System.out.println("Changing value......"+a.value); } }重载(overload)的概念:指的是同一个类中参数个数和类型不同但方法名相同的多个方法,返回类型可以相同也可以不同。。
**重载的作用:**重载可以使得同一个方法处理不同类型的参数并返回不同类型的值,虽然参数不同但这些同名方法所实现的作用是相同的,是实现多态的非常重要的机制。
举例如下:
public class Test { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2 "+a); } public String test(int a, String s){ System.out.println("test3 "+a+' '+s); return "return test3"; } public static void main(String[] args){ Test t = new Test(); System.out.println(t.test()); t.test(1); System.out.println(t.test(1,"test3")); } }**覆盖的概念:**覆盖指的是子类对父类中已经定义好的方法进行了重新定义,方法名、返回值类型和形式参数都不能改变!
**覆盖的作用:**使得子类能够灵活的根据自己的需要修改父类中所定义的方法,而无需修改父类中的实现。
举例如下:
class Father{ public void echoHello(){ System.out.println("Hello from Father!"); } } class Son extends Father{ public void echoHello(){ System.out.println("Hello from Son!"); } } public class Test{ public static void main(String[] args){ Son s = new Son(); s.echoHello(); // 输出Hello from Son! } }