封装:将数据封装到类的内部,将算法封装到方法中。(★★★★★)
1. 访问控制 (封装)
1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取。
2)封装结果:存在但是不可见。
3)public:任何位置可见,可以修饰:类、成员属性、成员方法、内部类、跨包访问类(需要使用import语句导入),成员属性 == 成员变量。
4)protected:当前包中可见,子类中可见。可以修饰:成员属性、成员方法、内部类(只能在类体中使用,不能修饰类)。
5)默认的:当前包内部可见,就是没有任何修饰词,可以修饰:类、成员属性、成员方法、内部类,但在实际项目中很少使用。默认类(包内类)的访问范围:当前包内部可见,不能在其他包中访问类,访问受限!main方法若定在默认类中JVM将找不到,无法执行,因此必定在public类中。
6)private:仅仅在类内部可见。可以修饰:成员属性、成员方法、内部类(只能在类体中使用,不能修饰类)。私有的方法不能继承,也不能重写。
2. 构造器
用于创建对象并初始化对象属性的方法,叫“构造方法”,也叫“构造器”;构造器在类中定义。
1)构造器的名称必须与类名同名,包括大小写。
2)构造器没有返回值,但也不能写void,也不能写return。
3)构造器的参数:一般是初始化对象的前提条件。
4)用new调用!且对象一建立,构造器就运行且仅运行一次。一般方法可被调用多次。
5)类一定有构造器!这是真的,不需要质疑!
6)如果类没有声明(定义)任何的构造器,Java编译器会自动插入默认构造器!
7)默认构造是无参数,方法体是空的构造器,且默认构造器的访问权限随着所属类的访问权限变化而变化。如,若类被public修饰,则默认构造器也带public修饰符。
8)默认构造器是看不到的,一旦自己写上构造器则默认构造器就没有了,自己写的叫自定义构造器,即便自己写的是空参数的构造器,也是自定义构造器,而不是默认构造器。
9)如果类声明了构造器,Java编译器将不再提供默认构造器。若没手动写出无参构造器,但却调用了无参构造器,将会报错!
1 public class Cat{ 2 3 String name; 4 int health; 5 int love; 6 String strain; 7 8 /* 9 public Cat(){ 10 System.out.println("构造方法"); 11 health = 100; 12 love = 0; 13 } 14 */ 15 16 public Cat(){ //无参数构造方法 17 18 } 19 20 public Cat(String _name,int _health,int _love,String _strain){ 21 //有参数构造方法 22 name = _name; 23 health = _health; 24 love = _love; 25 strain = _strain; 26 } 27 28 public void showInfo(){ 29 System.out.print("我的名字叫"+name); 30 System.out.print(",健康值"+health); 31 System.out.print(",亲密度"+love); 32 System.out.println(",我是一只"+strain); 33 } 34 }
实例化对象
1 import java.util.Scanner; 2 public class Test01{ 3 public static void main(String[] args){ 4 5 Cat cat = new Cat();//调用了javac自动添加的默认构造方法 6 7 } 8 }
注意事项:在企业开发过程中,如果开发者提供了有参构造方法,一定要习惯性的提供无参构造。
3.this关键字
1)this():调用本类的其他构造器,按照参数调用构造器,必须在构造器中使用,必须在第一行使用,this() 与super() 互斥,不能同时存在;
2)this.是访问当前对象,本类对象的引用,在能区别实例变量和局部变量时,this可省略,否则一定不能省!
3)this:在运行期间,哪个对象在调用this所在的方法,this就代表哪个对象,隐含绑定到当前“这个对象”。
4. static关键字
static 关键字表示静态,可以修改变量,也可以修饰方法,静态的,只能在类内部使用,可以修饰:属性,方法,内部类。在类加载期间初始化,存在方法区中。
1)静态成员随着类的加载而加载,加载于方法区中,且优先于对象存在。
2)静态修饰的成员:属于类级别的成员,是全体类实例(所有对象)所共享。
3)静态属性:只有一份(而实例变量是每个对象有一份),全体实例共享,类似于全局变量。
4)使用类名访问静态变量,以及类名直接调用方法,不需要创建对象。
5)静态方法只能访问静态成员(静态属性和静态方法),非静态方法既可访问静态,也可访问非静态。
6)静态方法中没有隐含参数this,因此不能访问当前对象资源。也不能定义this和super关键字,因为静态优于对象先存在。
7)非静态方法省略的是this,静态方法省略的是类名(在同一类中),即直接使用属性和方法。
8)静态方法一般用于与当前对象无关工具方法,工厂方法。如:Math.sqrt() Arrays.sort()
9)静态代码块:随着类的加载而执行(用到类的内容才叫加载,只有引用是不加载的),且只执行一次,且优先于主函数,用于给类初始化。
10)代码块(构造代码块):给所有对象进行统一初始化,且优先于构造器执行;而构造器是给对应的对象进行初始化。
问题?
[1]实例方法可以访问静态成员。
[2]静态方法不能访问非静态成员。
为什么?
类加载机制
例:Car car = new Car(…);
当实例化一个对象时,jvm首先把Car.class加载到方法区
[1]读取Car.class 根据声明的成员变量计算申请内存需要的字节数
[2]读取Car.class 中的静态成员,给静态变量分配空间并初始化。
new Car 申请内存得到一个car对象,此时才有对象的空间。showInfo才可以通过car对象调用。