Java面向对象——类的成员

Java面向对象——类的成员

摘要:本文主要介绍了类的常见成员。

属性

属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值。

默认值

Boolean类型成员变量的默认值是false。

Int类型成员变量的默认值是0。

Double类型成员变量的默认值是0.0。

String类型成员变量的默认值是null。

Char类型成员变量的默认值是u0000。

局部变量

定义:方法中,语句块中,方法参数中定义的变量。

作用域:方法内部,语句块内部。其他方法,其他代码块不能访问。 

生命周期:方法或者语句块调用开始到方法或者语句块调用结束。

共享性:方法内部,语句块内部共享。对于多个线程来讲,变量初始化到自己的方法区中,主内存不存在该变量,每个线程在访问方法时使用各自的局部变量,所以线程之间不共享,也就不存在线程安全问题。

访问修饰符:不能被修饰,因为局部变量的作用域本身就比最小的访问权限还要小,所以即便修饰了也不具备相应的访问权限。

默认值:没有默认值,被声明后必须经过初始化才可以使用。

值传递:局部变量解决了方法内部,语句块内部行之间的变量传递问题。如果没有局部变量,不知道行之间怎么传递变量。

实例变量

定义:类中定义的变量。又称为成员属性,是描述对象状态的数据,是类中很重要的组成成分。

作用域:同一个类的实例对象内部,不同的实例对象直接不共享。

生命周期:伴随整个类实例始终,变量在创建类实例时被创建,在实例对象被销毁的时候销毁。

共享性:在同一个类实例内部共享,不同实例对象不共享。对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,如果使用的是同一个实例对象的变量,线程之间共享一个主内存变量,存在线程安全问题。

访问修饰符:可以被修饰。

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

值传递:成员变量解决了类实例各方法之间的变量传递。如果没有成员变量,方法之间变量传递只能靠参数。

全局变量

定义:全局变量在Java中也可以叫静态变量,通过static关键字修饰。全局变量也称为类变量、静态变量。

作用域:整个类,在每个实例对象之间共享。

生命周期:伴随整个类始终,变量在第一次使用该类时被创建。

共享性:在整个类共享,并且在不同实例对象之间共享。对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,线程之间共享一个主内存变量,存在线程安全问题。

访问修饰符:可以被修饰。

默认值:有默认值,和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。

值传递:全局变量解决了类之间的变量传递。如果没有全局变量,类之间变量只能靠构造实例的时候相互传递。

方法

方法就是用来完成解决某件事情或实现某个功能的办法。

定义

在Java中,声明一个方法的具体语法格式如下:

1 修饰符 返回值类型 方法名(参数类型 参数名, 参数类型 参数名, ... , 参数类型 参数名) {
2     执行语句;
3     return 返回值;
4 }

修饰符:

方法的修饰符比较多,有对访问权限进行限定的,有静态修饰符static,还有最终修饰符final等,这些修饰符在后面的学习过程中会逐步介绍。

返回值类型:

用于限定方法返回值的数据类型,返回给调用方,返回类型可以是任意类型。

如果不需要返回值,则写void,也不需要写return和返回值。如果需要返回值,则需要写一个返回类型,并且return后的返回值需要和返回类型一致。

方法名:

功能块的名字,命名规则和变量命名规则一样。

参数类型和参数名:

参数类型用于限定调用方法时传入参数的数据类型,可以为任意类型,参数类型和返回类型没有任何关系。

参数名是一个变量,用于接收调用方法时传入的数据。

参数:

参数类型和参数名组成参数。

参数可以有多个,中间用逗号隔开。

方法定义时参数称为形式参数,简称形参。

方法调用时参数称为实际参数,简称实参。

形参和实参的类型、个数、顺序必须一致,名字没有要求。

执行语句:

里面可以写任何逻辑语句,表示的是此方法的具体功能。

return和返回值:

return用于结束方法以及返回方法指定类型的值。

返回值是被return语句返回的值,该值会返回给调用者。

调用

方法的调用可以通过如下方式调用:

1 类型 变量名 = 对象实例.方法名(参数);

但是在不同的情况下又有不同的区分,有的可以不写或者不能写。

是否有参数:

如果有参数,那么需要在括号中填写参数,多个参数用逗号分隔: 类型 变量名 = 对象实例.方法名(参数, 参数); 。

如果没有,则不需要填写参数: 类型 变量名 = 对象实例.方法名(); 。

是否有返回值:

如果方法有返回值,那么需要用接收返回值,也可以不接收,但建议用对象接收: 类型 变量名 = 对象实例.方法名(参数); 。

