Java入门笔记 03-面向对象(中)

介绍:这部分内容主要是介绍和总结封装、继承和多态。

一、 封装把该隐藏的隐藏起来,把该暴露的暴露出来

  封装是指将信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

  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. 每次创建对象的时候, 都会执行一次。 且先于构造器执行。
posted @ 2020-02-09 19:18  HankBernstein  阅读(174)  评论(0编辑  收藏  举报