• 【JAVA】【类&对象&接口】(1)类与对象的修饰符


    一、java中的面向对象类型

    面向对象两个基本概念:类、对象

    1. 类:

    类是一个模板,抽象一类对象的属性、和方法。类由一些保存值的数据字段和处理这些值的方法组

    类的属性通过字段表示,一个类包含如下字段:
    2) 类字段(静态变量):类变量为static类型,此类的所有实例(对象)共用类变量的一个拷贝。类变量存储在静态存储区,在首次被访问时创建,在程序结束时释放。
    3) 成员字段:在类内、方法外定义,一般是类的属性,其生命周期限于类对象生命周期期间。其在类对象实例化时创建,类对象释放时释放。实例变量最少需要被一个构造方法、或方法引用,使得通过这些方法可以操作成员变量。
    4) 局部变量 (字段):在类的方法中定义,其生命周期仅限于方法内,在方法执行时创建,方法执行完毕后释放。

    类包含如下方法:

    1. 构造方法:构造方法的名称必须和类名相同。

    2. 其他方法。

    2、对象:

     对象是类的一个实例,有方法和属性。

     对象通过实例化类创建,方法是使用 new 关键字、并调用构造方法来初始化对象。

    3、定义语法

     (1)类定义

      修饰符 class 类名 {

        ....

      }

    (2) 方法定义

      修饰符 返回值类型 方法名(参数1类型 参数1, 参数2类型 参数2){

        ......
        return; //可选
      }

    (3) main方法定义(java程序的入口)

      public static void main(String[] args) {
        ......
      }

    一个类的定义包含一个签名和一个主体。类的签名定义类的名称,可能还会指定其他重要信息。类的主体是一些放在花括号里的成员。类的成员一般包含字段和方法,也可以包含构造方法、初始化程序和嵌套类型。

    4、类字段/方法 和 实例字段/方法

    类的成员(字段和方法)可以分为:

    (1) 类字段

    (2) 实例字段

    (3) 类方法

    (4) 实例方法

    类实例、方法也可以称之为静态成员,通过static关键字修饰符定义。静态成员属于类本身,而非静态成员属于类的实例。

    二、Java中的修饰符
    Java中的修饰符可以分为“访问控制类修饰符”和“非访问控制修饰符”。

    1、访问控制类修饰符:

    包含public、protected、private。

    1)修饰类

      (1)public:对所有类可见

      (2)protected:对同一包内可见。

      (3)default:不带任何访问控制修饰符。同protected,仅同一包内可见。

       注:类(外部类,内部/外部类见后续章节)不可以用private进行修饰的。
    
    2)修饰方法、字段:
    

      (1)private:仅同一类内可见。

      (2)protected:同一包内的类,或本类的子类可见。

      (3)public:对于所有类可见。

      (4)default:不带任何访问控制修饰符。仅同一包内的类可见。(与protected的区别:protected同一包内的类、或其子类可见。default仅同一包内的类可见)

    2、非访问控制类修饰符:

    1. static:

      修饰字段、方法。

      (1)修饰字段:类字段,用于声明类的静态变量。(非static修饰的字段,称之为实例字段)

      (2)修饰方法:类方法,用来声明独立于对象的静态方法。(非static修饰的字段,称之为实例方法)

      注意:

      (1)static修饰的字段、方法是绑定到类自身,而不是类的实例。

      (2)类方法不能使用非类字段和非类方法。(原因是:类方法独立于类的实例,没有创建类的实例时即可调用。而实例字段、实例方法只有在创建类的实例后,才有效)。

      (3)局部变量不能声明为static。

      关于类字段和类方法:

      (1)通过public修饰公开的类字段,类似于C语言的全局变量。不过,Java中的类字段的名称被定义它的类名限定。因此, 如果不同的类定义了同名的类字段, 不会像C语言一样出现名称冲突问题。

      (2)类似地,通过public修饰公开的类方法,类似于其他编程语言的全局方法、或全局函数。

      (3)在调用类字段、类方法时,本类内访问方式为“字段/方法名”,本类外访问方式为 “类名.字段/方法名”。

      关于实例字段和实例方法:

      (1)实例方法可以调用类字段、类方法。

      (2)在本实例的类外部,需要调用本类的实例方法,方式是“本类实例引用名.方法名”。

      (3)所有实例方法都使用了一个隐式参数,方法签名里没显示这个参数。这个隐式参数 是 this,它的值是调用这个方法的实例引用。

    1. final:
        修饰类、字段、方法。

      修饰类:修饰的类不能够被继承。注:

        (1)类不能同时被修饰为final和abstract。

      修饰字段:修饰的字段为常量。注:

        (1)修饰为final的成员字段,在类实例化时赋值后,不能被更改。

        (2)也可通过final修饰类字段,即static final,此种方式修饰的字段类似与C语言中的全局常量,在类定义时赋值,其后不可修改。字段同时使用static 和 final ,本字段就是编译时常量,javac 会将其内联化。

      修饰方法:修饰的方法不能被 子类 重写。注:

        (1)使用final修饰的方法能获取普通方法无法得到的编译器优化。

        (2)所有private方法都隐式添加了final修饰符。

        (3)final类的所有方法都隐式添加了final修饰符。

    1. abstract:
        修饰类、方法。

      修饰类:表示类为抽象类。抽象类不能用来进行实例化,其唯一的目的是被继承。抽象类,可以包含抽象方法、或非抽象方法。

      修饰方法:表示方法为抽象方法。抽象方法仅定义方法签名,不包含方法的实现主体,其方法主体通过一个分号代替;具体实现由其 子类 类提供。 注:

      (1)抽象方法不能声明为final和static(final修饰的方法不能被 子类 重写,与抽象方法需要子类实现矛盾)。

      (2)包含抽象方法的类 必须 为抽象类(非抽象的类可以实例化,若果包含了抽象方法,会导致实例的方法不可用)。

    1. synchronized、volatile:
        synchronized修饰方法。主要用于多线程编程。

      本修饰符实现线程安全的方法,synchronized修饰符声明的方法同一时间只能被一个线程访问。

      线程调用 synchronized 修饰的方法之前,必须先为方法所在的类(针对 static 修饰的方法)或 对应的类实例(针对没使用 static 修饰的方法)获取一个锁,避免两个线程同时执行该方法。

      volatile修饰字段。

      volatile修饰符表示字段的值必须始终从主存储器中读取和释放,不能被线程缓存(在寄存器或 CPU 缓存中)。每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

      更多描述,见后续多线程编程部分。

    1. strictfp:
        修饰类、方法。

      这个修饰符表示浮点数不扩展精度。如果类声明为strictfp,则这个类的所有方法都需要声明为strictfp。

      这个修饰符极少使用。

     
    6) native:
      修饰方法。

      native修饰的方法表示此方法的实现由某种“本地”语言编写,例如C语言,并且开放给java程序使用。

      native修饰的方法没有主体,花括号及包含的实现主体被分号替代。

      现在native修饰符极少使用。

    修饰符总结:

    1、访问控制修饰符

    2、非访问控制修饰符

    三、类中方法的this隐式参数
    类中的方法包含一个隐式的this参数。

    (1)在实例方法中,this作为隐式的这个方法的实例引用。如果方法的入参、或方法局部变量 和类中的某个字段同名,就必须使用 this.字段名指向类中的字段。

    (2)类方法也能使用this关键字,可以通过this关键字调用本类的其他类方法。

  • 相关阅读:
    开发中几个时期该写的
    Java API Docs
    Cogs 1709. [SPOJ705]不同的子串 后缀数组
    Poj 3683-Priest John's Busiest Day 2-sat,拓扑排序
    Bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 动态规划
    Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
    Bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 最短路,floyd
    Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
    Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜
    Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
  • 原文地址:https://www.cnblogs.com/yickel/p/15599588.html
Copyright © 2020-2023  润新知