面向对象进阶分为成员变量,this关键字,隐藏和封装以及static关键字。
1.成员变量
(成员变量也称为属性)
成员变量
语法:[<修饰符>][static][final]<变量类型><变量名>
(1)static:表示一个类的成员变量,即静态成员变量。
(2)final: 表示是一个常量。
2.this关键字
this关键字最大的作用就是让类中的一个方法访问该类中另外一个方法或实例成员变量。
解决实例变量和局部变量同名的问题
大多数情况下,在方法中访问类中的实例,成员变量无需使用this前缀,如果方法中的一个局部变量和实例变量同名,但程序又需要在该方法中访问该实例变量,则必须使用this前缀。
public class Hero {
String name; // 定义实例属性 name
public void setName(String name){
name=name; //此处易混满,可读性差
public static void main(String[] args)
// 创建 Hero 对象
Hero hero=new Hero();
hero setName("风暴精灵"); //调用 setName) 方法
System.out.printin("hero 的名字为 :"+hero.name);
}
}
运行结果:
hero的名字为:null
运行结果为null,原因是方法中的局部变量与实例变量同名时,在方法中如果不使用this前缀调用实例变量,则在方法中默认调用方法中的局部变量(形参也是局部变量),但是如果需要让形参的name变量为类中的实例变量name赋值,则需要修改setName()中的name=name语句,具体操作如下:
public class Hero {
String name; // 定义实例属性 name
public void setName(String name){
// "this. 变量"永远表示的是调用类中的实例成员变量 this.name = name;
}
public static void main(String[] args){
// 创建 Hero 对象
Hero hero = new Hero();
//调用 setName() 方法
hero.setName("风暴精灵");
System.out.println("hero 的名字为 :"+hero.name);
}
}
运行结果:
hero的名字为:风暴精灵
3,隐藏和封装
封装是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法,实现对内部信息的操作和访问。
实现以下目的
(1)隐藏类的实现细节。
(2)让使用者只能通过事先预定的方法访问数据,从而可以在该方法中加入控制逻辑,限制对属性的不合理访问。
(3)可进行数据检查,从而有利于保证对象信息的完整性。(4)便于修改,提高代码的可维护性。
实现良好的封装,需要从以下两个方面考虑:
(1)隐藏对象的属性和实现细节,不允许外部直接访问。
(2)暴露出方法,让方法控制对这些属性进行安全的访问和操作。
因此,封装实际上有两个方面的会义:隐藏该隐藏的,暴露该暴露的。这两个方面都需要通过使用JAVA提供的访问控制符来实现。
使用访问控制符
访问级别从小到大
4,static关键字
被static修饰的成员即静态成员,静态成员包括静态代码块,静态属性和静态方法。
静态成员不属于某个对象,仅属于静态成员所在的类。
(1)静态成员变量
类的成员变量包含静态变量(也称为类变量)和实例变量。
静态变量和实例变量的区别包括以下两点:
1.静态变量共享一块存储空间,在类加载的过程中完成静态变量的内部储存即初始化,可以使用类直接访问静态成员变量。
2.每创建一个实例,都会在堆内存中为其创建一块内存空间,每一个实例都含有一个属于自身的实例属性。
(静态成员变量仅初始化一次,所以的实例都可以访问此静态成员变量,可直接通过类名访问)
(2)静态方法
被static修饰的方法称为静态方法。静态方法可以通过类名直接访问。
public class MathUtils{
//计算平方
public static double square(double num){
return num*num;
}
public static void main(String[] args){
double num=9.6;
double result=MathUtils.square(num);
System.out.printIn(num+" 的平方 ="+result);
}
}
运行结果:
9.6的平方=92.16
(静态方法不能访问实例成员,但可以在实例方法中访问静态方法)
(3)静态代码块
静态方法在类加载后,虽然在内存中已经分配了内存空间,但只有显式地调用静态方法时,该方法才会被执行。
如果需要在类加载时执行某一操作,则可以使用静态代码块。 静态代码不存在任何方法体中,它在Java 虚拟机
加载类时被执行。如果类中包会多个静态代码块,则Java虚拟机将按照它们在类中出现的顺序依次执行,且每个静态代码块只会被执行一次。
public class StaticBlock{
// 第一个静态代码块
static{
System.out.println("--- 第一个静态代码块---")
}
// 第二个静态代码块
static{
System.out.println("--- 第二个静态代码块---");
}
// 第三个静态代码块
static{
System.out.printIn("---第三个静态代码块---");
}
public static void main(String[] args)
System.out.printIn("---main()方法被执行了 ---");
}
}
运行结果:
---第一个静态代码块---
---第二个静态代码块---
---第三个静态代码块---
---main()方法被执行了---
(如果两个类之间存在继承关系,子类和父类中都存在静态代码块,那么首先会执行父类中的静态代码块,在执行职类中的静态代码块。)