zoukankan      html  css  js  c++  java
  • 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. 每次创建对象的时候, 都会执行一次。 且先于构造器执行。
  • 相关阅读:
    [板子]用线段树解决ST表问题
    [POJ2528]Mayor's posters(离散化+线段树)
    [板子]Kruskal
    [板子]segTree
    js实现工具函数中groupBy数据分组
    关于爬虫
    jsencrypt vue相关的rsa加密
    less 循环模拟sass的for循环效果
    vue 自动生成菜单
    vue中form 表单常用校验封装(async-validator)
  • 原文地址:https://www.cnblogs.com/dailymatters/p/12288328.html
Copyright © 2011-2022 走看看