ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面向对象:抽象,封装,继承(精华),多态【变量,特性,修饰符】

2022-03-21 18:34:03  阅读:105  来源: 互联网

标签:变量 访问 对象 声明 修饰符 多态 面向对象 方法 public


变量

一、局部变量:在方法、构造方法或语句块中定义的变量(类的方法中的变量)

1.局部变量声明和初始化都在方法中,方法结束后局部变量自动销毁

2.因为没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用

3.局部变量是储存在在栈上的对象

二、类变量(静态变量):声明在类中,方法体外(独立于方法之外的变量)

  • 类变量必须声明为 static 类型
  • 类变量被声明为 public static final 类型时,类变量名称一般使用大写字母(如静态变量不为 public 和 final 类型,其命名方式与实例变量及局部变量的命名方式一致)

1.静态变量在第一次被访问时创建,还可在静态语句块中初始化,程序结束时自动销毁

2.默认值和实例变量相似(数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null),变量的值可以在声明的时候指定,也可以在构造方法中指定,静态变量初始化后不可改变

3.与实例变量具有相似的可见性(为了对类的使用者可见,大多数静态变量声明为 public 类型)

4.静态变量除了被声明为常量外很少使用(静态变量是指声明为 public/private,final 和 static 类型的变量)

5.无论一个类创建了多少个对象,类只拥有类变量的一份拷贝

6.静态变量可以通过:ClassName.VariableName的方式访问

7.静态变量储存在静态存储区(经常被声明为常量,很少单独使用 static 声明变量)

三、成员变量(非静态变量,实例变量):定义在类中,方法、构造方法和语句块外

1.在对象创建的时候创建,可以声明在使用前或者使用后,在对象被销毁的时候销毁(由垃圾回收器负责回收)

2.有默认值(数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null),变量的值可以在声明时指定,也可以在构造方法中指定

3.这种变量在创建对象的时候实例化(new)

4.可以被类中方法、构造方法和特定类的语句块访问(值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息)(通过使用访问修饰符可以使实例变量对子类可见)

5.实例变量可以直接通过变量名访问(在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName)

6.通过已创建的对象来访问成员变量:

/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;

7.成员变量存储在堆中的对象里面

特性

一、C/C++:

1.程序员进行内存回收

2.ASCII码

二、Java代码的部分组织结构:

  • C++-- 强类型语言:对每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间
  • 支持网络编程:Java是为简化网络编程设计的
  • 支持多线程:多线程:应用程序在同一时间并行执行多项任务
  • 健壮性:Java语言的强类型机制
  • 异常处理:垃圾的自动收集
  • 安全性(--):类是单继承的,接口支持多继承,不提供指针来直接访问内存,自动内存管理机制

1.存在一个系统级线程(运行过程中)

2.Unicode字符

3.源文件名:源文件的名称应该和public类的类名保持一致(文件名的后缀为.java(如文件名和public类的类名不一致,会导致编译错误))

(1)、一个源文件中只能有一个public类,一个源文件可以有多个非public类

  • 例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java

(2)、如源文件包含import语句,那么应该放在package语句和类定义之间

(3)、import 语句和 package 语句对源文件中定义的所有类都有效

(4)、在同一源文件中,不能给不同的类不同的包声明

4.包:对类和接口分类

(1)、如一个类定义在某个包中,那么 package 语句应该在源文件的首行

三、Java的面向对象(OOP)

1.面向对象的五大基本原则

(1)、单一职责原则(SRP):开放封闭原则(OCP)

(2)、里氏替换原则(LSP):子类可以出现在父类可以出现的任何地方

(3)、依赖倒置原则(DLP):高层次的模块不应该依赖于低层次的模块

(4)、接口分离原则(ISP)

2.多态

(1)、实现形式

继承:子类对父类方法的重写和重载

接口:覆盖接口中的同一个方法

(2)、实现方法

  方式 发生所在类型 区别原因及实现 时期 要求
方法重写(override)(方法覆盖) 方法名相同 参数列表、返回值都相同 发生在父类子类 父类方法无法满足子类的要求,子类通过方法重写满足需求 构造方法的重载、println()方法重载 运行时的多态性(也称为后绑定,动态绑定) 访问权限范围必须大于等于父类方法抛出异常类型范围不能大于父类方法
方法重载(overload) 参数列表不同 发生在同一个类 在一个类中为一种行为提供多种实现方式并提高可读性 Object类的toString()、equals()、hashCode()等都可以被子类重写 编译时的多态性(也称为前绑定)  

3.类:一类事物高度抽象后的模板,描述一类对象的属性和行为

4.对象:类的一个实例(即有自己的特性),具有属性和行为

(1)、对象是根据类创建的

使用关键字 new 来创建一个新的对象

