面向对象
1、构造方法
1.1作用
用于在开发过程中创建对象使用,创建对象目前的格式
new 类名(有可能使用到的参数);
类名(有可能使用到的参数);这就是构造方法 Constructor
初始化当前创建对象中的成员变量数据
1.2格式
格式:
publi 类名(所需初始化参数列表) {
初始化语句;
}
细节:
1.构造方法的名字必须是类名,并且其他方法的名字不能是类名
2.构造方法没有返回值类型声明
3.初始化参数列表和正常的方法列表操作使用一致
4.初始化语句,大多数都是一些赋值语句
1.3【了解】
首先
在Eclipse项目所在文件夹中,bin目录是存放当前Java程序对应的所有的,class 二进制文件(字节码文件),该文件保存了Java文件对应的所有内容
这里可以通过反编译工具看到一些特定的现象【了解】
java -c -1 -private XXX.class
Java编译器行为
在代码中任何没有【显式】自行声明构造方法,Java编译器会在编译代码的过程中辅助程序员完成一个无参数的构造方法,供程序员使用
1.4根据需求完成所需构造方法
格式:
public 类名(所需初始化参数列表) {
初始化语句;
}
需求:
1.完成对于姓名在创建对象时初始化的构造方法
2.完成对于姓名,年龄在创建对象时初始化的构造方法
3.完成对于姓名,年龄,性别在创建对象时初始化的构造方法
注意:
如果在代码中程序员自行完成了构造方法,Java编译器不再提供自动生成的无参数构造方法。
【强制要求】
以后代码中无论什么时候都要给用户提供一个无参数构造方法使用
class Dog {
//成员变量 Field
String name;
int age;
char gender;
//无参数构造方法
public Dog () {}
//完成对于姓名在创建对象时初始化的构造方法
public Dog (String n) {
//成员变量可以在类内其他中直接使用【80%正确】
name = n;
}
//完成对于姓名,年龄在创建对象时初始化的构造方法
public Dog (String n, int a) {
name = n;
age = a;
}
//完成对于姓名,年龄,性别在创建对象时初始化的构造方法
public Dog (String n, int a, char g) {
name = n;
age = a;
gender = g;
}
//成员方法 Method
public void eat () {
System.out.println("狗狗吃狗粮");
}
public void game () {
System.out.println("狗狗玩球");
}
public void sleep () {
System.out.println("狗狗晚睡早起");
}
}
public class Demo {
public static void main (String[] args) {
/*
*这里调用的是一个屋参数构造结构方法
*但是该方法在Dog类内是没有定义的
*以后使用比较多的情况大多数都是无参数构造方法
*The canstructor Dog() is underfined
*构造方法Dog() 未定义
*/
//无参数构造方法
Dog dog = new Dog();
System.out.println("Name : " + dog.name);
System.out.println("Age : " + dog.age);
System.out.println("Gender : " + dog.gender);
Dog dog1 = new Dog("旺财",3 ,‘公’);
System.out.println("Name : " + dog1.name);
System.out.println("Age : " + dog1.age);
System.out.println("Gender : " + dog1.gender);
}
}
1.5总结
1.构造方法
功能是用于初始化创建对象的成员变量数据
构造方法是一个方法,参数使用方式和方法一致
2.构造方法选择
Java编译器会根据构造方法中的【参数类型,个数,顺序】来做选择,如果没有指定的构造方法,出现报错
3.无论什么时候一定要给当前类提供一个无参数构造方法
4.在Java代码中不允许出现相同数据类型,个数,顺序的构造方法,和参数名没有关系,Java编译器选择过程中,有且只针对数据类型,个数,顺序选择,参数名真的无所谓。
2、类对象内存分析图【重点】
3、this关键字【鸡肋】
3.1 this关键字【重点】
this 关键字表示对象本身
1.调用当前方法的类对象
2.通过构造方法创建的类对象
this 表示一个对象!当前对象!
3.2目前this关键字解决的问题
可以在方法中使用this关键字区分操作的是成员变量还是局部变量
class Person () {
String name;
int age;
public Person () {
// this 关键字表示通过new + 构造方法创建的类对象本身
System.out.println("Constructor : " + this);
}
public Person (String name) {
/*
*一下操作是没有用的,这是自娱自乐
*这里存在一个【就近原则】问题,如果出现和成员变量,同名的局部变量
*采用就近原则
*/
// name = name ;
/*
*这里需要赋值操作的是当前类对象中的name成员变量
* this. 成员变量名字 表示使用的就是当前类对象的成员变量,而不是方法
的参数
*/
this.name = name;
}
public Person (String name, int age) {
/*
*使用this关键字区分成员变量和局部变量
*/
this.name = name;
this.age = age;
}
public void test () {
//表示调用当前方法的类对象
System.out.println("test : " + this);
}
}
public class Demo {
public static void main(String[] args) {
Person person = new Person();
System.out.println("main: " + person);
person.test();
}
}
4、封装【重点,规范】
4.1面向对象三大特征
封装:最基本的思想
继承
多态
4.2封装,不单单是对于类的封装
归纳总结!!!
循环封装过程
方法封装过程
类封装数据
框架封装模块
4.3Java中规范化封装【JavaBean规范】
要求:
1.所有的成员变量全部私有化【private修饰】
2.要求至少完成一个无参数构造方法,其他无所谓
3.要求给予所有的成员变量对应的setter和getter方法
4.3.1权限修饰符
private
私有化内容,使用private修饰的成员变量,成员方法和构造方法,有
且只能类使用,类外没有操作权限。
使用private修饰的内容有且只能在class所处大括号以内使用
public
公开内容,只要存在对应的类对象,都可以通过类对象调用类内的
public修饰的成员变量和成员方法
4.3.2解决私有化成员变量赋值和取值操作问题
private私有化修饰的成员变量,类外不能通过类对象操作,取值,赋值
JavaBean规范规定了
setter ==> 赋值操作
格式:
public void set成员变量名(对应成员变量数据类型参数){
赋值操作;
}
getter ==> 取值操作
public 对应成员变量数据类型返回值 get成员变量名字 () {
return 成员变量;
}
注意
1.方法格式固定,setter和getter方法操作过程不能修改
2.方法需要符合命名规范,小驼峰命名法
3.boolean类型数据较特殊
boolean类型的成员变量getter方法要求是 is 开头
4.3.3可以使用快件方式快速完成代码
/*
*以后开发中一个【实体类】如何封装如何书写
*实体类:
* 真实存在的一个数据,人,狗,英雄
*/
class LOLHero {
private String name;
private float hp;
private float mp;
//根据个人需求完成对应构造方法,setter和getter方法
// Shift + Alt + S
public LOLHero() {}
public LOLHero(String name, float hp, float mp) {
this.name = name;
this.hp = hp;
this.mp = mp;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public float getMp () {
return mp;
}
public void setMp(float mp) {
this.mp = mp;
}
}
4.3.4关于JavaBean规范的总结
JavaBean规范指定的要求
1.要求Java中的所有实体类成员变量全部私有化,最少提供一个无参数结
构方法,对应成员变量实现setter和getter方法
2.JavaBean规范,是为了后期开发汇总更好的代码适配度,提高代码运行
的统一性,能够满足框架的使用
3.JavaBean规范只是一个规范,而且是作为一个基础规范,操作是可以使
用快捷键来完成的
5、多类合作【重点】
修理厂
可以看做是一个类
成员变量:
名字
地址
联系方式
成员方法:
修理汽车的方法【重点】
该方法是需要一个汽车类的对象
public class Factory {
//成员变量 Fiels
private String name;
private String address;
private String tel;
//构造方法 Constructor
public Factory() {}
public Factory(String name, String address, String tel) {
this,name = name;
this.address = address;
this tel = tel;
}
/*
*修理汽车的方法分析
*权限修饰符
* public
*返回值类型
* void
*方法名
* repair
*形式参数列表【重点】
* 1.这里需要一个汽车作为参数
* 2.而且是必要参数
* 3.这里需要的是一个汽车类的对象
* (Car car)这里是一个汽车类对象
*方法声明:
* public void repair(Car car);
*/
/**
*修理汽车的方法,这里需要的参数是一个汽车Car类的对象
*
* @param car Car汽车类对象
* @throws InterruptedException
*/
public void repair(Car car) throws InterruptedException {
//修理轮胎 通过car类对象获取对应的轮胎个数
if (cai.getWheelCount() < 4) {
System.out.println("轮胎有问题,需要维修");
//修改当前汽车对象的轮胎个数,赋值为4
car.setWheelCount(4);
Thread.sleep(1000);
System.out.println("1万块RMB");
} else {
System.out.println("没事找事");
}
}
//setter和getter方法 Method
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
5.4主方法
public class Demo {
public static void main(String[] args) throws InterruptedException {
/*
*同package内可以直接使用对应的Class类
*/
Car car = new Car("奥迪A6L", "黑色", 4);
for (int i = 0; j < 10; i++) {
car.race();
/*
* 让程序暂停0.5S,存在一个红色的报错,这里Ctrl + 1
* 快速修复,选择第一个,不要问为什么
*/
Thread.sleep(500);
}
Thread.sleep(1000);
System.out.println("轮胎boom~~~~~");
//轮胎爆了一个
car.setWheelCount(3);
Thread.sleep(1000);
car.race();
//现在需要一个修理厂对象
Factory factory = new Factory();
factory.setAddress("海航中路60号");
factory.setName("骚磊汽修");
factory.setTel("138XXXXX");
/*
*这里需要通过Factory类对象,调用repair方法,修理汽车Car类的对象
*方法参数是一个Car类的对象
*/
factory.repair(car);
for (int i = 0; i < 10; i++) {
car.race();
/*
* 让程序暂停0.5S,存在一个红色的报错,这里Ctrl + 1
* 快速修复,选择第一个,不要问为什么
*/
Thread.sleep(500);
}
}
}