Java:(学习笔记)三、面向对象-基础
第四章—面向对象-基础
一、说明
1、面向过程和面向对象
1)面向过程:procedure oriented programming 缩写 POP
①分析出解决问题所需要的步骤,然后把步骤一步一步实现。
②面向过程直接关注流程。
2)面向对象:object oriented programming 缩写 OOP面向对象的编程语言
①以分类的方式进行思考和解决问题。
②面向对象先对整体关系作出分类,然后根据不同的类深入细节的处理。
③面向对象的思想符合人类的认知习惯。
3)面向对象无法取代面向过程,他们是相辅相成的。面向对象关注于从宏观 上把握事物之间的关系,在具体到如何实现某个细节时,仍然采用面向过 程的思维方式。
2、Java类和对象
1)说明
①在Java中,必学先设计类,才能获得对象。
②类:是对象共同特征的描述。(例如汽车设计图)
③对象:是真实存在的具体事例。(例如依照设计图生产出来的一辆辆汽车)
2)定义类
//类中包含五种成分,有些非必须
public class 类名 {
1、成员变量:事物属性的描述
2、成员方法:事物的行为
3、构造器:用于创建对象
4、代码块:一段没有名称的代码块
5、内部类:在类体中声明的类
}
3)对象
类名 对象名 = new 类名();
4)注意
①类名首字母建议大写,且具有意义,满足大驼峰模式。
②一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个class类。
5)对象的使用
访问属性:对象名.成员变量
访问行为:对象名.成员方法(…)
6)成员变量的默认值
类型 | 默认值 |
---|---|
byte、short、char、int、long | 0 |
float、double | 0.0 |
boolean | false |
引用类型 :类、接口、数组、String | null |
7)类和对象举例
//构造类
public class Car {
//属性,即成员变量
String name;
double price;
//行为,即成员方法
public void run() {
}
}
//以下应放在 main 方法中
//创造该类的对象
Car myCar = new Car();
//访问对象
myCar.name = "我的汽车";
price = 330000;
3、对象内存图
1)对象存放在堆内存中
2)对象变量存储的是对象在堆内存中的地址。
3)成员变量中的数据放在独享中,即存在于堆内存中。
4)垃圾回收:当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。Java存在自动垃圾回收器,会定期进行清理。
二、构造器
1、作用
用于初始化一个类的对象,并返回对象的地址。
2、格式
//定义格式
修饰符 类名(形参列表){
...
}
//初始化对象格式
//类名 对象名 = new 类名(参数列表); 与此一致
类型 变量名称 = new 构造器;
3、分类
1)无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值。
2)有参数构造器:在初始化对象的时候,同时可以为对象进行赋值。
4、注意
1)任何类定义出来,默认就自带了无参数构造器,写不写都有。
2)一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写一个无参数构造器了。
三、相关语法、关键字与修饰符
1、成员变量与局部变量
1)成员变量
①成员变量是定义在类中,方法体之外的变量。
②成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
③在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
④成员变量在创建对象的时候会从类中复制一份到对象中。
⑤成员变量可以被类中方法、构造方法和特定类的语句块访问。
⑥成员变量的作用范围为整个类体
2)局部变量
①在方法、构造方法或者语句块中定义的变量被称为局部变量。
②局部变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型)。
③局部变量在使用前必须初始化赋值。
④变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
3)区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认初始化值 | 没有,使用之前需要完成赋值 |
内存位置不同 | 栈内存 | 栈内存 |
生命周期不同 | 随着方法的调用而存在,随着方法的运行结束 而消失 | 随着方法的调用而存在,随着方法的运行结束 而消失 |
作用域 | 在所归属的大括号中 |
2、this
出现在成员方法、构造器中代表当前对象的地址,用于访问当前对象的成员变量、成员方法。
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
3、static
1)说明
static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。随着类的加载而加载 ;优先于对象存在 ;修饰的成员,被所有对象所共享 ;可不创建对象,直接被类调用。
2)静态属性
静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存只有一个。
在static方法内部只能访问类的static属性,不能访问类的非static属性,static属性先加载。
3)静态方法
静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问。
实例成员方法(无static修饰,属于对象),只能用对象触发访问。
4)注意
①静态方法只能访问静态的成员,不可以直接访问实例成员。
②实例方法可以访问静态的成员,也可以访问实例成员。
③静态方法中是不可以出现this关键字的。
5)补充:利用static设计单例设计模式
①设计模式:开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。设计模式有20多种,对应20多种软件开发中会遇到的问题,学设计模式主要是学2点:
第一:这种模式用来解决什么问题。
第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的。
②单例模式:可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。
③饿汉单例设计模式
说明:在用类获取对象的时候,对象已经提前为你创建好了。
设计步骤:定义一个类,把构造器私有。定义一个静态变量存储一个对象。
/** a、定义一个单例类 */
public class SingleInstance {
/** c.定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */
public static SingleInstance instance = new SingleInstance ();
/** b.单例必须私有构造器*/
private SingleInstance (){
System.out.println("创建了一个对象");
}
}
③懒汉单例设计模式
说明:在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。
设计步骤:定义一个类,把构造器私有。定义一个静态变量存储一个对象。提供一个返回单例对象的方法
/** 定义一个单例类 */
class SingleInstance{
/** 定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */
public static SingleInstance instance ; // null
/** 单例必须私有构造器*/
private SingleInstance(){}
/** 必须提供一个方法返回一个单例对象 */
public static SingleInstance getInstance(){
...
return ...;
}
}
4、final
final关键字是最终的意思,可以修饰(方法,变量,类)
1)修饰方法:表明该方法是最终方法,不能被重写。
2)修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)
3)修饰类:表明该类是最终类,不能被继承。
4)final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
5)final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。
5、包
1)包是用来分门别类的管理各种不同类的,类似于文件夹、建包利于程序的管理和维护。
2)建包的语法格式:package 公司域名倒写.技术名称。报名建议全部英文小写,且具备意义。建包语句必须在第一行,一般IDEA工具会帮助创建
3)导包
相同包下的类可以直接访问,不同包下的类必须导包,才可以使用!导包格式:import 包名.类名;
假如一个类中需要用到不同类,而这个两个类的名称是一样的,那么默认只能导入一个类,另一个类要带包名访问。
6、权限修饰符
修饰符 | 同一 个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
自己定义成员(方法,成员变量,构造器等)一般满足如下要求:
①成员变量一般私有。
②方法一般公开。
③如果该成员只希望本类访问,使用private修饰。
④如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰。
7、常量
1)常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
public static final String ID_CARD = "123456789123456789";
2)常量命名规范:英文单词全部大写,多个单词下划线连接起来。
3)常量的执行原理:在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量。这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的。
8、枚举
//格式:
修饰符 enum 枚举名称 {
第一行都是罗列枚举类实力的名称
}
//例:
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
1)作用:是为了做信息的标志和信息的分类
2)特征:
①枚举类都是继承了枚举类型:java.lang.Enum
②枚举都是最终类,不可以被继承。
③构造器的构造器都是私有的,枚举对外不能创建对象。
④枚举类的第一行默认都是罗列枚举对象的名称的。
⑤枚举类相当于是多例模式
四、代码块
1、说明
代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。
在Java类下,使用 { } 括起来的代码被称为代码块 。
2、种类
1)静态代码块:
格式:static {…}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。
2)构造代码块(了解,用的少):
格式:{…}
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
使用场景:初始化实例资源。
3、作用
在启动系统时对数据进行初始化。