Java面向对象基础,类,变量,方法

一、面向对象的4个基本特征

抽象性、封装性、继承性和多态性。

抽象性分为过程抽象和数据抽象。

封装性

封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件。外部无法直接访问封装的数据,从而保证了这些数据的正确性。
如果外部需要访问类里面的数据,就必须通过接口。接口规定了可对一个特定的对象发出哪些请求。

继承性

继承是一种联结的层次模型,并允许和鼓励类的重用,它提供给了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类)。

多态性

多态是指允许不同类的对象对同一消息做出响应。

二、类

类的声明

[类修饰符] class 类名 [extends 父类名] [implements 接口名列表]

  • class、extend、implements都是关键字。类名、父类名、接口名都是用户标识符。
  • 父类。新类必须在已有的类的基础上构造,原有类即为父类,新类即为子类。Java每一个类都有父类,如果不含父类,默认父类为Object类。
  • 修饰符。final:最终类,它不能拥有子类。如果没有此修饰符,则可以被子类所继承。
    abstrat:抽象类,类中的某些方法没有实现,必须由其子类来实现。所以这种类不能实例化。
    public:表明本类可以被所属包以外的类访问。
    final和abstract是互斥的,其他关键词可以组合使用。eg:public final class Teacher extends Human implements Professor

注意

在定义类时,只是通知编译器需要准备多大的内存空间,并没有为它分配内存空间。只有用类创建了对象后,才会真正的占用内存空间。

Java规定:如果成员变量没有被显示赋初值,系统将自动为它们赋值。

三、变量

变量类型 定义
成员变量 定义在类里面,和方法处于同一层次
局部变量 定义在方法里面

1.成员变量

默认情况下,成员变量是实例变量,在外部需要对象才能操作;如果用static修饰,就成为静态成员,也称为类变量,可以直接操作。如果前面加上关键字final ,它就是一个常量。

根据访问权限来区分成员变量 或方法

  public protected 默认 private
本类内部
同一包中的子类 ×
同一包中非子类 ×
不同包中的子类 继承访问 × ×
不同包中非子类 × × ×

根据是否是静态来区分

特点
实例成员变量 1.如果所属的对象没有被创建,实例成员变量就不存在;2.在类的外部使用它,通过“对象名.变量名”来访问;3.在类的内部,实例成员方法也可以直接访问实例成员变量;4.不同对象拥有不同的实例成员变量,互不影响
静态成员变量 1.被类的所有对象所共享,被称为类变量;2.它不属于某个具体对象,也不是保存在某个对象的内存区域中,而是保存在类的公共存储单元。在类的对象被创建之前使用;3.可以通过对象名.变量名或者类名.变量名访问;4.它是一个公共变量,无论哪个对象改变了它的值,对其他所有该类对象都有效

2.局部变量和成员变量的区别

*局部变量必须先定义后使用。

局部变量没有访问权限修饰符,不能用public、private、和protected来修饰。这是因为它只能在定义它的方法内部使用
局部变量不能用static修饰,没有“静态局部变量”,这是Java和C/C++的区别
系统不会自动问局部变量赋初值,但对于成员变量,系统会自动赋初值。基本类型为0,复合类型的值为null
局部变量的作用域仅限于定义它的方法,在方法外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用它
局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用于的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同;静态成员变量的生存期是整个程序运行期
在同一个方法中,不允许有同名的局部变量;在不同的方法中,可以有同名的局部变量,互不干涉

局部变量可以与成员变量同名,且在使用时,局部变量有更高的优先级

四、方法

方法类型
实例方法 必须在类实例化后通过对象来调用
静态方法(类方法) 可以在类实例化之前就使用

1.方法调用的形式

  • 调用者与被调用方法位于同一类中
    [this.]方法名[实际参数列表]
  • 调用者位于被调用方法所在类的外部
    对象名.方法名([实际参数列表]) 或者 类名.方法名([实际参数列表])
public class test{
 public void showMsg(){
 System.out.println("This is showMsg method.");
 }
 public void callOther(){
 showMsg();
 }
 public static void main(String args[ ]){
 test ob = new test();// ?为什么不直接调用
 ob.callOther();
 }
}

main()方法是一个静态方法,它由系统来调用,系统在调用它的时候,并没有创建一个test的对象,而callOther()和showMsg()方法都是实例方法,它们被调用时,都必须有对象的存在。所以必须在main()中先创建一个对象才能调用这两个方法。而callOther()本身就是实例方法,它在执行时,一定有对象存在的。基于这个前提,callOther()可以直接调用showMsg()方法。

