目录
- 面向对象
- 面向对象和面向过程
- 类
- 类的定义:
- 对象
- 对象的使用
- 局部变量和成员变量
- 封装
- private
- this
- 构造方法
- 构造方法注意事项
- 最后
面向对象
面向对象和面向过程
例如:我们拿洗衣服作为一个例子
面向过程:
将洗衣机打开,把衣服丢进去加上洗衣粉洗衣液,接着关上洗衣机,最后启动洗衣机。
面向对象:
拿到洗衣机这个对象,然后洗衣机有洗衣服这个功能,直接调用洗衣功能,结束。
类
类是现实生活中一类具有共同属性和行为的事物的抽象。
类包括属性和行为
属性:例如人的属性有年龄,姓名,家庭住址等
行为:例如人有学习,工作,睡觉等行为
类是对象的描述,对象是类的实体。
类的定义:
public class 类名{
//成员变量
数据类型 变量名;
//成员方法
...
}
对象
对象就是我们现实生活中能看得见摸得着真实存在的。
对象的使用
创建对象:
类名 对象名 = new 类名();
使用对象:
对象名.成员变量
对象名.成员方法
public class Student {
String name;
int age;
public void study(){
System.out.println("学习中");
}
}
public static void main(String[] args) {
Student s = new Student();
String name = s.name;
System.out.println(name);
s.study();
}
局部变量和成员变量
局部变量:
在方法中的变量
成员变量:
在类中方法外的变量
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 方法中 |
内存中位置不同 | 堆中 | 栈中 |
生命周期不同 | 随对象的存在而存在,随类的消失而消失 | 随方法的调用而存在,随方法调用完毕而消失 |
初始化不同 | 有默认初始值 | 没有默认初始值,必须先定义、赋值再使用 |
封装
封装:隐藏实现细节,仅对外暴露公共的访问方式
private
private是访问修饰符
可以用来修饰成员变量和成员方法
被private修饰的成员只能在本类中访问
public class Student {
String name;
int age;
public void study(){
System.out.println("学习中");
}
}
public static void main(String[] args) {
Student s = new Student();
s.age = -31;
System.out.println(s.age);
}
在这个Student类中我们可以对age进行赋值,并成功运行。
但是我们仔细一想,这个一个学生类,age是他的年龄,人的年龄不可能为负数啊,但是确赋值成功了这很不合理,所以我们不能让人随意改变我们的成员变量,所以我们为age加上private
我们继续进行分析:
我们将age加上private,所以只能在本类中访问,所以在其他类中想访问age就出现了报错,赋值-31报错是我们所希望的,但是将age赋值为18也报错了,这不是我们想要的结果。
我们需要对赋的值加上一个判断,符合我们的目标才让他赋值,不符合就拦截在外面,所以我们需要一个充当保镖的东西。
public void setAge(int a){
if(age>=0 && age<=150){
age = a;
}
}
我们如上定义了一个方法,并进行了判断,使得满足条件的参数能赋值成功。那么对应的我们也还需要一个取得私有成员的方法。
public int getAge(){
return age;
}
我们终于达到了自己的目的!
总结:private也是封装的一种,暴露出指定的出口,让用户按照我们指定的方法执行。
this
如果成员变量和局部变量名字重叠了,会采用就近原则。
因为采用的是就近原则,索引输出的应该是99
那我们是希望他能拿到成员变量的,那要怎么做才能正常拿到成员变量呢?
我们利用this关键字可以达到这个效果
this只需记住一句话:
方法被哪个对象调用,this就代表哪个对象
回到之前的代码
public void setAge(int age){
if(age>=0 && age<=150){
age = age;
}
}
我们将a改为age,这时局部变量和成员变量重名了,age = age,导致给age本身赋值。
public void setAge(int age){
if(age>=0 && age<=150){
this.age = age;
}
}
加上this,到时候谁调用这个方法,那么this就代表哪个对象,然后将对象的age赋值。
构造方法
概述:构造方法就是构建、创建对象时执行的方法。
格式:
构造方法名要与类名相同,大小写一致
没有返回值类型,void也不行
没有具体的返回值
执行时机:
创建对象的时候调用,每创建一次对象,就会执行一次构造方法
不能手动调用构造方法
构造方法注意事项
构造方法的创建:
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
public class People {
int age;
String name;
}
比如这样一个类,我们并没有具体定义一个构造方法。但是系统会给出默认的无参构造方法,我们一起来看。
首先打开People的class文件
因为我们看不懂class文件,所以拖入到idea中,idea会为我们进行反编译
我们可以看到确实是有默认的无参构造方法。
构造方法的重载:
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
推荐的使用方式:
无论是否使用,都手动书写无参数构造方法,和带参数构造方法
标准:
public class People {
private int age;
private String name;
public People() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public People(String name , int age) {
this.name = name;
this.age = age;
}
}
最后
如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我基本都会认真查看。