介绍:这部分内容主要是介绍和总结封装、继承和多态。
一、 封装:把该隐藏的隐藏起来,把该暴露的暴露出来
封装是指将信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
1. 访问控制符:
Java提供了三个访问控制符:private、protected和public,以及一个不加任何访问控制符的default访问控制级别,下图描述了访问控制级别从小到大:
2. 访问控制符的使用原则:
- 类里面的绝大部分成员变量都应该使用private修饰,只有一些static修饰的、类似全局变量的成员变量,才可能考虑使用public修饰;
- 有些只用于辅助该类实现的其他方法(工具方法)也应该使用private修饰;
- 某个类主要用作其他类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不是被外界直接调用,则应该使用protected来修饰;
- 希望暴露出来给其他类自由调用的方法应该使用public修饰。
3. 举例:
1 public class Person { 2 private String name; 3 private int age; 4 5 public void eat() { 6 System.out.println("Human:eat"); 7 } 8 9 public void walk() { 10 System.out.println("Human:walk"); 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 }
二、 继承:extends
1. 继承的特点:Java的继承具有单继承的特点,每个子类只有一个直接父类。
2. 重写父类的方法:子类包含与父类同名的方法的现象被称为方法重写,也被称为方法覆盖。重写需要遵循“两同两小一大”的规则:
- 方法名相同、形参列表相同;
- 子类方法返回值类型以及抛出的 异常应该比父类的更小或相等;
- 子类方法的访问权限应该要比父类方法要更大或相等
如果父类方法具有private访问权限,则该方法对子类是透明的,此时在子类中定义一个与父类同名、同形参列表的private方法时,不是重写,只是在子类中重新定义了一个新方法。
3. super()方法:super不能出现在static修饰的方法中
如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super(被覆盖的事非static方法)或者父类类名(被覆盖的是static方法)来作为调用者进行调用。
4. 调用父类构造器:在子类构造器中调用父类构造器使用super调用来完成,并且必须出现在构造器的第一行。
三、 多态:
如果编译时类型(左边)和运行时类型(右边)不同,就可能出现所谓的多态,即父类的引用指向子类的对象,并且多态性只适用于方法,不适用于属性(成员变量)。
1. 引用变量的强制类型转换:只能在具有继承关系的两个类型之间进行。
- 向上转型:把子类对象赋给父类引用变量,这种转型总是可行的;
- 向下转型:需要使用强制类型转换,并且这个对象必须实际上是子类实例才行(即编译时类型为父类类型,运行时类型是子类类型),否则在运行时会引发ClassCastException异常。
2. instanceof:在进行类型转换前应该通过instanceof运算符来判断前面的对象是否为后面的类或子类或实现类的实例。
1 Person p2 = new Man();//多态 2 //************向下转型************ 3 if(p2 instanceof Man) //为了避免ClassCastException,使用instanceof来进行判断 4 Man m1 = (Man)p2;//使用强制类型转换符
四、 其他:
1. JavaBean:JavaBean是一种Java语言写成的可重用组件,是指符合如下标准的Java类
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、 set方法
1 class JavaBeanTest{ 2 private String name; 3 private int age; 4 5 public JavaBean() { 6 7 } 8 9 public void setName(String n) { 10 name = n; 11 } 12 13 public void setAge(int a) { 14 age = a; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 }
2. 代码块(初始化块):对Java类或对象进行初始化
- 静态代码块:用static 修饰的代码块
1. 可以有输出语句。
2. 可以对类的属性、类的声明进行初始化操作。
3. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
4. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
5. 静态代码块的执行要先于非静态代码块。
6. 静态代码块随着类的加载而加载,且只执行一次。
- 非静态代码块:没有static修饰的代码块
1. 可以有输出语句。
2. 可以对类的属性、 类的声明进行初始化操作。
3. 除了调用非静态的结构外, 还可以调用静态的变量或方法。
4. 若有多个非静态的代码块, 那么按照从上到下的顺序依次执行。
5. 每次创建对象的时候, 都会执行一次。 且先于构造器执行。