目录
1.类和对象
1.1什么是对象,面向对象,类
对象:万物皆对象,客观存在的事物都是对象。
面向对象:通过一些特征和条件以满足对象本身
类:类是对现实生活中一类具有共同属性和行为的事物的抽象。
类的特点:
对象的数据类型
具有相同属性和行为的一组对象的集合
1.2什么是对象的属性,行为
对象属性:每个对象的每个属性都有特定的值
对象的行为:每个对象都有特定的行为。
1.3类和对象的关系
类:对现实中具有共同属性和行为的事物的抽象
对象:现实生活中的实体
1.4类的定义
类的组成:属性和行为
属性:在类中通过成员变量来体现(类中方法外的变量)
行为:在类中通过成员方法体现(在方法中体现)
定义:
public class 类名{
//成员变量
变量1的数据类型 变量1;
变量2的数据类型 变量2;
变量3的数据类型 变量3;
......
//成员方法
方法1;
方法2;
......
}
1.5对象的使用
1.5.1创建对象
类名 对象名=new 类名();
1.5.2使用对象
使用成员变量:
格式:对象名.变量名
使用成员方法
格式:对象名.方法();
1.5.3案例
需求:定义一个学生类,然后定义一个学生测试类,在学生测试类完成对学生类的成员变量和成员方法的使用。
pubblic class Student{
//成员变量
String name;
int age;
//成员方法
public void study(){
System.out.println("学生会学习");
}
public void doHomework(){
System.out.println("学生每天要做作业");
}
}
public class Test{
public static void main(String[]args){
//创建对象
Student stu=new Student();
//为成员变量赋值
stu.name="小红";
stu.age=16;
System.out.println("姓名:"+stu.name+"年龄:"+stu.age);
//调用成员方法
stu.study();
stu.doHomework();
}
}
2.对象内存图
2.1单个对象内存图
例
public class StudentTest01{
public static void main(String[]args){
//创建对象
Student s=new Student();
//使用成员变量
System.out.println(s.name+","+s.age);
s.name="小明";
s.age=31;
System.out.println(s.name+","+s.age);
//使用成员方法
s.study();
s.doHomework();
}
}
a.执行创建对象一行
main方法先进栈,堆内存中new一个新的空间,空间里自动存放student类中的成员变量,其地址值直接赋值给新建的变量s
b.输出s一行
直接访问main方法中的s,通过s的地址值在堆内存中找相应的变量值
c.赋值后再访问如上
d.执行调用方法一行
study是成员方法,将成员方法进栈,调用者s,输出相应的内容,输出完毕后,study方法退出栈
2.2多个对象内存图
例
public class StudentTest02{
public static void main(String[]args){
//创建对象
Student s1=new Student();
//使用成员变量
System.out.println(s1.name+","+s1.age);
s1.name="林青霞";
s1.age=30;
System.out.println(s1.name+","+s1.age);
//使用成员方法
s1.study();
s1.doHomework();
//创建第二个变量
Student s2=new Student();
//使用成员变量
System.out.println(s2.name+","+s2.age);
s2.name="张曼玉";
s2.age=28;
System.out.println(s2.name+","+s2.age);
//使用成员方法
s2.study();
s2.doHomework();
}
}
a.执行创建对象一行
main方法先进栈,堆内存中new一个新的空间,空间里自动存放student类中的成员变量,其地址值直接赋值给新建的变量s1
b.输出s1一行
直接访问main方法中的s,通过s的地址值在堆内存中找相应的变量值
c.赋值后再访问如上
d.执行调用方法一行
study是成员方法,将成员方法进栈,调用者s1,输出相应的内容,输出完毕后,study方法退出栈
e.创建第二个对象
在main方法中进行变量定义,堆内存中new一个新的空间,空间里自动存放student类中的成员变量,其地址值直接赋值给新建的变量s2
f.同上述一个:
g.study是成员方法,将成员方法进栈,调用者s2,输出相应的内容,输出完毕后,study方法退出栈,doHomework方法同理。
2.3多个对象指向相同的内存图
例:
public class StudentTest03{
public static void main(String[]args){
//创建对象
Student s1=new Student();
//使用成员变量
s1.name="林青霞";
s1.age=30;
System.out.println(s1.name+","+s1.age);
//创建第二个变量并将第一个对象的地址值赋给第二个
Student s2=s1;
//使用成员变量
s2.name="张曼玉";
s2.age=28;
System.out.println(s1.name+","+s1.age);
System.out.println(s2.name+","+s2.age);
}
}
前几行执行同上述abc步骤
当执行到第二个对象的创建时,将对象s1的地址值赋值给s2,并指向堆内存。
之后修改s2的成员变量时,该地址值下的值也都被改变,再次输出s1和s2对应的成员变量时输出的都是修改后的内容。
3.成员变量与局部变量
3.1什么是成员变量和局部变量
成员变量:类中方法外的变量
局部变量:方法中的变量
3.2成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 类中方法内 |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着对象的调用而存在,随着调用的完毕而消失 |
初始化值不同 | 有默认的初始值 | 没有默认的初始值,必须先赋值才能使用 |
4.封装
4.1private关键字
private:
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 作用是保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问
- 针对private修饰的成员变量,如果需要被别的类使用,提供get变量名()方法,用于获取成员变量的值,方法用public修饰;提供set方法名(参数)方法,用于设置成员变量的值,方法用public修饰。
- 在其他类调用本类方法的时候,若存在漏洞问题,则可以直接在本类增改相关代码
4.2this关键字
原Student类:
public class Student{
String name;
int age;
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
public void setAge(int a){
age=a;
}
public int getAge(){
return age;
}
public void show(){
System.out.println(name+","+age);
}
}
由于n和a无法第一眼看出name和age的本意,所以要用name和age代替
但是如果在方法体中直接写name和age,方法体中的name只会参照形参中的name,不会真正赋值给成员变量,故引入this关键字解决该问题(局部变量隐藏成员变量)
this.name=name;
用this修饰的变量是成员变量,没有this的则是局部变量
总结:
- 用this修饰的变量是成员变量,没有this的则是局部变量
- 解决局部变量隐藏成员变量的问题
- this代表所在类的对象引用,方法被哪个对象调用,this就代表哪个对象
4.3this内存原理
例:
public class Student{
private String name;
public String setName(String name){
this.name=name;
}
public void getName(){
return name;
}
}
public class StudentDemo{
public static void main(String []args){
Student s1=new Student();
s1.setName("林青霞");
Student s2=new Stucent();
s2.setName("张曼玉");
}
}
main和对象的内存图略,
当执行到s1=setName("林青霞");,首先setName()方法先入栈,并获取参数:name,再去看调用者为s1,执行该方法体中的语句,this.name对应s1获取参数的值,再指向堆中该地址下的参数进行s1的赋值操作。setName()完毕后从栈内存消失。
第二个对象:
之后方法使用完毕,消失,此时栈中只剩main方法,语句执行完毕,main方法消失。
综上this代表所在类的对象引用,方法被哪个对象调用,this就代表哪个对象。
4.4封装
4.4.1封装概述
- 是面向对象的三大特征之一(封装、集成、多态)
- 是面向对象编程语言对客观世界的摸你,客观世界里成员变量都是隐藏在对象内部的,外界是无法使用的
4.4.2封装原则
将类的某些信息藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问的成员变量private,提供对应的get()和set()方法
4.4.3封装好处
- 通过方法来控制成员变量的操作,提高了代码的安全性
- 把代码用方法进行封装,提高了代码的复用性
5.构造方法
5.1构造方法概述
构造方法时一种特殊的方法
作用:创建对象
格式:
public class 类名{
修饰符 类名(){}
}
例如:
public class StudentDemo{
public static void main(String[]args){
Student s1=new Student();
}
}
此时Student()就是一个构造方法。
功能:主要是完成对对象数据的初始化
5.2构造方法的注意事项
1.构造方法的创建
- 如果没有定义构造方法,系统将会给出一个默认的无参构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
2.构造方法的重载
- 如果自定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法
3.无论是否使用都手写无参构造方法
5.3标准类制作
- 成员变量(private修饰)
- 构造方法(一个无参一个有参)
- 成员方法(get/set+显示show)
- 创建对象并为其成员变量赋值的两种方式(无参构造后用set/直接用有参构造)
例:
public class Student{
private String name;
private int age;
public Student(){}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void show(){
System.out.println(name+","+age);
}
}
public class StudentTest{
public static void main(String[]args){
//无参构造方法
Student s1=new Student();
s1.setName("小白");
s1.setAge(16);
s1.show();
//有参构造方法
Student s2=new Student("Nick",18);
s2.show();
}
}