面向对象程序设计思想的认识
面向对象程序设计思想的应用
面向对象的内存分析
学习面向对象
什么是面向对象
学到面向对象就逃不过面向过程和面向对象的比较
面向过程:就是先把要解决问题的步骤分析出来,然后一步步的去实现,再一个个去调用。
面向对象:是把解决问题分解成多个对象,而对象是描述处理某些问题的一种行为。
面向对象的理解:
面向对象的实践中,我们把原本的对象中的属性和它的所有的“动作”拆分出来,将这些对象与对象之间拥有的共同属性等统一设计成一个类,当对象需要去使用相关属性或者说“动作”的时候就去连接(实例化对象)上这个类来达到是哦用方法的目的。
进入代码来看看什么是面向对象
下面就是一个学生类
package 面向对象.学生;
/**
* 高大王
*/
// 需求:声明一个学生类(Student),包含以下信息
// * - 属性: 姓名,年龄
// * - 方法:学习的方法(study)、吃饭的方法(eat)
public class student {
String name;
int age;
public void study(){
System.out.println("我正在学习面向对象");
}
public void eat(){
System.out.println("我正在吃饭");
}
}
下面是测试类
package 面向对象.学生;
import java.util.Scanner;
/**
* 高大王
*/
public class text {
public static void main(String[] args) {
/* 简单的理解就是下面这个调用学生类中方法的过程就是面
向对象的过程*/
student s=new student();
s.eat();
s.study();
s.age=18;
s.name="高大王";
System.out.println(s.age);
System.out.println(s.name);
}
}
首先,在学生类中,我们定义了学生的属性(姓名和年龄)和方法(学习和吃饭)。这些属性和方法被封装在类中,表示学生对象的特征和行为。
在测试类中,我们创建了一个学生对象(通过实例化学生类)。通过这个对象,我们可以调用学生类中定义的方法,比如调用studt()和eat()方法,来实现学生的学习和吃饭行为。
此外,我们也可以给学生对象的属性赋值,比如给age赋值为18,name赋值为"高大王"。这样,我们可以通过对象访问这些属性值,并进行操作和输出。
面向对象
三大特点
封装、继承和多肽
封装
封装 是什么,封装就是把对象的属性和行装起来放到载体类之中,不让外部的程序直接访问,通过共有的方法才能进行访问(像get和set方法一样)避免外部的操作对面内部的数据有影响,提高了程序的可维护性的过程叫做封装。
封装的操作
封装的时候封装对象的属性和行为。这里举个例子人画圆,画圆是封装到人下还是圆下(也就是说画圆是人的行为还是圆的行为)?(答案是封装到圆下,但是说画圆是圆的行为感官上又不太对劲,画圆是人的行为啊,为什么要封装到圆的下面)
换种说法,我们去定义一个圆,只给他提供半径,但是将画圆的方法放到人的下面,那么如果人下次去画一个正方形的话是不是还要将画正方形的方法放到人下,当然这里有人会想我成为圆去使用人来画自己,但这样不是脱离了现实吗,所以说我们去封装的话我将封装分为了使用者和工具,将所有和工具有关的属性和行为都封装到工具的类中,这就叫做面向对象去操作,也是我们java语言的一大特点。
从上面我们可以将封装的定义在进行定义,封装的时候封装对象(工具)的属性和对象(工具)的“关联”行为。
封装(定义):对象代表什么,就得到相关的封装的数据,并提供相应数据对应的行为。(这句话不好去理解,无所谓先记住,在实操过程中实践就会慢慢掌握了封装的准则)
封装的本质:
将类中的属性或者方法用private修饰(私有化),并提供公有的set()、get()方法。(set方法是赋值的通道,get方法是获取通道)
练习:题目(有的看不懂没关系下面会讲)
创建程序,在其中定义两个类:Person和PersonTest类。定义如下: 用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。 在 PersonTest 类 中实例化 Person 类的对象 b , 调 用 setAge() 和 getAge()方法,判断人的年龄是否合法,体会Java的封装性。
代码:
package 面向对象.封装.person;
/**
* 高大王
*/
public class person {
private int age;
private String name;
// private static void ageqj(){
//
// }
public void setage(int age){
if (0<age&&age<130){
this.age=age;
System.out.println("年龄合法");
}else {
System.out.println("不合法");
}
}
public int getage(int age){
return age;
}
}
package 面向对象.封装.person;
import java.util.Scanner;
/**
* 高大王
*/
public class persontest {
public static void main(String[] args) {
System.out.println("请输入年龄:");
Scanner a=new Scanner(System.in);
person s=new person();
int x=a.nextInt();
s.setage(x);
}
}
结果图片
就近原则和this关键字
成员变量:类中用来描述对象特征或状态的变量。是放在方法外边的变量。
局部变量:类中方法之中的变量
看下面的代码:
package 面向对象.封装.this关键字;
/**
* 高大王
*/
public class person {
private int age;
public void setAge(){
int age=10;
System.out.println(age);
}
public int getAge() {
return age;
}
}
编写测试类:
package 面向对象.封装.this关键字;
/**
* 高大王
*/
public class test {
public static void main(String[] args) {
person s=new person();
s.setAge();
}
}
结果:
如果注释掉 int age=10;再看:
代码如下:
package 面向对象.封装.this关键字;
/**
* 高大王
*/
public class person {
private int age;
public void setAge(){
// int age=10;
System.out.println(age);
}
public int getAge() {
return age;
}
}
测试类不变,再次运行测试类。
结果如下:
如果在第一个person类里面使用this.age的话呢
代码如下:
package 面向对象.封装.this关键字;
/**
* 高大王
*/
public class person {
private int age;
public void setAge(){
int age=10;
System.out.println(this.age);
}
public int getAge() {
return age;
}
}
测试类不变结果如下:
仔细去想,为什么第一段代码输出10而不是0,为什么加上this.age就输出0了呢?
输出10而不是0是因为就近原则:当代码中存在多个同名变量或方法时,编译器或运行时环境会选择最近的作用域或最具体的方法来进行解析和执行。
为什么加上this.age就输出0了呢:this关键字在Java中用于引用当前对象,解决成员变量和方法参数之间的命名冲突以及构造方法的调用。也就是说this关键字去调用了成员变量,而不是局部变量。