目录
一、面向对象的思想
面向:拿/找
对象:东西
面向对象:拿(找)东西过来解决问题,即把现实世界的事物全部看成一个个对象来解决问题
二、类、对象
1.概念
类(设计图):相同事物共同特征的描述
对象:对象是类的具体的实例(对象==实例)
在Java中必须先定义类,才能得到对象
2.如何定义类
代码如下(示例):至于为什么没有static关键字以后再讲
public class Car{
//1.成员变量 (一般是名词,如编号,名称等)、
private String name;
private double price;
……
//2.方法(右键——Generate——Getter and Setter可自动生成)
public void getXXX(){}
public void setXXX(成员变量){}
//3.构造器(右键——Generate——Constructor)
//无参构造器
Select None
//有参构造器
选中相应的成员变量——>OK
3.定义类的注意事项
1.类名首字母大写,有意义,满足驼峰,不能用关键字,合法的标识符。
2.一个Java文件中可以定义多个类。但只能一个类是public修饰,而且public修饰的类名必须是文件名,否则报错!
3.成员变量不建议给初始值,存在默认值。
4.如何创建对象
类名 对象名 = new 构造器();
Movie[] movies = new Movie[4];
对象怎么使用:对象.成员变量 对象.成员方法
三、构造器
基本介绍:构造方法又叫构造器(constructor),是类的一种特殊方法,它的主要作用是完成对新对象的初始化。
1.构造器作用
初始化一个类的对象,并返回这个对象的地址
格式:修饰符 类名(形参){……}
2.构造器的分类
有参构造器:初始化一个类的对象,并返回这个对象的地址,并且可以同时为对象赋值
无参构造器:初始化一个类的对象,并返回这个对象的地址,里面的数据都是默认值
3.构造器如何使用
类名 对象名 = new 构造器();
4.注意事项
- 任何类写出来都自带一个无参构造器,写不写都有。
- 一个类可以定义多个构造器,即构造器的重载。
- 构造器名和类名要相同。
- 构造器没有返回值。
- 构造器是完成对象的初始化,并不是创建对象。
- 在创建对象时,系统会自动调用该类的构造器完成对对象的初始化。
- 如果程序员没有定义构造器,系统会默认给类生成一个无参构造器(默认构造器),比如Dog(){},可以使用javap指令反编译查看。
- 一旦定义了自己的构造器,默认的无参构造器就会被覆盖,除非自己再定义了一下。
四、this关键字
1.作用
代表当前对象地址,可以访问当前对象的成员变量和成员方法。
2.用处
可以用在有参数构造器中
public Movie(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
也可以用在方法中。
3.如何理解this关键字
其实,我们只要把this理解成”本对象自己的...”就可以了。
public class Person{
String name;
int age;
double height;
public Person(String n,int a,double h){
name = n;
age = a;
height = h;
}
public void introduce(){
System.out.println("我叫" + name + ",今年" + age + "岁");
}
}
在上面这段代码中,定义了一个表示“人”的类Person,在Person类中,有3个属性name、age和height,分别来表示姓名、年龄和身高。在类当中定义了一个构造方法,构造方法中对3个属性进行了初始化操作。最后定义了一个introduce方法,这个方法能够打印一个Person对象的姓名和年龄。现在,我们在main方法当中创建一个Person类的对象,并且调用这个对象的introduce方法,代码如下:
public static void main(String[] args){
Person p = new Person("张三",20,183);
p.introduce();
}
愉快的运行一下程序,出来的运行结果是这样的:
我叫张三,今年20岁
通过程序的运行结果我们可以看出,在创建对象的时候,对象的属性被赋予了正确初始值。这个程序本身非常的简单,谁都可以理解。但是大家请注意,我们在定义构造方法的时候,把表示姓名、年龄和身高的参数分别命名为:n、a和h,这种命名的可读性有点差。为了提高可读性,我们把构造方法的参数名称修改为name、age和height,如下图所示:
public Person(String name,int age,double height){
name = name;
age = age;
height = height;
}
修改之后,再次运行main方法,得到的运行结果变成了这个样子:
我叫null,今年0岁
为什么这一次的运行结果出现了问题呢?就是因为,修改了构造方法之后,当我们调用构造方法创建对象时,给构造方法所传递的3个参数值“张三”、20和183最终并没有赋值到对象的3个属性中。那么,既然参数值没有被赋值到对象的属性中,它们去了哪里呢?修改代码后,构造方法的参数与类所定义的属性同名,根据“同名情况下,局部变量的优先级更高”原则,在构造方法执行的过程中,虚拟机会把参数值赋给“参数本身”,而不是赋值给对象的属性!具体来说,就是我们给构造方法的name参数传递的值是“张三”,而这个“张三”在构造方法执行的过程中,当运行到“name=name;”这条语句时,并没有把“张三”赋值给对象的name属性,而是又重新赋值给了name参数自身。就是因为“张三”最终没有被赋值到对象的name属性中,才导致introduce方法中打印出的name属性是null。当然,age和height这两个参数也是同样的赋值效果。
为了能够让虚拟机明白我们所期望的是:把”张三”这个字符串赋值给对象的name属性,而不是“再一次”把它赋值给构造方法的参数,就需要把构造方法中的赋值语句做出如下修改:
public Person(String n,int a,double h){
this.name = name;
this.age = age;
this.height = height;
}
大家来看,这一次,我们在构造方法中,给”=”左边的属性前面都加上了this关键字,经过修改之后,重新运行main方法,就恢复了正常的运行效果。好,现在我们就来探究一下,加了this关键字之后,为什么程序能够”恢复正常”。刚才我们说过,”this”可以被解释为” 本对象自己的...”,按照这个逻辑,”this.name”就可以被解释为”本对象自己的name属性”,所以在执行”this.name=name;”这条语句的时候,虚拟机就会把name参数的值”张三”赋值给对象的name属性。也就是说在这条赋值语句中,”=”左边的”this.name”表示对象的name属性,而”=”右边的name表示方法的name参数。
五、封装
面向对象的三大特征:封装、继承、多态
1.什么是封装
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
(封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基
于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象。)
2.如何更好的封装
合理隐藏:
成员变量(属性)建议private(私有化),需要被保护的属性使用 private 进行修饰,可以防止用户随意输入数据
合理暴露:
对外提供成套的get()和set()方法暴露取值和赋值,其中set方法用来修改属性的值,get方法用来读取属性的值。
六、标准JavaBean
就是所谓的实体类(学生类、老师类、汽车类)
作用:创建对象、封装数据
书写要求
合理隐藏、合理暴露;必须提供无参构造器
1.这个类的成员变量都要私有,并且要对外提供相应的get、set方法
2.类中必须要有一个公共的无参构造器
七、局部变量和成员变量的区别
补充
成员变量有默认初始值(如:name=null,num=0.0)
局部变量没有默认初始值,需要先赋值(如:int a = 10)