1、什么是对象
- 面向对象思想(Object Oriented Programming)
- 任何对象,一定具有自己的特征和行为。
- 面向过程:什么事都由自己完成
- 面向对象:把自己的事交由他人完成, 一切客观存在的事物都是对象
(万物皆对象)- 类:抽象的事物(职业,职称)
- 对象:具体的的事物(具体的人)
1.2 程序中的对象
- 如何使用程序模拟现实世界,解决现实问题?
- 首先,在程序当中,必须具有和现实中相同的对象,用以模拟现实世界。
- 然后,使用程序中的对象代表现实中的对象,并执行操作,进而解决现实问题
2、什么是类
2.1 类的定义
- 属性:通过变量表示,又称实例变量。
- 位置:类的内部,方法的外部。
- 方法:通过方法表示,又称实例方法。
- 语法:
数据类型 属性名;
public 返回值类型 方法名(形参){
//方法的主体
}- 注意:不再书写static,后续详解。
示例:
//采购员
public class Buyer {
//类属性
String name;
//类方法
public void buy(){
System.out.println("采购员进行采购");
}
}
2.2 对象的创建
- 创建对象(实例化对象)
- 类名 对象名 = new 类名();
- 对象名.属性 – 调用对象中的属性进行赋值或者取值
- 对象名.方法() – 调用对象中的方法
示例:
public class Demo01 {
public static void main(String[] args) {
/*面向过程
String name = "老板";
System.out.print("老板");
buy();*/
//面向对象
//1.请一个采购员回来
//类名 对象名 = new 类名();
Buyer buyer = new Buyer();
//通过对象名调用对象属性
buyer.name = "码云";
//通过对象名调用对象的方法
buyer.buy();
//打印采购员的名字
System.out.println(buyer.name);
}
public static void buy(){
System.out.println("采购");
}
}
3、类的组成
3.1 实例变量
全局变量:直接定义在类中,生命周期为整个类
局部变量:在方法中定义的属性。生命周期为当前方法
当局部变量和全局变量重名的时候,在方法中调用的会是局部变量作用域越小,优先级别越高
全局变量会默认初始化,局部变量没有默认初始化,使用前必须先赋值
private – 私有化,只能在类中调用,其他类不允许调用也不能通过对象名直接调用
private修饰的属性为私有属性,只能通过set/get方法来调用
set – 对私有化属性进行赋值 – 有参数,没有返回值
get – 对私有化属性进行取值 – 没有参数,需要返回值
示例:
public class Person {
//全局变量
private String name;
private int age;
//局部变量
public void setName(String name){
//局部变量
//int age = 0;
//person1对象调用setName(),this则代表person1对象
//当person2对象调用setName(),this则代表person2对象
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void test1(){
System.out.println("test1");
//调用当前对象的test2()
this.test2();
}
public void test2(){
System.out.println(name+"的test2方法");
}
public void test3(){
//局部变量
int age =1;
//打印全局变量 -- 默认初始化
System.out.println(this.age);
//打印局部变量 -- 必须手动初始化才能使用
System.out.println(age);
}
}
定义一个Demo01,实例化对象,通过对象调用Person的set方法(赋值)、get(取值):
public class Demo01 {
public static void main(String[] args) {
//实例化对象
Person person1 = new Person();
person1.setName("张三");
System.out.println(person1.getName());
person1.test1();
Person person2 = new Person();
person2.setName("李四");
System.out.println(person2.getName());
person2.test2();
person2.test3();
}
}
定义Person.java类
package com.qf.ran.oop3;
/**
* @author Ran
* @since JDK 1.8
*/
public class Person {
//全局变量
private String name;
private int age;
//局部变量
public void setName(String name){
//局部变量
//int age = 0;
//person1对象调用setName(),this则代表person1对象
//当person2对象调用setName(),this则代表person2对象
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void test1(){
System.out.println("test1");
//调用当前对象的test2()
this.test2();
}
public void test2(){
System.out.println(name+"的test2方法");
}
public void test3(){
//局部变量
int age =1;
//打印全局变量 -- 默认初始化
System.out.println(this.age);
//打印局部变量 -- 必须手动初始化才能使用
System.out.println(age);
}
}
4、构造方法
4.1 概念
构造方法:类中的特殊方法,主要用于创建对象。
- 名称与类名完全相同。
- 没有返回值类型。
- 创建对象时,触发构造方法的调用,不可通过句点手动调用。
4.2 创建
- 无参构造方法(无参构造方法:默认存在)
语法:
访问修饰符 类名(){
}
- 有参构造方法:
语法:
访问修饰符 类名(参数类型1 参数名1,…){
}
示例:
package com.qf.ran.oop5;
/**
* @author Ran
* @since JDK 1.8
*/
public class User {
private int id;
private String name;
//无参构造方法
public User(){
//在无参构造方法中调用有参构造方法
this(1,"zs");
//使用this调用构造方法只能在方法中的第一行
//this(2);
System.out.println("无参构造方法");
}
//有参构造方法
public User(int id, String name){
//在有参构造方法中调用无参构造方法
//this();
System.out.println("有参构造方法");
this.id = id;
this.name = name;
}
public User(int id){
System.out.println("第二个有参构造方法");
}
//普通方法
public void test(){
//必须在构造方法中的第一行
//this();
System.out.println("普通方法");
}
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public String toString(){
return "User { id = "+id+",name = "+name+"}";
}
}
注意:
- 有参构造方法 = 无参构造方法 + 多个set()
有参构造方法的使用必须在知道属性的前提要求下才可以
4.3 构造方法重载
构造方法也可重载,遵循重载规则。
创建对象时,根据传入参数,匹配对应的构造方法。
public class Demo01 {
public static void main(String[] args) {
//实例化对象 -- 通过调用无参构造方法
User user1 = new User();
user1.setId(1);
user1.setName("码云");
System.out.println(user1.getId()+":"+user1.getName());
//实例化对象 -- 通过调用有参构造方法
User user2 = new User(2,"麻花藤");
System.out.println(user2.getId()+":"+user2.getName());
//修改user2对象里的属性
user2.setName("马宝国");
System.out.println(user2.getId()+":"+user2.getName());
}
}
4.4 默认构造方法
- 在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法。
- 如已手动添加有参构造方法,则无参构造方法不再默认提供,可根据需求自行添加。
4.5 构造方法为属性赋值
public static void main(String[] args){
//有参构造方法 -- 对2个属性进行赋值
public User(int id,String name){
System.out.println("有参构造方法");
this.id = id;
this.name = name;
}
}
5、this关键字
- 使用this调用构造方法只能在方法中的第一行
- this第一种用法:调用实例属性、实例方法。
如:this.name、this.sayHi()。- this第二种用法:调用本类中的其他构造方法。
如:this()、this(实参)。- this(实参):调用有参构造
- this():调用无参构造
5.1 用法
代码示例:
public class User {
private int id;
private String name;
//无参构造方法
public User(){
//在无参构造方法中调用有参构造方法
this(1,"zs");
//使用this调用构造方法只能在方法中的第一行
//this(2);
System.out.println("无参构造方法");
}
//有参构造方法
public User(int id, String name){
//在有参构造方法中调用无参构造方法
//this();
System.out.println("有参构造方法");
this.id = id;
this.name = name;
}
public User(int id){
System.out.println("第二个有参构造方法");
}
//普通方法
public void test(){
//必须在构造方法中的第一行
//this();
System.out.println("普通方法");
}
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public String toString(){
return "User { id = "+id+",name = "+name+"}";
}
}