创建对象需要:

  • 声明:声明一个对象,包括对象名称和对象类型
  • 实例化:使用关键字 new 来创建一个对象
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象
public class Dog{
   public dog(String name){
      //这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name ); 
   }
   public static void main(String[] args){
      // 下面的语句将创建一个Dog对象
      Dog myDog = new Dog( "happy" );
   }
}
小狗的名字是 : happy

5.方法(对象的行为):对象行为的改变,对象的相互调用也通过方法来完成

  • 方法名:以小写字母开头;如方法名由若干单词组成,每个单词首字母大写

(1)、构造方法:每个类都有构造方法

  • 构造方法的名称必须与类名相同

如没有显式地为类定义构造方法,Java 编译器会为该类提供一个默认构造方法(创建一个对象的时候,至少要调用一个构造方法)

一个类可以有多个构造方法

构造方法存在重载

写法:

权限修饰符  方法名字(参数列表){
  创建一个对象;
  返回对象;
}

调用:通过new 关键字调用

(2)、访问成员(实例)方法

通过已创建的对象来访问成员方法:

/* 实例化对象 */ 
Object referenceVariable = new Constructor();
 /* 访问类中的方法 */
 referenceVariable.methodName();

修饰符

一、访问控制修饰符

1.private

(1)、在同一类内可见

(2)、使用对象:变量、方法

(3)、不能修饰外部类,并且类和接口不能声明为 private

(4)、声明为 private 的方法、变量和构造方法只能被所属类访问

(5)、声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问

(6)、private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据

2.default

(1)、在同一包内可见

(2)、使用对象:类、接口、变量、方法

(3)、接口里的方法默认情况下访问权限为 public(接口里的变量隐式声明为public static final)

(4)、缺省,不使用任何关键字

3.protected

(1)、对同一包内的类和所有子类可见

(2)、使用对象:变量、方法、数据成员,构造方法,方法成员,不能修饰类(内部类除外)

(3)、不能修饰外部类(接口及接口的成员变量和成员方法不能声明为 protected)

(4)、从以下两个点来分析说明:

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问
  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法

(5)、子类能访问 protected 修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量

4.public

(1)、对所有类可见

(2)、使用对象:类、接口、变量、方法

(3)、如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包

(4)、由于类的继承性,类所有的公有方法和变量都能被其子类继承

(5)、Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类

5.访问控制和继承注意以下方法继承的规则:

  • 父类中声明为 public 的方法在子类中也必须为 public。
  • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
  • 父类中声明为 private 的方法,不能够被子类继承

6.访问修饰符不用于局部变量

7.访问修饰符可以修饰实例变量

二、非访问修饰符

1.final

(1)、使用对象:类、属性、方法,类、方法和变量

  类:不可被继承

    final 类不能被继承,没有类能够继承 final 类的任何特性

  方法:不可被重写,不能被继承类重新定义

    父类中的 final 方法可以被子类继承,但是不能被子类重写

    声明 final 方法的主要目的是防止该方法的内容被修改

  变量(常量):不可以被改变,大写字母

    变量一旦赋值后,不能被重新赋值

    被 final 修饰的实例变量必须显式指定初始值

    final 修饰符通常和 static 修饰符一起使用来创建类常量

(2)、被其修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以被改变的

2.static

(1)、使用对象:成员变量、成员方法、代码块、类(静态内部类)、导包,类方法和类变量

  • 静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
  • 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

(2).注意:

静态只能访问静态

非静态既可以访问非静态,也可以访问静态

对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问

(3).意义:

创建独立于具体对象的域变量或方法

  没有创建对象也能使用属性和调用方法

优化程序性能

  只会在类加载的时候执行一次

3.abstract

(1)、创建抽象类和抽象方法

(2)、

抽象类:

  抽象类不能用来实例化对象(声明抽象类的唯一目的是为了将来对该类进行扩充)

  一个类不能同时被 abstract 和 final 修饰(如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误)

  抽象类可以包含抽象方法和非抽象方法

抽象方法

  抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供

  抽象方法不能被声明成 final 和 static

  任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类

  如果一个类包含若干个抽象方法,那么该类必须声明为抽象类

  抽象类可以不包含抽象方法。

  抽象方法的声明以分号结尾

4.synchronized

(1)、主要用于线程的编程

(2)、声明的方法同一时间只能被一个线程访问

(3)、可以应用于四个访问修饰符

5.volatile

(1)、主要用于线程的编程

(2)、volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值

(3)、当成员变量发生变化时,会强制线程将变化值回写到共享内存(这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值)

(4)、一个 volatile 对象引用可能是 null

(5)、实例

public class MyRunnable implements Runnable {    private volatile boolean active;    public void run() {      active = true;      while (active){ // 第一行{     // 代码      }    }    public void stop() {      active = false; // 第二行    } }

通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止,

但是以上代码中使用了 volatile 修饰 active,所以该循环会停止

6.transient 修饰符

(1)、序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量

(2)、该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型

标签:变量,访问,对象,声明,修饰符,多态,面向对象,方法,public
来源: https://www.cnblogs.com/yuyingli/p/16035848.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有