如果没有返回值,则不需要接收返回值: 对象实例.方法名(参数); 。

是否在当前类中使用:

如果在当前类中使用,则可以直接调用,不需要通过对象实例调用: 类型 变量名 = 方法名(参数); 。

如果在其他类中使用,则需要通过对象实例调用: 类型 变量名 = 对象实例.方法名(参数); 。

如果是被statis修饰的方法,则可以通过类名调用: 类型 变量名 = 类名.方法名(参数); 。

参数传递

参数传递是指,调用方法时,将实参的值传递给形参过程。

定义方法时,参数列表中的变量,我们称为形式参数。调用方法时,传入给方法的数值,我们称为实际参数。

当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响。

当调用方法时,如果传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响。

重载

同一个类中,方法名相同,参数列表不同,这种现象称为方法重载(overload)。

所谓的参数不一样,主要有两点,第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。

重写(覆盖)

方法覆盖是说子类重新定义了父类的方法,是在两个类中,必须有相同的方法名,相同的参数列表,相同的返回类型。

被重写的方法不能拥有比父类的方法更严格的访问控制权限。

构造方法不能被继承,因此不能被重写,在子类中只能通过super关键字调用父类的构造方法。

类的构造方法(构造器)

构造方法是类用于创建对象的一个特殊的方法,当类创建对象时,就会调用类的构造方法。

语法

1 修饰符 类名(参数列表) {
2     方法体;
3 }

说明

构造方法没有返回类型,也不能使用void关键字。

构造方法的方法名必须和类名一致。

如果在类中没有定义构造方法,那么编译器会提供默认的构造方法,默认的构造方法没有参数列表,也没有方法体。

如果在类中定义了构造方法,那么编译器就不会提供默认的构造方法。

构造方法必须使用new关键字进行调用: new 类名(); 或 new 类名(参数); 。

初始化块

说明

初始化块分为静态初始化块和动态初始化块,优先于构造方法执行,经常执行初始化信息。

静态初始化块和普通初始化块都可以有多个,都可以写任何逻辑语句,不能定义方法。

执行顺序

静态成员变量初始化和静态初始化块的执行顺序由定义位置决定,从上往下执行。

成员变量初始化和初始化块的执行顺序由定义的位置决定,从上往下执行。

最后执行构造方法。

普通初始化块和静态初始化块对比

相同点:

默认执行顺序都是从上往下,都可以有多个。

不同点:

普通初始化块能执行多次,静态初始化块只执行一次。

普通初始化块实在对象创建后执行,静态初始化块是在类加载时执行。

普通初始化块可以访问普通成员和静态成员,静态成员初始化块只能访问静态成员。

内部类

定义

定义在一个类体内部的类称为内部类,包含内部类的类称为外部类,其他的类称为外部其他类。

普通成员内部类

特点:

可以直接访问外部类的所有成员,与访问修饰符和修饰符无关。

内部类可以加访问修饰符。

不能使用静态成员。

互访原则:

外部类 -> 内部类:new Inner();

外部其他类 -> 内部类:Outer.Inner i = new Outer().new Inner();

静态内部类

特点:

静态内部类只能访问外部类所有静态的成员,不能访问普通成员。

静态内部类中的所有方法都只能通过创建对象的方式访问外部类非静态成员。

可以加访问修饰符。

互访原则:

外部类 -> 内部类:new Inner();

外部其他类 -> 内部类:Outer.Inner i = new Outer.Inner();

普通局部内部类

特点:

不能加访问修饰符。

作用范围只是在定义它的方法内,出了这个方法,则不能访问此类。

外部类访问普通局部内部类,只能在定义之后访问,否则报编译错误。

可以访问外部类的所有成员,能访问当前局部块中的final修饰的变量。

互访原则:

外部类 -> 内部类:new Inner();

外部其他类不能访问

匿名内部类

注意:

new A();// 匿名对象,相当于创建了A类自身的对象。

new A(){};// 匿名内部类,或匿名内部类对象,相当于创建了A的子类对象。

特点:

定义在方法或块内,没有类名,只有类体。

一般用来创建抽象类或接口的子类。

可以访问外部类的所有成员,能访问当前局部块中的final修饰的变量(查看动态代理)。

互访原则:

外部类和外部其他类都不能访问。

使用:

经常用在方法的实参中,比较简洁。

1 new 抽象类或接口() {
2     重写方法
3 };
原文地址:https://www.cnblogs.com/shamao/p/10907009.html