对象:真实存在唯一的事物。
类:类就是同一种类型的事物的公共属性与公共行为的抽取。 抽象的概念。
在现实生活中就有大量的对象存在,我们从小就不断的在接触不同类型的对象,
然后我们大脑就会把具备相同属性与相同行为的事物进行归类。
在现实生活中有类与对象这两种事物,而计算机是服务于人类的,那么面向对象的计算机语言就诞生。
在现实生活中:
对象---------->类
java中 :
类------------->对象
如何找对象?
方式1: sun公司已经写好了很多类,我们只需要认识这些类就可以创建对象的对象了。
方式2: 我们需要自己定义类,然后通过自定 的类创建对象。
1. 自定义一个类。
class 类名{
事物的公共属性使用成员变量描述。
事物的公共行为功能使用函数描述。
}
2. 通过自定义的类创建对象。
创建对象的方式: 类名 变量名 = new 类名();
3. 访问对象的属性或者是调用对象的方法。
1. 访问对象的属性:
对象.属性名;
2. 调用对象的方法:
对象.函数名();
l 定义的位置的区别:
1.成员变量是定义在一个类之内,方法之外的。
2.局部变量是定义在方法之内的。
l 作用上的区别:
1.成员变量的作用:描述一类事物的公共属性。
2.局部变量的作用:提供了一个变量给方法内部使用。
l 生命周期区别:
1.成员变量的生命周期:随着对象的创建而存在,随着对象的消失而消失。
2. 局部变量的生命周期:调用方法执行到声明变量的语句的时候存在内存 中,局部变量一旦出了自己的作用域马上从内存中消失。
l 初始值的区别:
1.成员变量有默认的初始值。
String null
Int 0
float 0.0f
double 0.0
char ' '
boolean false
2.局部变量是没有默认的初始值的,必须要先初始化才能使用。否则报错。
匿名对象:没有引用类型变量指向的对象称作为匿名对象
匿名对象要注意的细节:
1.一般不要给匿名对象赋予属性值,因为永远都无法访问到匿名对象的属性。
2.两个匿名对象永远都不可能是同一个对象。
匿名对象好处:简化书写。
匿名对象的应用场景:
1. 只需调用一次类的方法情况下,使用匿名对象。
2. 作为形参传递。
面向对象语言三大特征:
1.封装
2. 继承
3. 多态
权限修饰符 : 权限修饰符的作用就是控制修饰的内容的可见范围的。
public : public 是公共的,public修饰的成员属性任何人都可以直接 访问。
private: private 是私用的, private修饰的成员属性只能在本类中访问。
封装的步骤:
1.把需要封装的属性使用private修饰。
2.提供公共的方法设置以及获取私有的成员属性。
构造方法的作用:给对应的对象进行对应的初始化(构造函数重载)。
构造方法的定义格式:
修饰符 函数名(形参列表...){
初始化对象的语句
}
构造函数要注意的细节:
1、 构造方法无返回值类型。
2、 构造方法名与类名完全一致。
3、 类中未显式地码上构造方法代码,编译器编译添加空功能体的构造方法。
4、 类中已显式地码上构造方法代码,编译器不再添加空构造方法。
5、 构造方法可以重载。
6、 构造方法是由JVM调用的。每创建一个对象,JVM调用一次构造方法。
7、 联想:对象优先于构造方法而存在。因为构造方法初始化的是对象中的成员属性。
Q:每创建一个对象,java虚拟机就会调用对应的构造方法一次。我们之前还没有学构造方法,那么java虚拟机还会调用构造方法吗?
A: 会。JVM调用编译器编译添加的空构造方法。
反编译:JDK给我们提供了一个javap的工具 让我们反编译的。
javap用法:
javap -l -p -c class文件
java编译器添加的无参构造方法的修饰符是什么?
需求:无论是黑户还是白户出生都要哭。
构造函数的作用:给对应的对象初始化。
构造代码块:给所有的对象统一初始化。
构造代码块的书写格式:
{
初始化工作
}
注意:构造代码块的代码是在创建所属的类的对象时候调用,每创建一次对象,都会调用一次构造代码块的代码。
代码块的类别:
1.构造代码块: 大括号是位于成员位置上(大括号是 位于方法之外,类之类)
2. 局部代码块: 局部代码块就是在一个函数中定义的代码块。
3. 静态代码块 : 在成员位置上定义代码块,而代码块使用了static修饰。随着类的加载而执行,优先于主函数加载,只执行一次,作用是给类进行初始化。
局部代码块的作用:缩短局部变量的生命周期。
l 构造代码块要注意的细节:
1.构造函数的赋值动作是最后执行的,是位于成员变量的显式初始化、与构造代码块之后执行。
2.一编译的时候,声明变量的语句会被java编译器放到最前面。
3.成员变量的显式初始化动作与构造代码块的代码实际上是在构造函数中执行的,构造代码块的代码是会优先于构造函数执行的。
4.成员变量的显式初始化与构造代码块的代码执行的先后顺序是按照当前的代码顺序执行的。
需求:使用java类描述一个老鼠。
如果存在着同名的成员变量与局部变量时,那么在方法内部访问的是局部变量的数据,java采取 "就近原则"机制访问。
this关键字:
this关键字代表的是所属函数的调用者对象。
this关键字的作用:
1. 类中存在同名的成员变量和局部变量时,”就近原则”方法内部默认访问局部变量,可以通过this关键字访问成员变量。
2. 构造函数调用其他重载的构造函数,需要用this关键字。
this关键字调用其他的构造函数要注意的细节:
1. this关键字调用其他的构造函数的时候this关键字必须位于构造函数中的第一个语句。
2. 使用this关键字调用构造函数的时候不能出现相互调用。因为是一个死循环来的。
需求:使用java类描述华师学生 ,长大的学生都是中国人。
问题:每个学生的国籍都是中国,那么有1w个学生就在内存中有1w个中国,这样子浪费内存。
解决方案: 把country这个属性的数据共享出来,把country移入到数据共享区中共享即可,所有对象都是使用同一个country。
如何才能把country移入到数据共享区中呢?
解决方案: 使用static修饰成员变量即可。被修饰的成员变量数据就会位于数据共享区中。
static(静态) 修饰符:
static修饰成员变量:static修饰的成员变量的数据就是共享的数据。
static修饰的成员变量(静态的成员变量)的访问方式:
方式1:可以使用对象访问。
对象.属性名
方式2: 可以使用类名访问。
类名.属性名。
注意:
1.非静态的成员变量只能使用对象进行访问,不能使用类名直接访问。
2.千万不要为了方便访问数据而使用static修饰,只有数据真正是需要被共享的时候才使用static修饰。
推荐使用:类名直接访问。
static修饰函数:
静态函数的访问方式:
访问方式1:使用对象访问。
对象.函数名()
访问方式2:使用类名访问
类名.函数名();
静态函数要注意的细节:
1.静态函数可以使用对象或者类名调用,但是非静态函数只能使用对象进行调用。
2.静态函数不能出现this与super关键字。
原因:静态函数是可以使用类名直接调用的,而this关键字代表的是所属函数的调用者对象,这时候可能还没有对象的存在。
3.静态函数可以直接访问静态的成员(成员变量、成员函数),但是不能直接访问非静态的成员。
原因:非静态的成员变量是随着 对象的创建而存在的,静态函数是可以使用类名直接调用的,这时候可能还没有对象存在。
4.非静态的函数是可以直接访问静态、非静态的成员的。
原因: 非静态函数是需要对象调用的,对象存在的时候静态 数据以及非静态数据都已经存在了,所以可以。
什么时候使用static去修饰一个函数呢?
如果一个函数没有直接访到非静态的成员,那么即可使用static修饰。常见的应用在:工具类的方法。
疑惑:静态的函数不能访问非静态的成员?
错误,只要静态函数中存在着的对应的对象那么即可访问。
非静态成员变量与静态的成员变量的区别:
l 作用上的区别:
1.非静态成员变量的作用:描述一类事物的属性。
2.静态的成员变量作用:提供了一个共享的数据给所有对象使用。
l 数量上的区别:
1.非静态的成员变量是随着对象的创建而 存在的,有 多少个对象就有多少份非静态的成员变量数据。
2.静态的成员变量数据在内存中仅有一份。是所有对象共享的数据。
l 生命周期的区别:
1.非静态的成员变量是随着对象的创建而存在,随着对象的消失而消失。
2.静态的成员变量数据是随着类文件的加载而存在,随着类文件的消失而消失。。
主函数是由java虚拟机调用的,其实java虚拟机就是一个程序。
main方法详解:
public: 公共的。 保证java虚拟机的程序 在任何情况都对main方法可见。
static: 静态。
void: 没有返回值。
main: 函数名,main只不过是jvm所识别的一个特殊的方法名而已。
args: 形参... 是考虑到了有些软件在一运行 的时候就需要输入一些配置信息。
没有static引发的问题:
1.java虚拟机就需要创建对象调用main方法了。
2.java虚拟机不知道怎么创建对象! 担心创建对象的时候要传入参数,java虚拟机不知道传入什么参数好。
3.java虚拟机假如能够创建对象调用,对象调用main完毕之后,那么该对象就没用了。这时候浪费空间。
单例模式:保证一个类在内存中只有一个对象。
模式:解决一类问题的固定步骤就称作为模式。设计模式的概念最先是来自于建筑行业。
每次解决该房子这个问题的时候步骤都是固定:
打地基----->浇柱子------->楼顶------->砌墙------->封顶--------->装修
23种设计模式。
单例设计模式
模板设计模式
装饰者设计模式
观察者设计模式
工厂设计模式
单例设计模式的步骤:
l 饿汉单例模式:
1. 私有化构造函数。
2. 在本类中new一个本类对象,声明私有静态的变量指向。
3. 提供一个公共静态的方式获取本类对象。
l 懒汉单例设计模式:
1.私有化构造函数。
2.声明本类的引用类型变量,但是不创建本类的对象。
3.提供一个公共静态的方法获取本类的对象,获取对象之前先判断是否已经创建了该类的对象
如果没有创建,那么创建该类的对象并返回,如果已经创建了该类的对象,那么就直接返回即可。
推荐使用 : 饿汉式。
因为懒汉式有可能出现线程安全问题,这是时候就无法保证该类在内存中只有一个对象了。
//懒汉式
class Single2{
//声明本类的引用类型变量,但是不创建本类的对象。
privatestatic Single2 s;
//私有化构造函数
privateSingle2(){}
//
publicstatic Single2 getInstance(){
if(s==null){
//没有创建就先创建本类对象
s= new Single2();
}
returns;
}}
//饿汉式
class Single{
//声明本类的引用类型变量指向本类的对象。
private static Singles = new Single();
//第一步:私有化构造函数
privateSingle(){}
//提供有一个公共静态的方法获取本类的对象
publicstatic Single getInstance(){
returns;
}}
classDemo10 {
public static void main(String[] args){
Single2 s1 =Single2.getInstance();
Single2 s2 =Single2.getInstance();
System.out.println("两个对象是同一个吗?"+ (s1==s2));
}}