作者:ZJ1314520俊 | 来源:互联网 | 2023-09-23 13:39
封装&this关键字&静态
封装
封装:隐藏事物的属性和实现细节,并对外提供公开的访问方式。
属性私有化:private 可修饰的内容:成员变量、成员方法、构造方法、内部类被private修饰的内容只能在本类访问
get和set方法:属性被私有化之后,只能通过get和set方法访问,并且可以在get和set方法中对数据进行筛选。
get:获取属性的值public 数据类型 get属性名() {return 属性名;}
set:设置属性的值public void set属性名(数据类型 属性名) {this 属性名 = 属性名;}
package com.DaYu;import java.util.Scanner;public class Demo01 {public static void main(String[] args) {Person p = new Person();Scanner sc = new Scanner(System.in);System.out.println("请输入名字");String name = sc.next();System.out.println("请输入年龄");int age = sc.nextInt();p.setName(name);p.setAge(age);System.out.println(p.getName()+" "+p.getAge());}
}class Person {private String name;private int age;public Person() {}public Person(String name,int age) {this.name &#61; name;this.age &#61; age;}public String getName() {return name;}public void setName(String name) {this.name &#61; name;}public int getAge() {if(age > 18) {return 18;}else return age;}public void setAge(int age) {if(age<0) {System.out.println("数据不合法");}else this.age &#61; age;}
}
this关键字
变量的就近访问原则&#xff1a;访问某个变量时&#xff0c;会先寻找最近的该变量的定义&#xff0c;如果
有&#xff0c;那就是这个变量&#xff0c;如果没有&#xff0c;就往更远处去寻找该变量的定义。
this关键字;表示当前类型的当前对象的引用&#xff0c;谁调用this所在的方法&#xff0c;this就代表哪个对象。this.属性名称----访问类中的成员变量&#xff0c;用来区分成员变量与局部变量重名问题。this.方法名称----访问本类的成员方法this&#xff08;&#xff09;----访问本类的构造方法只能用在构造发方法中&#xff0c;不能用在普通方法中&#xff1b;必须是构造方法中的第一条语句&#xff1b;
构造方法
又称构造器、构造函数、constructor
语法&#xff1a;public 方法名&#xff08;形式参数列表&#xff09;{方法体}
用途&#xff1a;用于创建对象&#xff0c;同时给成员变量进行赋值。
特点&#xff1a;构造方法的方法名与类名完全一样&#xff1b;构造方法没有返回值类型&#xff0c;连void也没有&#xff1b;构造方法不能手动调用&#xff0c;只在创建对象时由jvm自动调用&#xff0c;并且每创建一个对象只调用一次&#xff1b;构造方法可以被重载&#xff1b;当一个类中没有定义任何构造方法时&#xff0c;系统会自动给这个类提供一个公开的无参构造&#xff0c;当系统中定义了其他构造方法时&#xff0c;系统不再自动给其添加无参构造&#xff0c;所以实际开发中需要我们把无参和有参的构造方法都写出来。 注意&#xff1a;在创建对象的过程中&#xff0c;会有三个初始化过程&#xff1a;默认初始化、显示初始化&#xff0c;构造初始化三者顺序&#xff1a;默认初始化、显示初始化&#xff0c;构造初始化
对象创建的过程
1.将要创建的对象的所属类型的字节码文件加载到方法区&#xff1b;
2.在栈内存中声明一个该类型的引用&#xff0c;用于将来存储对象的地址&#xff1b;
3.在堆内存中开辟空间&#xff0c;为成员变量分配空间&#xff1b;
4.为成员变量赋默认值;
5.为成员变量赋显示初始值。
6.构造方法进栈&#xff0c;再次为成员变量赋值&#xff08;构造初始化&#xff09;&#xff1b;
7.将对象的地址赋值给栈内存中的引用。
静态 static
static
1.用来修饰成员变量&#xff0c;就是静态变量/类变量&#xff0c;不能用来修饰局部变量特点&#xff1a;静态变量随着类的加载而进入方法区中的静态区静态变量被所有对象所共享&#xff0c;有默认值访问方式&#xff1a;类名.静态变量名&#xff0c;也可以创建对象访问&#xff0c;但不推荐2.用来修饰成员方法特点&#xff1a;静态方法不能不能访问非静态成员&#xff0c;若非要访问&#xff0c;需要在静态方法中创建对象静态方法中不能出现this关键字调用方式&#xff1a;类名.方法名&#xff08;&#xff09;注&#xff1a;静态的不能访问非静态的&#xff01;&#xff01;&#xff01;
静态变量和成员变量的区别&#xff1a;
| 静态变量 | 成员变量 |
---|
所属 | 类 | 对象 |
内存空间 | 方法区中的静态区 | 堆内存 |
生命周期 | 随着类加载而存在&#xff0c;类消失而消失 | 随着对象创建而存在&#xff0c;对象消失而消失 |
访问方式 | 类名.静态变量名 / 对象名.静态变量名 | 对象名.变量名 |
package com.DaYu;public class Demo02 {public static void main(String[] args) {Num.m2(); int b &#61; Num.b;System.out.println(b);Num num2 &#61; new Num();Num num3 &#61; new Num();num2.a&#43;&#43;;num2.b&#43;&#43;;System.out.println(num2.a&#43;" "&#43;num2.b);System.out.println(num3.a&#43;" "&#43;num3.b);}
}class Num {int a &#61; 10;static int b &#61; 20; public void m1() {System.out.println(a);System.out.println(b);}public static void m2() {System.out.println(b);Num num &#61; new Num();System.out.println(num.a);num.m1();}
}