2.1 成员变量
2.1.1 成员变量的概述
变量可以分为成员变量和局部变量,成员变量是在类范围内定义的变量,
局部变量是在类范围内定义的变量
成员变量分为:(实例变量、类变量)
局部变量分为:(形参、方法局部变量)
成员变量与局部变量的区别:
1.在类中的位置不同
2.在内存中的位置不同
3.生命周期不同
4.初始值
2.1.2 成员变量的使用
1.成员变量在使用之前,需要先进行声明,
2.声明成员变量是在类的内部、方法的外部定义的变量,成员变量分为实列变量和类变量。
3.实例变量作用域是当前所属实例的范围,类的成员变量的作用域是整个类范围。成员变量的声明要给出变量名、变量类型以及其他特性,其语法如下:
【修饰符 static][<变量类型><变量名>
示例1:
public class Hero{
String name;
int age;
public static void main(String[ args){
Hero hero1 new Hero();
hero1.name="德鲁伊";
hero1.age=45;
Hero hero2 new Hero();
System.out.(英雄hero1的名字:+hero1.nme+"t"+"年龄+hero1.age)
System.ou. printin("英雄hero2的名字:"+hero2.nme+"\t"+"年龄:"+hero2.age)
}
}
实例属性内存分配示意图:
2.2 this关键字
Java提供了一个this关键字,this关键字总是指向调用该方法的对象
2.2.1 方法中调用方法或成员变量
this关键字最大的作用就是让类中的一个方法访问该类中的另一个方法或实例成员变量假设定义了一个Hero类
示例:
public class Hero{
∥定义jump()方法
public void jump(){
System.out. println("---英雄遇到了障碍需要跳过去---)
∥定义run(方法
public void run(){
System.out. println("---执行run()法英雄正在奔跑---");
Hero hero= new Hero();//创建Hero对象
System.outt. printIn("her对象已经被创建内存地址为"+hero. hashCode+,它将实行jump法
hero.jump();//调用run()方法
}
}
执行效果如下:
2.2.2 解决实例变量与局部变量同名的问题
如果方法中的一个局部变量和实例变量同名,但程序又需要在该方法中访问该实例变量,则必须使用this前缀。具体情况如下:
public class Hero
String name定义实例属性name
public void setName(String name){
name=name;∥此处易混淆,可读性差
public static void main(Stringl] args){
∥创建Hero对象
Hero hero=new Hero()
hero. setName("风暴精灵");调 setName用()方法
System.out t. printIn("hero的名字为:"+hero.name)
2.3 隐藏与封装
2.3.1 封装的概念(现实生活中)
1.封装是面对象的三大特性之
2.封装将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法实现对内部信息的操作和访问。
3.封装是面向对像编程语言对客观世界的模拟,客观世界中的属性均被隐藏在对象内部,外界无法直接操作和修改
封装可以实现的目的:
(1)总藏类的实现细节。
(2)让使用者只能通过事先预定的方法访问数据,从而可以在该方法中加入控制逻辑,限制对属性的不合理访(3)可进行数据检查,从而有利于保证对象信息的完整性。
(4)便于修改,提高代码的可维护性
需要考虑的两点:
(1)隐藏对象的属性和实现细节,不允许外部直接访问。
(2)暴露出方法,让方法控制对这些属性进行安全的访问和操作。因此,封装实际上有两个方面的含义隐藏该隐藏的,暴露该暴露的。这两个方面都需要通过使用Java提供的
示例:
public class Hero(
//使 private用修饰属性,隐藏这些属性
private String name;
private int age;
提供方法操作name属性
public void setName(String name)(
∥执行合理校验,要求用户名必须在2~6之间
if(name. length() >6name. length()<2){
System.out. printIn("您输入的名字不符合要求")
return;
Jelse{
this.name name;
public String getName(){
return name
∥提供方法操作age属性
public void setAge(int age){
11执行合理校验,要求用户年龄必须在0~100之间
if(age>100 age<0)
System,out, printin("您输入的年龄不合法")
return
Jelse{
public int getAge()
return age;
2.4 static关键字
1. 当一个类被加载至JVM中,静态成员会被初始化,被static修饰的成员即为静态成员
2. 静态成员包括静态代码块、静态属性和静态方法
3. 静态成员不属于摸个对象,仅属于静态成员所属于的类
2.4.1 静态成员变量
1. 类的成员变量【静态变量(类变量)、实例变量】
2. 静态成员变量是被static修饰的成员变量
public class Bank {
private static int count = 5000;
public static void main (string[] args){
for(int i=0; i<0;i++) {
Bank bank = new bank();
bank.count = bank.count - 1000;
system.out.println("当前银行总钱数=" +Bank.count);
}
}
}
执行效果如下:
2.4.2 静态方法
1.被static修饰的方法称为静态方法
2.静态方法也可通过类名直接访问
3.静态方法中不能访问非静态的成员
4.静态方法通常作为工具方法,不会因为实例的不同,而影响方法最终的执行效果。
示例:
public class MathUtils {
public static double square (double num) {
return num*num;
}
public static void main (string[] args) {
double num = 9.6;
double rusult = MathUtils.square(num);
system.out.println(num +"的平方"+result);
}
}
2.4.3 静态代码块
1.如果需要在类加载时执行某一操作,则可以使用静态代码块。
2.静态代码不存在任何方法体中,它在Java虚拟机加载类时执行。
3.如果类中包含多个静态代码块,则Java虚拟机将按照它们在类中出现的顺序依次执行
4.静态代码块只会被执行一次
public class StaticBiock {
static{
system.out.println("----第一个代码块----")
}
static{
system.out.println("----第二个代码块----")
}
static{
system.out.println("----第三个代码块----")
}
public static void main(string[] args) {
system.out.println("----main() 方法被执行了----")
}
}
执行如下: