面对对象编程(封装)

封装:将数据封装到类的内部,将算法封装到方法中。(★★★★★)

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对象调用。

猜你喜欢

转载自www.cnblogs.com/abcdjava/p/10742301.html
今日推荐