面向对象:
为什么要面向对象编程
因为面向对象更符合人类的思维逻辑
一、面向对象学什么?
1.学习获取已有对象并使用
2.学习如何让自己设计对象并使用=====》涉及语法
二、设计对象并使用
1.(1)类和对象
①类(设计图):是对象共同特征的描述
②对象:是真实存在的具体的东西
在Java中,必须先设计类,才能获取对象
(2).如何定义类
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)
3.构造器
4.代码块
5.内部类
}
(3).如何得到类的对象
类名 对象名 = new 类名();
Phone p = new Phone;
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)
(4).如何让使用对象
访问属性:对象名.成员变量
访问行为:对象名.方法名(…)
package com.test03_mianxiangduixiang;
public class Demo01_Phone {
// //属性
String brand;
double price;
//行为
public void call(){
System.out.println("手机在打电话");
}
public void playGame(){
System.out.println("手机在玩游戏");
}
}
package com.test03_mianxiangduixiang;
public class Demo01_Phonetest {
public static void main(String[] args) {
//创建手机对象
Demo01_Phone p = new Demo01_Phone();
//给手机赋值
p.brand = "小米";
p.price = 1999.98;
//获取手机对象中的值
System.out.println(p.brand);
System.out.println(p.price);
//调用手机中的方法
p.call();
p.playGame();
//给手机赋值
p.brand = "苹果";
p.price = 8999.99;
//获取手机对象中的值
System.out.println(p.brand);
System.out.println(p.price);
//调用手机中的方法
p.call();
p.playGame();
}
}
(5)拿到对象后能干什么?
对象.成员变量;
对象.成员方法(…)
2.类的补充注意事项
★用来描述一类事物的类,专业叫做:JavaBean类
在JavaBean类中,是不写main方法的
★在以前,比爱那些main方法的类,叫做测试类
我们可以在测试类中创建JavaBean类的对象并进行赋值调用
★定义类的补充注意事项:
①类名首字母建议大写,需要见名知意,驼峰模式命名
②一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
实际开发中建议一个文件定义一个类
③成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;
一般无需指定初始化值,存在默认值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIvqeiIC-1685092029643)(E:\java笔记\笔记图片\对象成员变量的默认规则.png)]
举例:
package com.test03_mianxiangduixiang;
//创建一个女朋友对象
public class Demo02_Girlfriend {
//属性
String name ;
int age;
String gender;
//行为
public void drink(){
System.out.println("女朋友在喝水");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
package com.test03_mianxiangduixiang;
public class Demo02_GirlFriendTest {
public static void main(String[] args) {
//创建女朋友对象
Demo02_Girlfriend gf1 = new Demo02_Girlfriend();
gf1.name = "诗诗";
gf1.age = 18;
gf1.gender = "萝莉";
System.out.println(gf1.name);
System.out.println(gf1.age);
System.out.println(gf1.gender);
gf1.drink();
gf1.eat();
System.out.println("=======================");
Demo02_Girlfriend gf2 = new Demo02_Girlfriend();
gf2.name = "甜甜";
gf2.age = 18;
gf2.gender = "御姐";
System.out.println(gf2.name);
System.out.println(gf2.age);
System.out.println(gf2.gender);
gf1.drink();
gf1.eat();
}
}
(1)定义类有哪些建议,有什么需要注意的?
★类名首字母建议大写、英文、有意义,满足驼峰模式,不能用关键字,满足标志符规定
★一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
实际开发中建议一个文件定义一个类
(2)成员变量的的格式是什么样的,有什么特点?
★成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;
★一般无需指定初始化值,存在默认值
3.开发中的设计
★名词提炼法:提炼用到的名词作为属性和行为(方法)
三、封装
面向对象的三大特征:封装、继承、多态
1、封装:
告诉我们,如何正确设计对象的属性和方法
▲原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
2.封装的好处
★自己会正确的设计对象
★对象代表什么,就得封装对应的数据,并提供数据对应的行为
★让编程变得简单,有什么事,找对象,调方法就行
★降低我们的学习成本,可以少学,少记,不用记对象有哪些方法,有需要时去找就行
3.private关键字
①是一个关键字,是一个权限修饰符
②可以修饰成员(成员变量和成员方法)
③被private修饰的成员只能在本类中访问
④针对private修饰的成员变量,如果需要被其他类引用,提供相应的操作
⑤提供 setXxx(参数) 方法,用于成员变量赋值,方法用public修饰
⑥提供 getXxx(参数) 方法,用于获取成员变量的值,方法用public修饰
package test;
public class GirlFriend {
//属性
private String name;
private int age;
private String gender;
//针对于每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
//作用:给成员变量name进行赋值
public void setName (String n) {
name = n;
}
//作用:对外提供name属性
public String getName() {
return name;
}
//作用:给成员变量age进行赋值
public void setAge (int a) {
if(age >= 18 && age <= 50) {
age = a;
}else {
System.out.println("数据不合法");
}
}
//作用:对外提供name属性
public int getAge() {
return age;
}
//作用:给成员变量name进行赋值
public void setGender (String s) {
gender = "萌妹子";
}
//作用:对外提供name属性
public String getGander() {
return gender;
}
//行为
public void sleep() {
System.out.println("女朋友在睡觉");
}
public void eat() {
System.out.println("女朋友在吃饭");
}
}
package test;
public class GirlFriendTest {
public static void main(String[]args) {
//创建女朋友的对象
GirlFriend gf1 = new GirlFriend();
//赋值
gf1.setName("小诗诗");
gf1.setAge(20);
gf1.setGender("女");
String name= gf1.getName();
int age = gf1.getAge();
String gender = gf1.getGander();
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGander());
gf1.eat();
gf1.sleep();
}
}
四、this关键字
1.成员变量:
定义在方法外面、类的里面的变量称为局部变量
2.局部变量:
定义在方法里面的变量称为局部变量
3.就近原则
要使用的变量距离那个定义的变量越近,就使用哪个(近水楼台先得月)
当成员变量和局部变量重名时,就需要用到this关键字
package com.test03_mianxiangduixiang;
public class Demo06_this {
private int age;
public void method(){
int age = 10;
System.out.println(age); //就近原则,获取局部变量的值10
System.out.println(this.age);//获取成员变量的值0
}
}
五、构造方法
1.构造方法概述:
构造方法也叫做构造器、构造函数
作用:在创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的
2.构造方法的格式
public class Student{
修饰符 类名(参数){
方法体;
}
}
★特点:
①方法名与类名相同,大小写也要一致
②没有返回值类型,连void也没有
③没有具体的返回值,(不能由return待会结果数据)
★构造方法分类:
①无参构造方法:在初始化的对象的时,成员变量的数据均采用默认值
②有参构造方法:在初始化对象的时候,同时可以为对象进行赋值
public class Student{
private String name;
private int age;
punlic Stufent(){
... //空参构造方法,默认初始化值
}
public Student(String name,int age){
... //带全部参数构造方法
}
}
★执行时机:
①创建对象的时候由虚拟机调用,不能手动调用构造方法
②每创建一次对象,就会调用一次构造方法
3.构造方法注意事项
①构造方法的定义
★如果没有定义构造方法,系统将给出一个默认的无参数构造方法
★如果定义了构造方法,系统将不在提供默认的构造方法
②构造方法的重载
★带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这就叫方法的重载
③推荐的使用方式
★无论是否适用,都手动书写无参数构造方法和带全部参数构造方法
六、标准JavaBean
1.类名需要见名知意,驼峰命名
2.成员变量使用private修饰
3.提供至少两个方法
①无参构造方法
②带全部参数的构造方法
4.成员方法
①提供每一个成员变量对应的setXxx/getXxx
②如果有其他行为也需要写上
package com.test06JavaBean;
public class User {
//属性
private String username;
private String password;
private String email;
private String gender;
private int age;
//ptg插件一键生成
//快捷键生成
//空参和带参快捷键
public User(String username, String password, String email, String gender, int age) {
this.username = username;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
public User() {
}
//set和get方法生成
//alt+I====》getter and setter
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "User{username = " + username + ", password = " + password + ", email = " + email + ", gender = " + gender + ", age = " + age + "}";
}
}
//空参构造方法
public User(){}
//带全部参数的构造方法
public User(String username,String password,String email,String gender,int age){
this.username = username;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
//set 和 get 方法
public void setUsername(String username){
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getGender() {
return gender;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
七、对象内存图
1.一个对象的内存图、
Student s = new Student( );
①加载class文件
②申明局部变量
③在堆内存中开辟一个空间
④默认初始化
⑤显式初始化
⑥构造方法初始化
⑦将堆内存中的地址值赋给左边的局部变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjhi0naa-1685092029645)(E:\java笔记\笔记图片\一个对象的内存图.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exPLD3S1-1685092029645)(E:\java笔记\笔记图片\一个对象内存图2.png)]
2.多个对象的内存图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wq9X9cV-1685092029646)(E:\java笔记\笔记图片\多个对象的内存图.png)]
3.两个变量指向同一个对象内存图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvpc2BUH-1685092029647)(E:\java笔记\笔记图片\两个引用指向一个对象.png)]
4.基本数据类型和引用数据类型的区别
(1)从内存的角度去解释:
**基本数据类型:**数据是存储在自己的空间中,
特点:赋值给其他变量,也是赋的真实的值
int a = 10;
int b = a;
**引用数据类型:**数据值是存储在其他空间暗中,自己空间中存储的是地址值。
特点:赋值给其他变量,赋的是地址值
Student s1 = new Student ();
Student s2 = s1;
5.this的内存原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7JdLfy1-1685092029647)(E:\java笔记\笔记图片\this的内存原理.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58aR83bW-1685092029648)(E:\java笔记\笔记图片\this的内存原理2.png)]
八、成员变量、局部变量区别
成员变量:类中方法外的变量
局部变量:方法中的变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfcLYXbg-1685092029649)(E:\java笔记\笔记图片\成员变量和局部变量的区别.png)]