目录
一、面向对象
1、对象:
万事万物皆可对象,客观存在的事务都是对象
2、类 class:
类定义了一种抽象的数据类型
类就是模板,确定对象将会拥有的特征(属性)和行为(方法)
3、类的特点:
类是对象的类型
具有相同属性和方法的一组对象的集合
4、对象的属性:
属性:对象具有的各种特征
每个对象的每个属性都拥有特定值
* 例如:手机类
* 属性:屏幕尺寸、CPU、内存
* 方法:打电话、发短信
* 对象:华为荣耀、小米等
public class Cat {
/*
* 品种
*/
String breed;
/*
* 尺寸
*/
int size;
/*
* 颜色
*/
String color;
/*
* 年龄
*/
int age;
/*
* 吃食
*/
public static void eat() {
System.out.println("吃了冻干");
}
/*
* 饮水
*/
public static void drink() {
System.out.println("喝了牛奶");
}
/*
* 玩乐
*/
public void run() {
System.out.println("在猫爬架玩耍");
}
}
二、类的实例化对象
实例化Cat这个类
cat是Cat类的实例化对象
类的实例化就是类创建的过程
Cat cat = new Cat();
三、对象的内存模型
类和对象分别存在栈内存和堆内存中,两个不同的对象,存在地址不同
Cat cat01= new Cat();
Cat cat02 = new Cat();
System.out.println(cat01==cat02);
System.out.println(cat01);
System.out.println(cat02);
运行结果
false
com.lihaozhe.day16.bean.Cat@41d477ed
com.lihaozhe.day16.bean.Cat@3590fc5b3
四、静态方法调用
1、使用static修饰的方法是静态方法
public static void sleep() {
System.out.println("我在养精蓄锐");
}
2、静态方法的调用
public void test01() {
//静态方法可以通过【类名】.【方法名】的方式调用
//但是不能通过【类名】.【方法名】的方式调用非静态方法
Person01.sleep();
五、非静态方法
1、不适用static修饰的方法
/**
*非静态方法
*/
public void eat() {
System.out.println("我是个吃货");
sleep();
}
/**
* 非静态方法
*/
public void drink() {
System.out.println("我们是什么,我么你是兄弟,这酒怎么喝,你干了我随意");
eat();
}
2、非静态方法的调用
public void test02() {
Person01 person01 = new Person01();
//静态方法可以通过类的【实例化对象名】.【方法名】的方式调用
//非静态方法也可以通过【实例化对象名】.【方法名】的方式调用
person01.drink();
person01.eat();
六、成员变量与局部变量
1、成员变量
成员变量(有可以叫属性)
成员变量 在类中定义,用来描述对象将要有什么
在类的方法中定义,在方法中临时保存数据
public int count;
2、成员变量有初始值
输出count值为0
3、局部变量
写在方法里的变量是局部变量
a就是局部变量
public void fun01() {
//写在方法里的变量我们称之为局部变量
int a = 10;
4、局部变量不能跨方法读取
5、局部变量没有赋值,去找成员变量,成员变量方法间是共享的
6、成员变量与局部变量的区别
*成员变量与局部变量的区别
*a)作用域不同
* -局部变量的作用域仅限于定义它的方法
* -成员变量的作用域在整个类内部都是可见的
*b)初始值不同
* -成员变量有默认初始值
* -局部变量没有默认初始值,必须自行设定初始值
*c)同名变量不同
* -在同一个方法中,不允许有同名的局部变量
* -在不同的方法中,可以有同名的局部变量
*d)存储位置不同
* -成员变量是在对象创建以后存在于堆中,对象回收时,成员变量消失
* -局部变量是在方法被调用时存在于栈中,方法调用结束,从栈中清除
*e)生命周期不同
* -随着对象的创建而创建,对象回收时,成员变量消失
* -随着方法的调用被创建,方法调用结束,从栈中清除
七、静态成员变量
静态成员变量是共享的
非静态成员变量非共享
public int x;
public static int y;
public void fun() {
System.out.println("非静态成员变量x的值 >>>" + ++x);
System.out.println("静态成员变量x的值 >>>" + ++y);
}
@Test
public void test01() {
Person03 person01 = new Person03();
Person03 person02 = new Person03();
//非静态成员变量x的值 >>> 1
//静态成员变量x的值 >>> 1
person01.fun();
//非静态成员变量x的值 >>> 1
//静态成员变量x的值 >>> 2
person02.fun();
//非静态成员变量x的值 >>> 2
//静态成员变量x的值 >>> 3
person01.fun();
//非静态成员变量x的值 >>> 2
//静态成员变量x的值 >>> 4
person02.fun();
}
八、匿名对象与引用类型变量
public class Person04 {
public void laugh() {
System.out.println("二十四笑头一笑,仰天长笑");
}
public class Person04Test {
@Test
public void laugh() {
//person04 引用对象 引用了内存中的一个变量
Person04 person04 = new Person04();
person04.laugh();
//匿名对象
new Person04().laugh();
}
九、对象的属性赋值与读取
@Test
public void test01() {
Person01 person01 = new Person01();
Person01 person02 = new Person01();
System.out.println(person01.nickname);
System.out.println(person02.nickname);
System.out.println(person01.gender);
System.out.println(person02.gender);
System.out.println(person01.age);
System.out.println(person02.age);
}
十、访问修饰符
* 访问修饰符 public protected default private
* Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。
*
*public 对所有类可见。使用对象:类、接口、变量、方法
*protected 对同一包内的类和所有子类可见,使用对象:变量、方法。注意:不能修饰类(外部类)
*default (即默认,什么也不写)在同一包内可见,不适用任何修饰符,使用对象:类、接口、变量、方法
*private 在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)
十一、封装
封装是对于一个类,需要让外部调用者知道的才暴露,不需要让外部调用者知道的全部隐藏起来。
属性一般使用private访问权限,属性私有后,提供相应的get/set方法来访问相关属性。
public class Person04 {
/**
* 昵称
*/
private String nickname;
/**
* 性别 1代表男性 0代表女性 默认值为0
*/
private int gender;
/**
* 年龄 默认值设置为18
*/
private int age = 18;
/**
* 封装
*/
public void setNickname(String nickname) {
nickname = nickname;
}
public String getNickname() {
return nickname;
}
public void setGender(int gender) {
age = gender;
}
public int getGender() {
return gender;
}
public void setAge(int age) {
age =age;
}
public int getAge() {
return age;
}
@Test
public void test02() {
Person04 person01 = new Person04();
Person04 person02 = new Person04();
person01.setNickname("张三");
person02.setNickname("李四");
System.out.println(person01.getNickname());
System.out.println(person02.getNickname());
person02.setGender(1);
System.out.println(person01.getGender()== 1 ? "男" : "女");
System.out.println(person02.getGender()== 1 ? "男" : "女");
person01.setAge(20);
person02.setAge(22);
System.out.println(person01.getAge());
System.out.println(person02.getAge());
}
十二、参数变量名与引用类型变量时,使用this
* this 方法的调用者 谁调用我 我就是谁
* this 在此处的含义是调用类中的成员变量
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
十三、Eclipse生成set和get方法
右键-->source-->Generate getters and setters-->选择要生成变量即可
十四、lombok引用
使用插件lombok导入@setter和getter即可简化代码
1、打开网址:Maven Repository: Search/Browse/Explore (mvnrepository.com)
2、输入;lombok找到jar文案
3、下载jar文件
4、下载完成后,配置lombok文件
在下载文件位置文件地址处输入cmd,跳出控制台之后输入 java -jar ,按Tab快捷键补全代码,运行后弹出对话框,选择一个本地变量,然后进行安装
十五、构造方法
1、无参构造方法
* 方法名与类名相同,方法体没有返回值,但是再方法声明的时候,却不需要使用void修饰的方法我们称之为构造方法
* 构造方法的作用:用于初始化对象、对象的属性赋值
* 没有参数的构造方法,我们称之为无参构造方法
* 代码中没有编写构造方法,jvm在执行对象初始化的时候,帮助程序追加无参构造方法
* 注意在一个类中,既没有无参构造方法也没有有参构造方法的时候,jvm不会追加无参构造方法
public class Person01 {
//public void Person01() {
//This method has a constructor name
//方法名与类名相同,方法体没有返回值,但是再方法声明的时候,却不需要使用void修饰的方法我们称之为构造方法
public Person01() {
}
2、有参构造方法
括号中有内容
public Person02(String nickname, int gender, int age) {
this.nickname=nickname;
this.gender=gender;
this.age=age;
}
3、快捷键生成
右键-->source-->Generate Constractor using Files-->不选择任何属性
生成无参构造
public Person03() {
super();
}
右键-->source-->Generate Constractor using Files-->选择属性
生成全参构造4、
public Person03(String nickname, int gender, int age) {
System.out.println("我是有参构造方法");
this.nickname=nickname;
this.gender=gender;
this.age=age;