Java面向对象——类的成员
Java面向对象——类的成员
摘要:本文主要介绍了类的常见成员。
属性
属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值。
默认值
Boolean类型成员变量的默认值是false。
Int类型成员变量的默认值是0。
Double类型成员变量的默认值是0.0。
String类型成员变量的默认值是null。
Char类型成员变量的默认值是\u0000。
局部变量
定义:方法中,语句块中,方法参数中定义的变量。
作用域:方法内部,语句块内部。其他方法,其他代码块不能访问。
生命周期:方法或者语句块调用开始到方法或者语句块调用结束。
共享性:方法内部,语句块内部共享。对于多个线程来讲,变量初始化到自己的方法区中,主内存不存在该变量,每个线程在访问方法时使用各自的局部变量,所以线程之间不共享,也就不存在线程安全问题。
访问修饰符:不能被修饰,因为局部变量的作用域本身就比最小的访问权限还要小,所以即便修饰了也不具备相应的访问权限。
默认值:没有默认值,被声明后必须经过初始化才可以使用。
值传递:局部变量解决了方法内部,语句块内部行之间的变量传递问题。如果没有局部变量,不知道行之间怎么传递变量。
实例变量
定义:类中定义的变量。又称为成员属性,是描述对象状态的数据,是类中很重要的组成成分。
作用域:同一个类的实例对象内部,不同的实例对象直接不共享。
生命周期:伴随整个类实例始终,变量在创建类实例时被创建,在实例对象被销毁的时候销毁。
共享性:在同一个类实例内部共享,不同实例对象不共享。对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,如果使用的是同一个实例对象的变量,线程之间共享一个主内存变量,存在线程安全问题。
访问修饰符:可以被修饰。
默认值:有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定。
值传递:成员变量解决了类实例各方法之间的变量传递。如果没有成员变量,方法之间变量传递只能靠参数。
全局变量
定义:全局变量在Java中也可以叫静态变量,通过static关键字修饰。全局变量也称为类变量、静态变量。
作用域:整个类,在每个实例对象之间共享。
生命周期:伴随整个类始终,变量在第一次使用该类时被创建。
共享性:在整个类共享,并且在不同实例对象之间共享。对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,线程之间共享一个主内存变量,存在线程安全问题。
访问修饰符:可以被修饰。
默认值:有默认值,和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
值传递:全局变量解决了类之间的变量传递。如果没有全局变量,类之间变量只能靠构造实例的时候相互传递。
方法
方法就是用来完成解决某件事情或实现某个功能的办法。
定义
在Java中,声明一个方法的具体语法格式如下:
修饰符 返回值类型 方法名(参数类型 参数名, 参数类型 参数名, ... , 参数类型 参数名) {
执行语句;
return 返回值;
}
修饰符:
方法的修饰符比较多,有对访问权限进行限定的,有静态修饰符static,还有最终修饰符final等,这些修饰符在后面的学习过程中会逐步介绍。
返回值类型:
用于限定方法返回值的数据类型,返回给调用方,返回类型可以是任意类型。
如果不需要返回值,则写void,也不需要写return和返回值。如果需要返回值,则需要写一个返回类型,并且return后的返回值需要和返回类型一致。
方法名:
功能块的名字,命名规则和变量命名规则一样。
参数类型和参数名:
参数类型用于限定调用方法时传入参数的数据类型,可以为任意类型,参数类型和返回类型没有任何关系。
参数名是一个变量,用于接收调用方法时传入的数据。
参数:
参数类型和参数名组成参数。
参数可以有多个,中间用逗号隔开。
方法定义时参数称为形式参数,简称形参。
方法调用时参数称为实际参数,简称实参。
形参和实参的类型、个数、顺序必须一致,名字没有要求。
执行语句:
里面可以写任何逻辑语句,表示的是此方法的具体功能。
return和返回值:
return用于结束方法以及返回方法指定类型的值。
返回值是被return语句返回的值,该值会返回给调用者。
调用
方法的调用可以通过如下方式调用:
类型 变量名 = 对象实例.方法名(参数);
但是在不同的情况下又有不同的区分,有的可以不写或者不能写。
是否有参数:
如果有参数,那么需要在括号中填写参数,多个参数用逗号分隔: 类型 变量名 = 对象实例.方法名(参数, 参数); 。
如果没有,则不需要填写参数: 类型 变量名 = 对象实例.方法名(); 。
是否有返回值:
如果方法有返回值,那么需要用接收返回值,也可以不接收,但建议用对象接收: 类型 变量名 = 对象实例.方法名(参数); 。
如果没有返回值,则不需要接收返回值: 对象实例.方法名(参数); 。
是否在当前类中使用:
如果在当前类中使用,则可以直接调用,不需要通过对象实例调用: 类型 变量名 = 方法名(参数); 。
如果在其他类中使用,则需要通过对象实例调用: 类型 变量名 = 对象实例.方法名(参数); 。
如果是被statis修饰的方法,则可以通过类名调用: 类型 变量名 = 类名.方法名(参数); 。
参数传递
参数传递是指,调用方法时,将实参的值传递给形参过程。
定义方法时,参数列表中的变量,我们称为形式参数。调用方法时,传入给方法的数值,我们称为实际参数。
当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响。
当调用方法时,如果传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响。
重载
同一个类中,方法名相同,参数列表不同,这种现象称为方法重载(overload)。
所谓的参数不一样,主要有两点,第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。
重写(覆盖)
方法覆盖是说子类重新定义了父类的方法,是在两个类中,必须有相同的方法名,相同的参数列表,相同的返回类型。
被重写的方法不能拥有比父类的方法更严格的访问控制权限。
构造方法不能被继承,因此不能被重写,在子类中只能通过super关键字调用父类的构造方法。
类的构造方法(构造器)
构造方法是类用于创建对象的一个特殊的方法,当类创建对象时,就会调用类的构造方法。
语法
修饰符 类名(参数列表) {
方法体;
}
说明
构造方法没有返回类型,也不能使用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修饰的变量(查看动态代理)。
互访原则:
外部类和外部其他类都不能访问。
使用:
经常用在方法的实参中,比较简洁。
new 抽象类或接口() {
重写方法
};
Java面向对象——类的成员的更多相关文章
- Java面向对象-类与对象
Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...
- Java面向对象——类,对象和方法
1.类的概念 在生活中,说到类,可以联想到类别,同类,会想到一类人,一类事物等等.而这一类人或事物都是具有相同特征或特点和行为的,我们根据不同的特征或特点和行为将他们归类或分类.同时,当我们认识一个新 ...
- Java面向对象--类和对象
面向对象是相对于面向过程而言的,是软件开发方法.面向对象把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统设计,更贴近事物的自然运行模式.本篇博客介绍Java面向对象的类和对象 目录: 面 ...
- 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
. 一. 类定义 类定义需要实现两部分 : -- 接口部分 : 定义类的成员变量和方法, 方法是抽象的, 在头文件中定义; -- 实现部分 : 引入接口部分的头文件, 实现抽象方法; 1. 接口部分定 ...
- Java查看类的成员
在一个类的内部,一般包括以下几类成员:成员变量.构造方法.普通方法和内部类等.使用反射机制可以在无法查看源代码的情况下查看类的成员.编写程序,使用反射机制查看ArrayList类中定义的成员变量.构造 ...
- Python面向对象(类的成员之属性)
day24 类的成员之属性 class Foo(): def bar(self): print("bar") @property def per(self): ') return ...
- Python面向对象(类的成员之方法)
day24 类的成员之方法 - 普通方法,保存在类中,由对象来调用,self > 对象 - 静态方法,保存在类中,由类直接调用 - 类方法,保存在类中,由类直接调用,cls > 当前类 c ...
- Python面向对象(类的成员之字段)
day24 类的成员之字段 # 字段 - 普通字段,保存在对象中,执行只能通过对象访问 - 静态字段,保存在类中, 执行 可以通过对象访问 也可以通过类访问 clas ...
- python面向对象(类的成员及类方法)
类的普通成员 字段 方法 属性 类的高级成员 静态字段 静态方法 属性方法 类方法 类成员修饰符 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中, ...
随机推荐
- python从入门到放弃之协程
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- [视频教程] 配置mysql用户的权限并查询数据
MySQL安装后,需要允许外部IP访问数据库.修改加密配置与增加新用户,配置用户权限修改配置文件,增加默认加密方式的配置项. 当连接数据库的时候会报验证方法不存在的错误,这是因为新版本mysql的加密 ...
- Linux:目录的查找
搜索文件与目录 find [查找范围] [查找条件表达式] 常用的选项 -name 按名称查找,允许使用通配符 -type 按文件类型查找 文件类型包括: 普通文件 f 目录 d 块设备文件 b 字符 ...
- CodeForces - 1228C(质因数分解+贡献法)
题意 https://vjudge.net/problem/CodeForces-1228C 首先先介绍一些涉及到的定义: 定义prime(x)表示x的质因子集合.举例来说,prime(140)={2 ...
- Oracle 双机热备+双机冷备+负载均衡
引用地址:https://wenku.baidu.com/view/7cca62f1ddccda38366baf7f.html SQL Server 2008 R2双机热备 引用地址:https:// ...
- 线程让步yield
一.yield()的作用 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其 ...
- BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并
问题描述 BZOJ2733 LG3224 题解 对于每个结点建立一棵权值线段树. 查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树. 并查集维护连通性. 同时 STO hkk,zcr, ...
- LG1393 动态逆序对
问题描述 LG1393 题解 本题可以使用\(\mathrm{CDQ}\)分治完成. 二维偏序 根据偏序的定义,逆序对是一个二维偏序,但这个二维偏序比较特殊: \(i>j,a_i<a_j\ ...
- 【2019.8.6 慈溪模拟赛 T2】树上路径(tree)(Trie)
从暴力考虑转化题意 考虑最暴力的做法,我们枚举路径的两端,然后采用类似求树上路径长度的做法,计算两点到根的贡献,然后除去\(LCA\)到根的贡献两次. 即,设\(v_i\)为\(i\)到根路径上的边权 ...
- 【ECNU3510】燃烧吧,室友!(模拟)
点此看题面 大致题意: 给你一个只含\(C,H,O\)的化学式,问需要几\(mol\)的氧气才能使其完全燃烧成\(CO_2\)和\(H_2O\). 模拟+化学 首先,我们模拟求出化学式中\(C,H,O ...