**要注意实参和形参的区别。

2.构造方法

一般形式

 构造方法名([参数列表]){
 [this([参数列表]);] | [super([参数列表])];
 语句序列
 }
 *其中this是调用其他的构造方法,super是调用父类的构造方法,它们都必须放在其他语句的前面。

注意事项

构造方法名字必须和类名字完全相同
除了访问权修饰符之外,不能有其他任何修饰符,也就不能有返回值
尽管没有返回值,但不能用“void”修饰
构造方法不能用static和final来修饰。一般也不用private修饰,这会导致无法在外部创建对象
构造方法不能由对象显示调用。一般通过new关键字来调用,或者用this,super来调用
构造方法的参数列表可以为空,也可以有参数,根据参数的有无,可以将构造方法分为无参数的构造方法和带参数的构造方法
用户定义的类可以拥有多个构造方法,但要求参数列表不同
如果用户定义的类未提供任何构造方法时,系统会自动为其提供一个无参数的构造方法

构造方法的调用

  • 隐式调用:类名 对象名 = new 类名(参数);
  • 显示调用:this([参数列表])
    使用this时需要注意: 1)用this调用构造方法是,该语句只能用在构造方法中 2)this语句必须是构造方法的第一条语句 3)和new不同,this虽然可以调用构造方法,但它只是执行方法中的语句,并不会创建对象

构造方法的重载

Java允许定义带参数的构造方法,而且这种带参的构造方法还可以多个,前提是参数列表有区别,这种现象称为构造方法的重载。

如果程序员至少定义了一个构造方法,那么系统不会再提供不带参的构造方法。

3.静态方法(类方法)

一般形式

 [访问权限修饰符]static 返回值类型 方法名([参数列表]){
 语句序列
 }

与实例方法区别

  • 实例方法必须在类实例化以后通过对象来调用,而静态方法可以在实例化之前就使用。
  • 在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式;而实例方法只有后面这种形式。也就是说,调用静态方法无需创建对象。
  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无限制。
  • 静态方法中也不能使用关键字this。

4.静态代码块

一般形式

 static{
 语句序列
 }

注意事项

静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面
静态代码块里面的变量都是局部变量,只在本块内有效
静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他类
如果静态代码块所在的类被创建了多个对象实例,只有第一个对象被创建时才执行静态代码块
一个类中允许定义多个静态代码块,执行顺序根据定义顺序进行
静态代码块只能访问类的静态成员,而不允许访问实例成员

五、其他补充

一、关于变量

  • 在类体中的变量定义部分所定义的变量称为类的成员变量,在方法体中定义的变量和方法的参数称为局部变量。成员变量在整个类内有效,局部变量只在定义它的方法内有效。定义类的成员变量时可赋初值,但对成员变量的操作只能在方法内进行。
  • 成员变量又分为实例成员变量(实例变量)和类成员变量(类变量)。如果成员变量的类型前面加上关键字static,则该成员变量称做类变量或静态成员变量。
  • 当局部变量的名字与成员变量的名字相同时,则成员变量被隐藏。此时如果想在该方法中使用成员变量,必须使用关键字this。
  • 通过new创建类对象时,实例变量被分配内存空间,且不同的实例变量将分配不同的内存空间。类中的成员变量为类变量时,则所有类对象的这个类变量都分配同一处内存,改变其中一个对象的这个类变量将会影响其他对象的这个类变量,即一个类所有的对象共享类变量。
  • 程序执行时,类的字节码加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存。但类中的类变量在该类被加载到内存时就分配了内存空间。
  • 类变量的内存空间直到程序退出运行时才释放所占有的内存。
  • 类变量可通过类名加“.”直接访问,但实例变量必须通过实例名加“.”访问(因为程序加载时实例变量并未分配内存空间)。
  • 对于私有成员变量或方法(声明为private的),只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。
  • 对于共有成员变量和方法(声明为public的),可在另外的类中通过创建的对象进行访问。
  • 受保护的成员变量和方法(声明为protected的),可通过同一个包中的类创建对象进行引用。
  • 友好变量和方法(不用public,private,protected声明的),可通过同一个包中的类创建对象进行引用。
  • 如果一个成员变量声明为final,则它就是常量。
  • 如果子类想使用被子类隐藏了的父类的成员变量,可使用关键字super来引用。

