1. 了解面向对象
1.1 何谓“面向对象”的编程思想
本质上是一种编程的原则。
1.2表格结构和类结构
生活中思考问题,发现问题,处理问题往往都会使用表格作为工具,实际上,“表格思维”就是一种典型的面向对象思维
我们经常将表中的“列”,称作“字段”,英文“field”。
面向对象编程中,类对应表的结构(表的filed),我们可以定义出“类”。
2. 表格中的动作和类的方法
1.表结构对应的类结构
2.一行数据对应一个对象
3.表中所有数据对应这个类的所有对象
3. 面向过程与面向对象
3.1 面向过程和面向对象的区别
面向对象和面向过程思想总结
都是解决问题的思维方式,都是代码组织的方式
面向过程是一种“执行者思维”,解决简单问题可以使用面向过程
面向对象是一种“设计者思维”,解决复杂,需要协作的问题
面向对象离不开面向过程:
宏观上:通过面向对象进行整体设计
微观上:执行和处理数据,仍是面向过程
4. Java语言的基本元素:类和对象
4.1 类和对象的理解
4.1.1 什么是对象
万物皆对象
4.1.2 什么是面向对象
了解对象的详细信息,并关注它的过程
面向一个具体的事物进行操作,面向对象编程
4.1.3 什么是类
类是对现实生活中一类具有共同属性和行为的事物的集合
类的特点:
类是对象的数据类型
类是具有相同属性和行为的一组对象的集合
4.1.4 什么是对象的属性
属性:对象具有的各种特征,每个对象的每个属性都拥有特定的值
4.1.5 对象的行为
对象能够执行的操作
4.1.6 类和对象的关系
类:是对现实生活中一类具有共同属性和行为的事物的抽象
对象:能看得到摸得着的真实存在的实体
类是对象的抽象,对象是类的实体
4.2 类的定义
类的定义步骤
1. 定义类
2. 编写类的成员变量 //对象的属性
3. 编写类的成员方法 //对象的行为
//类的定义
public class Phone {
/*
* 属性:
* 成员变量:卫浴类的内部,方法的外部,其他的使用方式和之前变量的定义一致
* */
String brand;
double price;
/*
* 行为:
* 成员方法:去掉之前方法中的static即可
* */
public void call(){
}
public void sms(){
}
}
4.3 对象的使用
创建对象:
格式:类名 对象名 = new 类名()
范例:Phone p = new Phone();
使用对象:
1. 使用成员变量
格式:对象名.变量名 范例:p.brand
2. 使用成员方法
格式:对象名.方法名() 范例:p.call()
public static void main(String[] args) {
// 创建对象
Phone p = new Phone();
// 适用对象
// 为成员属性赋值
p.brand = "华为P40 Pro";
p.price = 2999.99;
// 获取属性
System.out.println(p.brand);
System.out.println(p.price);
// 调用成员方法
p.call();
p.sms();
}
/**
* 学生类
*/
class Student {
/**
* 成员变量
*/
String name;
int age;
/**
* 成员方法
* */
public void study() {
System.out.println("上课,看书");
}
public void doHomework() {
System.out.println("做作业...");
}
}
/**
* 学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
// 创建对象
Student std = new Student();
// 使用对象
// 对成员变量赋值
std.name = "小张";
std.age = 19;
// 输出成员变量的值
System.out.println(std.name);
System.out.println(std.age);
// 调用成员方法
std.study();
std.doHomework();
}
}
5. 对象内存图
5.1 单个对象内存图
成员方法调用过程
5.2 多个对象内存图
成员方法调用过程
总结
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有一个对象修改了内存中的数据,随后无论使用哪一个对象进行数据的获取,都是修改后的数据
6. 成员变量和局部变量
成员变量和局部变量的区别
7.封装
7.1 private关键字
一个权限修饰符
可以修饰成员(成员变量和方法)
作用是保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问。
使用private修饰成员,可以保证在回去数据的时候或得到的都是有效数据
当成员变量被private修饰之后,与此同时我们需要提供相应的getter和setter方法
getter和setter方法的写法是固定的:
访问修饰符必须是public
方法名是"get变量名()":用于获得成员变量的值
方法名是“set变量名()”:用于设置成员变量的值
7.2 private的使用
/**
* 学生类
*/
class Student {
/**
* 成员变量
*/
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
/**
* 成员方法
* */
public void study() {
System.out.println("上课,看书");
}
public void doHomework() {
System.out.println("做作业...");
}
}
/**
* 学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
// 创建对象
Student std = new Student();
// 使用对象
std.setName("李华");
System.out.println(std.getName());
std.setAge(89);
System.out.println(std.getAge());
// 调用成员方法
std.study();
std.doHomework();
}
}
7.3 this关键字
this修饰的变量用于指代成员变量。
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量。
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量。
什么时候使用this?
解决局部变量隐藏成员变量。
this:代表所在类的调用方法的引用,那个对象调用的方法,this就代表哪一个对象
this作用:
1. 用来区分同名的成员变量和局部变量
2. 在代码中需要明确的指代当前使用的成员是当前对象的成员时,则可以使用this来表示。
7.4 this内存原理
7.5 封装思想
1. 封装概述:
是面向对象三大特征之一(封装、继承、多态)
是面向对象程序语言对现实世界的模拟,客观世界里成员变量都隐藏在对象内部的,外界是无法直接操作。
2. 封装原则
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXx()和setXx()方法
3. 封装好处
通过方法来控制成员变量的操作,提高了程序的安全性。
通过代码用方法进行封装,提高了代码的复用性。
8.构造方法
作用:
1. 创建对象
2. 完成对象属性的初始化
构造方法:
访问修饰符 public 或者 private
方法的返回值类型:没有返回值,void也不写
方法的名称:和类名保持一致
参数列表:根据实际需要罗列
当我们没有手动创建构造方法是,则jvm会为我们提供一个默认的构造方法
public Student(){
System.out.println("构造方法被调用...");
}
构造方法的执行实际:当创建对象的时候就会被调用,而且每创建一个对象,构造方法就会被调用一次
自定义构造方法:
当程序中我们自己写了构造方法的时候,则jvm将不再为我们提供默认的构造方法了,如果还要是用无参的构造方法,就必须再手写一个无参数构造方法
public Student(){
System.out.println("构造方法被调用....");
};
public Student(String name){
this.name = name;
}
构造方法可以重载
public Student(){
System.out.println("构造方法被调用....");
};
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;
}
当我们在实际开发中创建一个类的时候,通常情况下,我们都需要将默认无参构造手动写出来
重要功能:
可以使用带参构造,为成员变量进行初始化
在构造方法中,如果要调用其他的重载的构造方法,可以使用this();但是使用this()调用其他的构造方法只能调用一次。
因为在构造方法中使用this调用其他构造方法语句,必须出现在当前构造方法的第一行
标准的Java类
类的组成:
1. 构造方法
提供一个无参构造方法
提供一个带多个参数的构造方法
2. 成员变量
使用private修饰
3. 成员方法
提供每一个成员变量对应的getXx()/setXx()
提供一个显示对象信息的show()
4. 创建对象并为其成员赋值的两种方式
无参构造方法创建对象后使用setXx()赋值
使用带参构造方法直接创建带有属性值的对象
细节:
1. 构造方法需要多个,至少需要包含无参构造
2. 成员变量必须使用private修饰,同时提供getter和setter方法
//在一个标准的 java类中,只存在和当前类相关的 属性和方法
public class Person {
// 定义成员变量
private String name;
private int age;
private String job;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String job) {
this.name = name;
this.age = age;
this.job = job;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public void show(){
System.out.println(this.getName()+"----"+this.getAge()+"---"+this.job);
}
}
9. 常用API-字符串
1.API
1.1 API概述
什么是API
API:应用程序编程接口
2. String字符串
API中对于字符串的描述
字符串使用格式
String str1 = new String();
String str2 = "abc"; // 最常用方式
byte[] bytes = "hello".getBytes();
String str3 = new String(bytes);
char[] chars = {'w','o','r','l','d'};
String str4 = new String(chars);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
• String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
• 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。
String类包括用于检查序列的各个字符的方法,用于比较字符串,搜索字符串,提取子字符串以及创建将所有字符翻译为大写或小写的字符串的副本
public static void main(String[] args) {
String str1 = new String("java");
String str2 = new String("java");
String str3 = "java";
String str4 = "java";
String str5 = "ja"+"va";
String str6 = "ja";
String str7 = "va";
String str8 = str6 + str7;
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//false
System.out.println(str3 == str4);//true
System.out.println(str4 == str5);//true
System.out.println(str5 == str8);//false
}