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