二、关于方法

  • Java语言中写一个方法和c语言中写一个函数完全类似。类中的方法可分为实例方法和类方法(方法类型前面加关键字static)。
  • 方法重载是指一个类中可以有多个方法具有相同的名字,但方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
  • 构造方法是一种特殊的方法,它的名字必须与它所在的类的名字完全相同,并且不返回任何数据类型,即它是void型的(void可以省略不写)。
  • 实例方法既能对类变量操作,也能对实例变量操作。而类方法(带static)只能对类变量进行操作。实例方法可以调用类方法,类方法不能调用实例方法。
  • 使用new运算符和类的构造方法为声明的对象分配内存,如果类中没有构造方法,系统会调用默认的构造方法(无参数的)。  
  • 当类的字节码文件加载到内存时,类中的类方法就分配了相应的入口地址,类方法可被该类创建的任何对象调用(可通过类名调用),类方法的入口地址直到程序退出才被取消。
  • 当类的字节码文件加载到内存时,类中的实例方法不会分配入口地址,当该类创建对象后才分配。实例方法可以被该类创建的任何对象调用。类所创建的所有对象的实例方法的入口地址相同,当所有的对象不存在时,实例方法的入口地址才被取消。
  • 无论是类方法或实例方法,当其被调用时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存。
  • this关键字可以出现在类的实例方法中,代表使用该方法的当前对象。
  • 如果一个方法声明为final,则这个方法不能被重写。
  • 如果一个类中含有abstract方法,那么这个类必须用abstrct来声明。
  • 子类不能继承父类的构造方法,如果子类要使用父类的构造方法,必须在子类的构造方法中使用(使用关键字super表示父类),且必须在第一条语句中使用。
  • 如果子类想使用被子类隐藏了的父类的方法,可使用关键字super来引用。

三、关于类

  • 当前程序可调用当前包中的友好类(类声明前无public修饰的)。
  • 不能用protected和private来声明类。
  • 访问权限的级别从高到低排列:public,protected,友好的,private。
  • 关于类的继承:子类和父类在同一个包中时,子类自然继承了其父类中不是private的成员变量和方法作为自己的成员变量和方法。如果子类和父类不在同一个包中,那么子类继承了父类的protected、public声明的成员变量和方法,不能继承父类的友好变量和友好方法。
  • 如果一个类的声明中没有使用extends关键字,这个类被系统默认为是Object的子类。Object是包java.lang中的类。
  • 如果一个类声明为final,则它不能被继承。
  • abstrct类不能用new运算创建对象,必须产生其子类,由子类创建对象。如果一个类是abstrct类的子类,由它必须具体实现父类的abstract方法。一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现。
  • Java不支持多继承性,即一个类只能有一个父类。

四、关于接口

  • 接口(interface)包含常量定义和方法定义两部分,接口体中只进行方法的声明,不提供方法的实现。
  • 一个类通过使用implements关键字声明自己使用的接口,多个接口名之间用逗号隔开。如“class A implements I1,I2”。
  • 如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法。接口中的方法默认为public的。
  • 如果接口的方法返回的类型不是void的,则在类中实现该接口方法时,方法体中至少要有一个return语句。如果是void型的,类体可以无任何语句(只有“{ }”)。
  • 一个Java源文件就是由类和接口组成的。
  • 如果一个类没有实现接口中的所有方法,那么这个类必须是abstrct类。
  • public声明的接口可被所有的类使用,友好接口类(无public修饰)只能被同一个包中的类使用。

