一、面向对象
1.1、面向对象的概念
很经典的一句话----------万物皆对象
定义:面向对象一相对面向过程而言的
面向对象和面向过程都是一种思想
面向过程------强调的是功能行为 语言:C语言
面向对象------将功能封装进对象,强调具备了功能的对象。
面向对象是基于面向过程的。
1.2、什么是类
我肯定说,不知道、不清楚。
简单讲类是java中的基本单元,类是具有相同特性和行为的对象集合
1.3、类的定义
class 类名{
数据类型 属性 ;
….
public 返回值的数据类型 方法名称(参数1,参数2…){
程序语句 ;
[return 表达式;]
}
}
1.4、类包含
类中包含成员和行为(方法)
package com.pb.demo2; /* * 人类 */ public class Person { //Persion为类名 /* * 属性,name,sex,age */ public String name; //名字 public String sex ; //性别 public int age; //年龄 /* *方法(行为) */ //吃饭 public void eat(){ System.out.println("吃饭"); } //工作 public void work(){ System.out.println("工作"); } }
1.5、三大特征
封装、继承、多态
二、类和对象关系
2.1、类和对象
类就是对现实生活中事物的描述。
对象就是这些事物,实实在在的个体
package com.day05; /** * 汽车类 * * @author Denny 属性对应类中变量 行为对应类中的函数(方法) 定义类就是在描述事物,就是在定义属性和行为 * 属性和行为共同成为类中的成员变量(成员变量和方法) */ public class Car { // 颜色 String color = "红色"; // 轮胎 int num = 4; // 运行跑起来的行为 public void run() { //局部变量 //int num=10; System.out.println(color + " " + num); } public static void main(String[] args) { Car c = new Car();// 声明汽车对象c c.color = "黄色"; // 更改属性值 c.num = 8; c.run(); // 调用方法 Car c1=c; c1.color="白色"; c1.num=6; c.run(); } }
结果:
黄色 8
白色 6
2.2、成员变量和局部变量
作用范围
成员变量作用于整个个类中
局部变量作用于方法或者文句中
在内存中的位置
成员变量在堆内存
局部变量在栈内存
使用this.成员变量 调用成员变量
局部变量直接使用变量名
如果成员变量和局部变量同名,且没有使用this关键字调用,在同一个方法中默认使用局部变量
2.3、匿名对象
package com.day05; /** * 汽车类 * * @author Denny 属性对应类中变量 行为对应类中的函数(方法) 定义类就是在描述事物,就是在定义属性和行为 * 属性和行为共同成为类中的成员变量(成员变量和方法) * 作用范围 * 成员变量作用于整个个类中 * 局部变量作用于方法或者文句中 * 在内存中的位置 * 成员变量在堆内存 * 局部变量在栈内存 */ public class Car { // 颜色 String color = "红色"; // 轮胎 int num = 4; // 运行跑起来的行为 public void run() { //局部变量 //int num=10; System.out.println(color + " " + num); } public static void main(String[] args) { new Car().num=99; new Car().color="blue"; new Car().run(); } }
红色 4
匿名对象,对一个的方法调用一次时, 可以使用。
对一个对象进行多次调用时,要声明对象
第二种方式:
匿名对象可以做为参数传递
三、封装
3.1、隐藏对象的属性和实现细节,公对外提供公共的访问方式。
好处:
将变化隔离
便于使用
提高重用性
提高安全性
封装原则:
将不需要对外提供的内容隐藏起来
把属性都隐藏,提供公共方法对其访问
package com.day05; /** * 人类 * * @author Denny * */ public class Person { private String name; // 姓名 private int age; // 年龄 private String gender; // 性别 // 自我介绍的方法 public void say() { System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 性别:" + this.gender); } // getter、setter方法 提供的对外的访问 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { // 检查年龄是不是在0-150之间 if (age >= 0 && age <= 150) { this.age = age; } else { System.out.println("年龄不合法!"); } } public String getGender() { return gender; } public void setGender(String gender) { // 检查条件 if (gender.equals("男") || gender.equals("女")) { this.gender = gender; } else { System.out.println("性别不合法只能是男或者女!"); } } public static void main(String[] args) { Person p = new Person(); p.setName("张三"); p.setAge(-20); p.setGender("人妖"); p.say(); } }
结果:
年龄不合法!
性别不合法只能是男或者女!
姓名:张三 年龄:0 性别:null
3.2、访问修饰符
四、构造函数
4.1、构造方法定义
构造方法的主要目的是为类中的属性初始化
class 类名称{
访问权限 类名称(类型1 参数1,类型2 参数2,…){
程序语句 ;
… // 构造方法没有返回值
}
}
在构造方法的声明中读者一定要牢记以下几点:
· 构造方法的名称必须与类名称一致
· 构造方法的声明处不能有任何返回值类型的声明
· 不能在构造方法中使用return返回一个值
例:
每个类中肯定都会有一个构造方法
如果一个类中没有声明一个明确的构造方法则会自动生成一个无参的什么都不做的构造方法
public class Person { private String name; // 姓名 private int age; // 年龄 private String gender; // 性别 public Person() { //无参数构造方法 } //实现构造方法重载 public Person(String name, int age, String gender) { //有参数构造方法 this.name = name; this.age = age; this.gender = gender; } // 自我介绍的方法 public void say() { System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 性别:" + this.gender); } // getter、setter方法 提供的对外的访问 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { // 检查年龄是不是在0-150之间 if (age >= 0 && age <= 150) { this.age = age; } else { System.out.println("年龄不合法!"); } } public String getGender() { return gender; } public void setGender(String gender) { // 检查条件 if (gender.equals("男") || gender.equals("女")) { this.gender = gender; } else { System.out.println("性别不合法只能是男或者女!"); } } } public static void main(String[] args) { Person p = new Person("张三",13,"男");//调用有参数的构造方法 p.say(); } }
4.2、构造代码块
package com.day05; /** * 人类 * * @author Denny * */ public class Person { private String name; // 姓名 private int age; // 年龄 private String gender; // 性别 /* * 构造代码块: * 作用:给对象进行初始化 * 对象 一建立就运行,而且优先于构造方法执行 * 构造代码块是给所有对象进行统一初始化 * 构造方法是给对应的对象初始化 */ { System.out.println("这是Person 的构造代码块"); } public Person() { } public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } // 自我介绍的方法 public void say() { System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 性别:" + this.gender); } // getter、setter方法 提供的对外的访问 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { // 检查年龄是不是在0-150之间 if (age >= 0 && age <= 150) { this.age = age; } else { System.out.println("年龄不合法!"); } } public String getGender() { return gender; } public void setGender(String gender) { // 检查条件 if (gender.equals("男") || gender.equals("女")) { this.gender = gender; } else { System.out.println("性别不合法只能是男或者女!"); } } public static void main(String[] args) { Person p = new Person("张三",13,"男"); Person p1=new Person(); } }
结果:
这是Person 的构造代码块
这是Person 的构造代码块
五、this关键字
5.1、this关键字作用
调用成员变量
当成员变量和局部变量同名时,优先使用局部变量,如果要调用成员变量
当成员变量和局部变量同名时,要调用成员变量可以使用this.成员变量名 来调用成员变量
// 自我介绍的方法 public void say() { System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 性别:" + this.gender); }
this:代表什么?
本类的对象,到底代表哪一个?
this代表它所在函数所属对象的引用。
哪个对象在调用的this所在的函数,this就代表哪个对象.
package com.day05; /** * * @author Denny this 语句的调用 */ public class Person1 { private String name; // 姓名 private int age; // 年龄 public Person1() { } public Person1(String name) { this.name = name; // 为本对象name赋值 } public Person1(String name, int age) { // 在构造方法中调用另一个构造方法时this必须放在第一行 this(name); // 调用另一个构造方法 this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 自我介绍的方法 public void say() { System.out.println("姓名:" + this.name + " 年龄:" + this.age); } public static void main(String[] args){ //声明一个参数的对象 Person1 p1=new Person1("张三"); p1.say(); Person1 p2=new Person1("张三",25); p2.say(); } }
结果:
姓名:张三 年龄:0
姓名:张三 年龄:25