1.介绍:
-
面向:拿、找;
-
对象:能干活的东西;
-
面向对象编程:拿东西过来做对应的事情;
2.设计对象并使用:
(1)类和对象
-
类(设计图):是对对象共同特征的描述;
-
对象:是真实存在的具体东西。
注意:在Java中,必须先设计类,才能获得对象。
public class 类名{
/*
1、成员变量(代表属性,一般是名词)
2、成员方法(代表行为,一般是动词)
3、构造器
4、代码快
5、内部类
*/
}
-
如何获得类的对象:
-
类名 对象名=new 类名();
-
-
如何使用对象:
-
访问属性:对象名.成员变量
-
访问行为:对象名.方法名(…)
-
-
例:
public class Phone {
String brand;
double price;
public void call(){
System.out.println("手机打电话");
}
public void playGame(){
System.out.println("手机玩游戏");
}
}
-
定义类的补充注意事项:
-
用来描述一类事物的类,专业叫做:javabean类。
-
在javabean类中,不写main方法
-
-
以前写main方法的类,叫做测试类。
-
我们可以在测试类中创建Javabean类的对象并进行赋值调用。
-
注意:
-
类名首字母大写,见名知意,驼峰模式。
-
一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。(实际开发中一个文件定义一个clas类)
-
成员变量的完整定义格式:修饰符 数据类型 变量名称=初始化值;一般无需指定初始化值,存在默认值。
-
数据类型 | 明细 | 默认值 |
---|---|---|
基本数据类型 | byte/short/int/long | 0 |
float/double | 0.0 | |
boolean | false | |
引用数据类型 | 类、接口、数组、String | null |
-
例:女朋友类:
-
需求:编写女朋友类,创建女朋友类中的方法。
-
public class GirlFriend {
String name;
int age;
String gender;
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
}
public static void main(String[] args) {
GirlFriend gf = new GirlFriend();
gf.name="小颖";
gf.age=18;
gf.gender="御姐";
System.out.println(gf.name);
System.out.println(gf.age);
System.out.println(gf.gender);
gf.eat();
gf.sleep();
}
3.封装
<1>.相关概念:
(1)面向对象三大特征:封装、继承、多态;
(2)封装定义:就是如何正确设计对象的属性和方法;
(3)使用:就是对象代表什么,就得封装成对应的数据,并提供数据对应的行为;
(4)好处:
-
让编程变得简单,有什么事,找对象、调方法就行;
-
降低我们的学习成本;
<2>.private关键字
(1)作用:
-
是一个权限修饰符;
-
可以修饰成员(成员变量和成员方法)
-
被private修饰的成员只能在本类中才能访问;
-
为保证数据的安全性;
-
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作;
-
提供“setXxx”方法,用于成员变量赋值,方法用public修饰;
-
提供“getXxx”方法,用于获取成员变量的值,方法用public修饰;
(2)例:
public class GirlFriend {
private String name;
private int age;
private String gender;
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃饭");
}
// 针对于每一个私有化的成员变量,都要提供get和set方法
// set方法:给成员变量赋值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//等号左边:表示成员位置的name
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>=18&&age<=50){
this.age = age;
}else {
System.out.println("非法参数");
}
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public static void main(String[] args) {
GirlFriend gf = new GirlFriend();
gf.setName("小颖");
gf.setAge(18);
gf.setGender("御姐");
System.out.println(gf.getName());
System.out.println(gf.getAge());
System.out.println(gf.getGender());
gf.eat();
gf.sleep();
}
<3>this关键字:
(1)成员变量和局部变量:
-
遵循就近原则
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类里,方法外 | 方法内、方法申明上 |
初始化值不同 | 有默认初始化值 | 没有,需要赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 | 随着对象的创建而存在,随着对象的消失而消失 |
作用域 | 整个类中有效 | 当前方法中有效 |
例:该图输出的是局部变量的age;若想输出成员变量的age,则在输出语句中输入:this.age
4.构造方法:
(1)概述:构造方法:可称为构造器或者构造函数。
(2)作用:在创建对象的时候由虚拟机自动调用,给成员变量进行初始化;
(3)格式:
/*public class Student{
修饰符 类名(参数){
方法体;
}
}*/
(4)分类:
-
无参构造方法:初始化对象是,成员变量的数据均采用默认值;
-
有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值;
(5)注意:
-
方法名与类名相同,大小写也要一致
-
没有返回值类型,连void都没有
-
没有具体的返回值(不能由return带回结果数据)
-
执行时机:
-
创建对象的时候由虚拟机调用,不能手动调用构造方法;
-
每创建一次对象,就会调用一次构造方法;
-
普通方法 | 成员方法 | 构造方法 |
---|---|---|
public static void student(){} | public void student(){} | public student(){} |
public class GirlFriend {
private String name;
private int age;
private String gender;
public GirlFriend() {
}
public GirlFriend(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>=18&&age<=50){
this.age = age;
}else {
System.out.println("非法参数");
}
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public static void main(String[] args) {
GirlFriend gf = new GirlFriend("小颖",18,"御姐");
System.out.println(gf.getName());
System.out.println(gf.getAge());
System.out.println(gf.getGender());
gf.eat();
gf.sleep();
}
(6)注意事项:
-
构造方法定义:
-
我们没有写任何构造方法,那么虚拟机回给我们加上一个空参构造方法;
-
如果定义了构造方法,系统将不再提供默认的构造方法;
-
-
构造方法的重载:
-
带参构造方法,和无参数构造方法,两者方法名相同,但参数不同
-
-
推介使用方式:
-
无论是否使用,都手动书写无参构造方法,和带全部参数的构造方法;
-
5.标准的Javabean类:
(1)要求:
-
类名需要见名知意
-
成员变量使用private关键字修饰
-
提供至少两个构造方法
-
无参
-
带全参
-
-
成员方法
-
提供每一个成员变量对应的setXxx/getXxx
-
public class User {
private String name;
private String password;
private String email;
private String gender;
private int age;
public User() {
}
public User(String name, String password, String email, String gender, int age) {
this.name = name;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}
/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取
* @return email
*/
public String getEmail() {
return email;
}
/**
* 设置
* @param email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* 获取
* @return gender
*/
public String getGender() {
return gender;
}
/**
* 设置
* @param gender
*/
public void setGender(String gender) {
this.gender = gender;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
}
6.对象内存图:
(1)一个对象的内存图:
Student s=new Student();
-
步骤:
-
加载class文件
-
申明局部变量
-
在堆内存中开辟一个空间
-
默认初始化
-
显示初始化
-
构造方法初始化
-
将堆内存中地址赋值给左边局部变量
-
(2)两个对象的内存图:
(3)两个引用指向同一个对象:
7.this内存原理:
this本质:代表方法调用者的地址;