到此这篇关于Java面向对象基础,类,变量,方法的文章就介绍到这了,更多相关Java面向对象基础内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java面向对象基础,类,变量,方法

    一.面向对象的4个基本特征 抽象性.封装性.继承性和多态性. 抽象性分为过程抽象和数据抽象. 封装性 封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件.外部无法直接访问封装的数据,从而保证了这些数据的正确性. 如果外部需要访问类里面的数据,就必须通过接口.接口规定了可对一个特定的对象发出哪些请求. 继承性 继承是一种联结的层次模型,并允许和鼓励类的重用,它提供给了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始

  • Java面向对象基础之多态性,抽象类和接口

    一.多态性 多态是指一个对象可以拥有多种不同的形态,继承是实现多态的基础. 1.1 引用多态和方法多态 引用多态:父类引用可以指向本类的对象,也可以指向子类的对象 方法多态: 1.创建本类对象时,调用的方法为本类方法: 2.创建子类对象时,调用的方法为子类重写或继承的方法. 首先建立父类Animal,包含一个eat()方法,如下代码所示: public class Animal { public void eat(){ System.out.println("动物可以吃东西"); }

  • java面向对象编程类的内聚性分析

    目录 类划分时关于内聚性的问题 静态类的设计 高内聚类的设计 附:面向过程编程中模块的内聚性 偶然内聚或巧合内聚(Coincidental) 逻辑内聚(Logical): 时间内聚(Temporal ): 过程内聚: 通信内聚(Communicational): 顺序内聚(Sequential): 功能内聚(Functional): 类划分时关于内聚性的问题 静态类的设计 在软件设计中,我们经常会将一些通用的方法封装到一个类中,这种类只包含方法,没有属性,类中的方法之间没有关联,内聚性最低,属于

  • Java中String类使用方法总结

    一.Java中关于String类的常用方法 本文只用来自己做笔记,随便写写,方便自己理解,谢谢各位的指正.下面是摘抄慕课的一部分 1.使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符. 2.字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1 3.使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引:如果没有匹配结果,返回 -1 4.整

  • java.util.ArrayDeque类使用方法详解

    本文为大家介绍了java.util.ArrayDeque类使用方法,供大家参考,具体内容如下 1. ArrayDeque有两个类属性,head和tail,两个指针. 2. ArrayDeque通过一个数组作为载体,其中的数组元素在add等方法执行时不移动,发生变化的只是head和tail指针,而且指针是循环变化,数组容量不限制. 3. offer方法和add方法都是通过其中的addLast方法实现,每添加一个元素,就把元素加到数组的尾部,此时,head指针没有变化,而tail指针加一,因为指针是

  • java编程abstract类和方法详解

    抽象类和抽象方法常用知识点: (1)抽象类作为被继承类,子类必须实现抽象类中的所有抽象方法,除非子类也为抽象类. 也就是说,如果子类也为抽象类,可以不实现父类中的抽象方法.但是,如果有一个非抽象类 继承于抽象子类,需要实现抽象子类,抽象子类的抽象父类的所有抽象方法,新帐旧账一起算. (2)抽象类不能用final进行修饰. (3)抽象类不能被实例化,也就是说你用的时候不能通过new关键字创建. (4)抽象类中可以包含抽象方法和非抽象方法,抽象方法没有方法体,也就是没有具体实现, 只是定义了有什么功

  • Java面向对象基础详解

    目录 一.前言 什么是对象? 什么是类? 类和对象的关系? 类的定义 ? 怎么创建对象? 格式: 创建对象的作用? Phone类下: PhoneDemo下: 二.封装 封装的好处? Student类下: 代码: StudentDemo类下: 代码: 总结 一.前言 我们上次学过java的方法,现在我们来学习新的一篇,也算是java中比较重要的一节了 面向对象基础是java中核心. 面向对象主要包括封装.继承.多态 我们这节主要讲的是封装,在这之前我们先来了解一下类和对象的定义和关系 什么是对象?

  • Java面向对象基础教学(三)

    目录 1.包是什么: 2.Java面向对象程序设计三大重要特征: (1)封装: (2)继承extends: (3)多态 3.instanceof 运算符 总结 1.包是什么: 包相当于文件夹,把不同类型的文档归类,分别放到不同的文件夹中 语法: package <包名>; 声明一个包的语句必须放在类中的第一行 包的导入:import <包名>.<类名>:也可以 import <包名>.*: 2.Java面向对象程序设计三大重要特征: (1)封装: 将类的某些

  • Java动态调用类中方法代码

    在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方法不仅限于public的,还可以是private的.编写程序,使用反射机制调用Math类的静态方法sin()和非静态方法equals(). 思路如下:使用Math.class.getDeclaredMethod("sin", Double.TYPE);访问指定的方法,其中"sin

  • java面向对象基础_final详细介绍

    final: 继承的弊端:打破了代码的封装性,final的出现正好弥补了这一弊端 final关键字: 1-final是一个修饰符,可以修饰类,方法,变量; 2-final修饰的类不能被继承 3-final修饰的方法不可以被覆盖 4-final修饰的变量是一个常数,只能被赋值一次并且要在定义时就将其赋予某值 规则: 被定义final的常量要用大写字母表示,各单词之间用下划线_来隔开. 实例一: class Father01{ final String FATHER01_NAME = "张三&quo

随机推荐