封装
//用来描述一类事物的类,专业叫做:javabean类
//在javabean类是不写main方法的//一个java文件中可以定义多个类,且只能一个类是public修饰,而且public修饰的类名必须成为代码的文件名
://在类中一般无需指定初始化值 存在默认值//引用数据类型:类,接口,数组,String 初始化是NULLd//类名的首字母建议大写,驼峰
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为
例子:门关门,圆画圆
封装的好处:有很多可以现成的已经封装的类,我们可以直接调用这些现成的类,可以极大方便与我们编写代码
Private关键字
- 是一个权限修饰符
- 可以修饰成员
- 被private修饰的成员只能早本类中才能访问
格式化代码:ctrl + alt + l (注意需要关闭QQ,才能进行这个操作)
对于私有属性的成员变量往往需要一个set和get搭配使用才能对私有属性的变量进行赋值
下面是一个具体例子:
自己定义一个类(女朋友类型):
public class GirlFriend {//属性private String name;private int age;private String gender;//针对每一个私有变量,都需要提供get和set方法//set方法给成员赋值//get对外提供成员变量的值//作用:给成员变量name赋值public void setName(String n){name = n;}//作用对外提供方属性public String getName(){return name;}//age//setage:给成员变量age进行赋值的//getage对外提供成员变量age的值public void setAge(int a) {if (a >= 18 && a <= 50) {age = a;} else {System.out.println("非法数据\n");}}//get(获取)public int getAge() {return age;}//genderpublic void setGender(String g){gender = g;}public String getGender(){return gender;}}
女朋友类型的TEXT:
public class GirlFrindText {public static void main(String[] args) {//创建女朋友GirlFriend gfl = new GirlFriend();//赋值操作gfl.setName("郑美玲");gfl.setAge(18);gfl.setGender("女");System.out.println(gfl.getName());System.out.println(gfl.getAge());System.out.println(gfl.getGender());}
}
不难发现对于私有私有类型的成员变量我们需要使用类里面的方法进行赋值和得到答案
所以就需要set(赋值)和get(提供值)搭配使用
小结:
1.private关键字是一个权限修饰符
2.可以修饰成员变量
3.被private修饰的成员只能在本类中才能访问
4.针对private修饰的成员变量,如果需要被其他使用,需要提供相应的操作(set和get搭配使用)
5.提供”setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
6.提供”getXxx(参数)”方法,用于获取成员变量的值,方法使用public修饰
this关键字
成员变量和局部变量
如果我们把变量定义在方法里面 那么这个变量就叫做局部变量
如果我们把变量定义在类里面 那么这个就叫做成员变量
如下面这个:
public class GirlFrind{private int age;//成员变量public void method(){int age = 10;//局部变量System.out.println(age);}
}
这个代码并没有错误:这里的age的值究竟取决于谁呢? 这里讲究一个就近原则,打印的这个age谁离它近 那么这个age就是谁的值,很显然这个age离局部变量age = 10更近,所以这个age的值就是10
如果我就是想要打印成员变量的值 那么我们就需要在打印语句中加上this.age 这个时候打印的就是成员变量的值(后面会讲this在内存中的储存方式)
public class GirlFrind{private int age;//成员变量public void method(){int age = 10;//局部变量System.out.println(this.age);}
}
下面这个是使用了this关键字进行的操作:
public void setAge(int age) {if (age >= 18 && age <= 50) {this.age = age;} else {System.out.println("非法数据\n");}
}
这个是将我们接受到的值赋给成员变量age。
小结:1.就近原则
System.out.println(age);
System.out.println(this.age);
构造方法
作用:在创建对象的时候给成员变量初始化的操作。
特点:
- 方法名和类名相同,大小写一致
- 没有返回值类型
- 没有具体得返回值(不能有return 带回结构数据)
执行时机:
- 创建对象得时候由虚拟机调用,不能手动调用构造方法
- 每创建一次对象,就会使用一次构造方法
犯下的错误:对于set类函数我们使用这个方法的时候必须要使这个方法的类型为void \
然后我们使用get类函数我们需要将这个方法的类型设置为变量自己的类型
System.out.println(stu1.setAge(19));
这个输出函数里面的类型是void类型,我竟然将这个函数里面的直接放在了输出函数里面了
当我们没有构造方法的时候系统会自动给我们初始化一个构造方法(这个构造方法没有含有任何的参数和变量)
当我们定义了构造方法,系统将不再提供默认的构造方法
当我们将自定义的无参构造的构造方法给注释掉后,然后再在主类中的main的参数去掉后,就会发现程序已经报错了,所以当我们当我们定义了构造方法,系统将不再提供默认的构造方法。 所以这个我们自己定义一个无参构造是很有必要的。
构造方法的重载:
带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这就叫做构造方法的重载 (有点类似与C++里面的sort函数可以含多个变量)
推荐使用方法:
无论是否使用,都手动书写参数构造方法,和带全部参数的构造方法
小结:
- 创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的
- 无参的构造方法:初始化对象的时候,成员的数据均采用默认值
有参的构造方法:在初始化对象的时候,可以为对象进行赋值 - 任何类定义出来,默认就自带了无参构造器,写不写都有
标准的javabean类
用来描述一类事物的类,专业叫做:javabean类
1.类名需要见民知意
2.成员变量需要使用private修饰
3.提供至少两个构造方法:第一个无参构造方法,第二个有参构造方法
4.成员方法:提供每一个成员变量对应的setXxx(),getXxx() 如还有其他行为也要写上
除此之外我们可以使用两个快捷方式生成标准的javabean
第一个就是
第一个就是:alt + insert
或者:alt + fn + insert
除了这个我们还可以使用一个插件自动生成标准的javabean,只需要在鼠标右键进行选择就可以了 或者是alt + shift + ' .' 这个样也可以生成一个标准的javabean
对象储存图
Java内存分配:1.栈 2.堆 3.方法区 4.本地方法区 5.寄存器
一个对象的内存图:就以student s = new Student();为例
电脑会做这些事情:
- 加载class文件
- 申明局部变量
- 在堆内存中开辟一个空间
- 默认初始化
- 显示初始化
- 构造方法初始化
- 将堆内存中的地址赋给左边的局部变量
我们需要知道的是:当有new这个关键字时,就意味着在堆内存中开辟了一块内存,这个内存会从方法区提取相关的模板然后并在相依的地址(名字)+ ‘.’地址所指向的属性(也就是具体的数据) 所以我们可以总结出一点就是每当我们看到一个new的时候就代表会在对区域开辟一个全新的空间(这也就意味这有几个对象)
变量名(相当于是一个地址):会被储存在栈内存中,当代码运行到这一行的时候,电脑就会循着地址在堆中找到相应的属性(具体数据)
可以看到这个代码只出现了一次new就说明了只有一个对象的内存被存放到了堆内存,而
Student stu2 = stu1 stu2和stu1都是指向了一个堆内存,当我们将stu1 赋值为NULL,这个时候stu1什么都不会指向,stu1就成为垃圾。
基本数据类型和引用数据类型
基本数据类型:在变量存储的是真实的变量值,存储在栈内存
而引用数据类型在栈内存中存储的是一个地址值,真正的值是存放在堆内存中
如Student s = new Student();这个s就是引用数据类型(使用其他空间的数据)
数组也是一个引用数据类型。
基本数据类型:数据值是存贮在自己的空间中
特点;赋值给其他变量,也是赋得真实得值
引用数据类型;数据值是贮存在其他空间,通过调用地址来获取值。
This的内存原理:
This的本质:代表所在方法调用者的地址值,且这个储存在栈内存中
其作用:就是区分局部变量和成员变量的
成员变量:类中方法外的变量
局部变量:方法中的变量