面向对象基础
1.类和对象
1.1什么是对象
万物皆对象,客观存在的事物皆为对象
1.2什么是面向对象
1.3什么是类
类是对现实生活中一类具有共同属性和行为的事物的抽象
类的特点:
- 类是对象的数据类型
- 类是具有相同属性和行为的一组对象的集合
1.4什么是对象的属性
属性:对象具有的各种特征,每个对象的每个属性都拥有特定的值
1.5什么是对象的行为
行为:对象能够执行的操作
1.6类和对象的关系
类:是对现实生活中一类具有共同属性和行为的事物的抽象
对象:是能够看得到摸得着的真实存在的实体
1.7类的定义
类的重要性:是Java程序的基本组成单位
类是什么:是对现实生活中一类具有共同属性和行为的事物的抽象,确认对象将会拥有的属性和行为
类的组成:属性和行为
- 属性:在类中通过成员变量来体现(类中方法外的变量)
- 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
类的定义步骤:
- 定义类
- 编写类的成员变量
- 编写类的成员方法
例:Phone.java
package com.itheima_01;
/*
类的定义
类的定义步骤:
定义类
编写类的成员变量
编写类的成员方法
手机类:
类名:
手机(Phone)
成员变量:
品牌(brand)
价格(price)
成员方法:
打电话(call)
发短信(sendMessage)
*/
public class Phone {
//成员变量
String brand;
int price;
//成员方法
public void call() {
System.out.println("打电话");
}
public void sendMessage() {
System.out.println("发短信");
}
}
1.8对象的使用
创建对象
- 格式:类名 对象名 = new 类名();
- 范例:Phone p = new Phone();
使用对象
1:使用成员变量
格式:对象名.变量名
范例:p.brand
2:使用成员方法
格式:对象名.方法名()
范例:p.call()
PhoneDemo.java
package com.itheima_01;
/*
创建对象
格式:类名 对象名 = new 类名();
范例:Phone p = new Phone();
使用对象
1:使用成员变量
格式:对象名.变量名
范例:p.brand
2:使用成员方法
格式:对象名.方法名()
范例:p.call()
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand);
System.out.println(p.price);
//使用成员方法
p.call();
p.sendMessage();
}
}
同1.7代码使用
案例:学生
-
需求:首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用
-
分析:
成员变量:姓名,年龄…
成员方法:学习,做作业… -
思路:
-
定义一个学生类
类名:Student
成员变量:name,age
成员方法:study(),doHomework() -
定义学生测试类
类名:StudentDemo
因为要做测试,所以有一个主方法:main方法 -
在学生测试类中通过对象完成成员变量和成员方法的使用
给成员变量赋值,输出成员变量的值
调用成员方法
-
Student.java
package com.itheima_02;
/*
学生类
*/
public class Student {
//成员变量
String name;
int age;
//成员方法
public void study() {
System.out.println("好好学习,天天向上");
}
public void doHomework() {
System.out.println("键盘敲烂,月薪过万");
}
}
StudentDemo.java
package com.itheima_02;
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name + "," + s.age);
s.name = "林青霞";
s.age = 30;
System.out.println(s.name + "," + s.age);
s.study();
s.doHomework();
}
}
2.对象内存图
2.1对象内存图(单个对象)
StudentTest01.java
package com.itheima_03;
/*
单个对象
*/
public class StudentTest01 {
public static void main(String[] args) {
//创建对象
Student s = new Student();
System.out.println(s);
//使用成员变量
System.out.println(s.name + "," + s.age);
s.name = "张曼玉";
s.age = 28;
System.out.println(s.name + "," + s.age);
//使用成员方法
s.study();
s.doHomework();
}
}
2.2对象内存图(多个对象)
StudentTest02.java
package com.itheima_03;
/*
多个对象
*/
public class StudentTest02 {
public static void main(String[] args) {
//创建第一个对象并使用
Student s1 = new Student();
s1.name = "林青霞";
s1.age = 30;
System.out.println(s1.name + "," + s1.age);
s1.study();
s1.doHomework();
//创建第二个对象并使用
Student s2 = new Student();
s2.name = "张曼玉";
s2.age = 28;
System.out.println(s2.name + "," + s2.age);
s2.study();
s2.doHomework();
}
}
2.3对象内存图(多个对象指向相同)
StudentTest03.java
package com.itheima_03;
/*
多个对象指向相同
*/
public class StudentTest03 {
public static void main(String[] args) {
//创建第一个对象并使用
Student s1 = new Student();
s1.name = "林青霞";
s1.age = 30;
System.out.println(s1.name + "," + s1.age);
//把第一个对象的地址赋值给第二个对象
Student s2 = s1;
s2.name = "张曼玉";
s2.age = 28;
System.out.println(s1.name + "," + s1.age);
System.out.println(s2.name + "," + s2.age);
}
}
3.成员变量和局部变量
3.1什么是成员变量和局部变量
成员变量:类中方法外的变量
局部变量:方法中的变量
3.2成员变量和局部变量区别
4.封装
4.1private关键字
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
- 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
- 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
Student.java
package com.itheima_04;
/*
学生类
*/
public class Student {
//成员变量
String name;
// int age;
private int age;
//提供get/set方法
public void setAge(int a) {
// age = a;
if(a<0 || a>120) {
System.out.println("你给的年龄有误");
} else {
age = a;
}
}
public int getAge() {
return age;
}
//成员方法
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_04;
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//给成员变量赋值
s.name = "林青霞";
// s.age = 30;
// s.age = -30;
s.setAge(30);
// s.setAge(-30);
//调用show方法
s.show();
}
}
4.2private关键字的使用
一个标准类的编写:
- 把成员变量用private修饰
- 提供对应的getXxx()/setXxx()方法
Student.java
package com.itheima_05;
/*
学生类
*/
public class Student {
//成员变量
private String name;
private int age;
//get/set方法
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_05;
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用set方法给成员变量赋值
s.setName("林青霞");
s.setAge(30);
s.show();
//使用get方法获取成员变量的值
System.out.println(s.getName() + "---" + s.getAge());
System.out.println(s.getName() + "," + s.getAge());
}
}
4.3this关键字
-
this修饰的变量用于指代成员变量
-
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
-
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
-
-
什么时候使用this呢?解决局部变量隐藏成员变量
-
this:代表所在类的对象引用
- 记住:方法被哪个对象调用,this就代表哪个对象
Student.java
package com.itheima_06;
/*
学生类
*/
public class Student {
private String name;
private int age;
// public void setName(String n) {
// name = n;
// }
public void setName(String name) {
// name = name;
this.name = name;
}
public String getName() {
return name;
}
// public void setAge(int a) {
// age = a;
// }
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_06;
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用set方法给成员变量赋值
s.setName("林青霞");
s.setAge(30);
//调用show方法
s.show();
}
}
4.4this内存管理
4.5封装
- 封装概述
是面向对象三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的 - 封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法 - 封装好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
5.构造方法
5.1构造方法概述
构造方法是一种特殊的方法
作用:创建对象
格式:
public class 类名{
修饰符 类名( 参数 ) {
}
}
功能:主要是完成对象数据的初始化
Student.java
package com.itheima_07;
/*
学生类
构造方法:
作用:创建对象
功能:完成对象数据的初始化
格式:
修饰符 类名(参数) {
}
修饰符一般用:public
*/
public class Student {
private String name;
private int age;
//构造方法
public Student() {
System.out.println("无参构造方法");
}
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_07;
/*
测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
s.show();
}
}
5.2构造方法的注意事项
-
构造方法的创建
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
-
构造方法的重载
- 如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
-
推荐的使用方式
- 无论是否使用,都手工书写无参数构造方法
Student.java
package com.itheima_08;
/*
学生类
*/
public class Student {
private String name;
private int age;
// public Student() {
// System.out.println("无参构造方法");
// }
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_08;
/*
测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s1 = new Student();
s1.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(30);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",30);
s4.show();
}
}
5.3标准类制作
- 成员变量
- 使用private修饰
- 构造方法
- 提供一个无参构造方法
- 提供一个带多个参数的构造方法
- 成员方法
- 提供每一个成员变量对应的setXxx()/getXxx()
- 提供一个显示对象信息的show()
- 创建对象并为其成员变量赋值的两种方式
- 无参构造方法创建对象后使用**setXxx()**赋值
- 使用带参构造方法直接创建带有属性值的对象
Student.java
package com.itheima_09;
/*
成员变量
使用private修饰
构造方法
提供一个无参构造方法
提供一个带多个参数的构造方法
成员方法
提供每一个成员变量对应的setXxx()/getXxx()
提供一个显示对象信息的show()
*/
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//成员方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
StudentDemo.java
package com.itheima_09;
/*
创建对象并为其成员变量赋值的两种方式
1:无参构造方法创建对象后使用setXxx()赋值
2:使用带参构造方法直接创建带有属性值的对象
*/
public class StudentDemo {
public static void main(String[] args) {
//无参构造方法创建对象后使用setXxx()赋值
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
s1.show();
//使用带参构造方法直接创建带有属性值的对象
Student s2 = new Student("林青霞",30);
s2.show();
}
}