面向对象
- 一、面向对象基本概念
-
- 一、什么是面向对象:
-
-
-
- 1.介绍:
- 2.三大思想:
- 3.三大特征:
-
-
- 二、建立面向对象思维方式:
- 三、如何学习面向对象
- 二、类与对象
-
- 1、什么是类?
- 2、类与对象的关系
- 3、类和对象的定义格式
- 4、属性与方法
- 5、对象的定义和使用
- 6、对象内存说明
- 三、封装性
-
-
-
- 一、 封装性的概念
- 二、封装的好处
- 三、成员变量和局部变量
-
-
- 四、构造方法
- 五、this关键字
- 六、static关键字
- 七、代码块
- 八、单例设计模式
一、面向对象基本概念
一、什么是面向对象:
1.介绍:
1、面向对象是一种编程思想
2、面向对象是一种思考问题的思维方式
2.三大思想:
面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP
OOA:面向对象分析(O`ject Oriented Analysis)
OOD:面向对象设计(ObjectOriented Design)
OOP:面向对象程序(Object Oriented Programing)
3.三大特征:
封装性:所有的内容对外部不可见=
继承性:将其他所有功能继承下来继续发展
多态性:方法的重载本身就是一个多态性的体现
二、建立面向对象思维方式:
1、先整体、再局部
2、先抽象、再具体
3、能做什么、再怎么做
三、如何学习面向对象
1、掌握一门面向对象语言的语法
2、熟悉面向对象的设计原则
3、熟悉面向对象设计模式
面向过程:以步骤为单位、一步步完成具体事情
面向对象:以对象为单位,通过调度组合不同的对象来完成具体事情
二、类与对象
1、什么是类?
1、类是:分类、类别。
2、通过分类、我们可以区分不同的事物种类。
3、类具有一种相同特性(属性)与行为(方法)的事物集合。
2、类与对象的关系
1、类表示一个共性的产物:是一个综合的特性,而对象是一个个性的产物,是一个个体的特征。
2、类由属性和方法组成:
属性:就相当于一个个特征。
方法:就相当于人的一个个的行为,例如:吃饭、唱歌、睡觉。
3、类和对象的定义格式
在Java语句中可以使用以下语句定义一个类:
class类名称{
成员属性
成员方法
}
4、属性与方法
属性定义格式:
数据类型 属性名;
属性定义并赋值的格式:
数据类型 属性名 = 初始化值;
方法定义格式:
权限修饰符 返回值类型 方法名(形式参数列表){
//方法体
return 返回值;
}
5、对象的定义和使用
一个类要想真正的进行操作,则必须依靠对象,对象的定义格式如下:
类名称 对象名称 =new 类名称();
按照以上的格式就可以产生对象了
如果要想访问类中的属性或方法(方法的定义)则可以依靠以下的语法形式:
访问类中的属性:
对象 属性;
调用类中的方法:
对象 方法;
在Java中对象声明有两种含义
声明对象:Person person=null;
表示声明了一个对象,但是此对象无法使用,person没有具体的内存指向。
实例化对象:person=new Person
表示实例化了对象可以使用
通过对象调用方法: person.eat()
匿名对象调用方法: new Person().eat()
6、对象内存说明
1、new关键字表示创建一个对象
2、new关键字表示实例化一个对象
3、new关键字表示申请内存空间
注意:如果使用一个没有申请内存空间的对象,会报空指针异常
java.lang.NuIPpinterException
这里只作文字说明,可以自己网上搜索图解更好理解
(1)new关键字:表示向内存申请空间,也表示实例化一个对象,创建一个对象。
(2)一个对象在内存中的大小,由该对象的所有属性所占的内存大小的总和。引用类型变量在32位系统上占4个字节,在64位系统上占8个字节,加上而外的对象隐性数据所占的大小。
(3)相同的类型才可以赋值、字符串是引用类型变量、不是基本数据类型变量。
(4)不同的引用,指向同一个对象,任何一个引用改变对象的值,其它引用都会反映出来。
(5)编程时要注意的问题,在确定不使用对象时,要尽早释放对象:引用=null
(6)当一个堆中的对象没有被任何一个引用变量所指向时,该对象会被JVM的GC认为是垃圾对象,从而被回收。
三、封装性
一、 封装性的概念
1、封装性是面向对象思想的三大特征之一。
2、封装就是隐藏实现细节,仅对外提供访问接口。
封装有:属性的封装、方法的封装、类的封装、模块化封装、系统级封装…
二、封装的好处
1、模块化
2、信息隐藏
3、代码重用
4、插件化易于调试
5、具有安全性
封装缺点:
会影响执行效率
如果属性没有封装、那么在本类之外创建对象后,可以直接访问属性
private关键字:访问权限修饰符,public表示公有的,private表示私有的,私有的属性或方法 ,只能在本类中访问,公有的属性和方法,可以被类外部其它类访问,想要在类外部访问私有属性,我们需要提供公有的方法来间接访问。
通常一个类中,属性都私有化,并对外提供getter and setter方法。
三、成员变量和局部变量
1、在类中的位置不同
成员变量:在类中的定义
局部变量:在方法中定义或者方法的参数
2、在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
3、生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4、初始化值不同
成员变量:有默认初始化值,引用类型默认null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意:局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
四、构造方法
什么是构造方法?
1、构造方法就是类构造对象时调用的方法,用于对象的初始化工作
2、构造方法是实例化一个类的对象时、也就是new的时候,最先调用的方法
构造方法的定义:
构造方法是在类中定义的,构造方法的格式:方法名称与类名称相同,无返回值类型的声明。
对象的实例化语法:
Dog dog = new Dog();
new Dog 后面有个括号,带括号表示调用了方法,此时调用的方法就是构造方法。
构造方法的重载
无参构造方法:
public Dog(){}
带一个参数的构造方法:
public Dog(String name){
this.name = name;
}
带多个参数的构造方法:
public Dog(String name,int age){
this.name = name;
this.age = age;
}
(1)构造方法名称与类名称相同,没有返回值声明(包括void)
(2)构造方法用于初始化数据(属性)
(3)每一个类中都会有一个默认的无参构造方法
(4)如果类中有显示的构造方法,那么默认构造方法将会无效
(5)如果有显示的构造方法,还想保留默认构造方法,需要显示的写出来
(6)构造方法可以有多个但参数不一样,称之为构造方法重载
(7)在构造方法中调用另一个构造方法,使用this(…),该句代码必须在第一句
(8)构造方法之间的调用,必须要有出口
(9)给对象初始化数据可以使用构造方法setter方法,通常情况下两者都会保留
(10)一个好的编程习惯是保留默认构造方法(为了方便一些框架代码使用反射来创建对象)
(11)private Dog(){},构造方法私有化,当我们的需求是为了保证该类只有一个对象时。什么时候一个类只需要一个对象?比如,工具类(没有属性的类,只有行为)并且该对象被频繁使用,权衡只有一个对象与产生多个对象的内存使用,来确定该类是否要定义为只需要一个对象。
五、this关键字
在Java基础中,this关键字是一个最重要的概念,使用this关键字可以完成以下操作:
调用类中的属性
调用类中的方法和构造方法
表示当前对象this.类名来表示当前对象
在方法使用this调用类中的其它方法或属性,this可以省略,this前面可以使用当前的类名.this
六、static关键字
static关键字的作用:
1、使用static关键字修饰一个属性
声明为static的变量实质上就是全局变量。
2、使用static关键字修饰一个方法
通常、在一个类中定义一个方法static,那就是说,无需本类的对象即可调用此方法。
3、使用static关键字修饰一个类(内部类)
(1)静态变量或方法不属于对象、依赖类。
(2)静态变量是全局变量、生命周期从类被加载后一直到程序结束。
(3)静态变量只有存一份、在静态方法区中存储。
(4)静态变量是本类所有对象共享一份静态变量(全局变量)。
(5)建议不要使用对象名去调用静态数据,直接使用类名调用。
(6)static修饰一个方法,那么该方法属于类、不属于对象,直接用类名调用。
(7)静态方法不能访问非静态属性和方法、只能访问静态。
七、代码块
1、普通代码块,在方法中写的代码块。
直接写在方法中的代码块就是普通代码块
public class Demo1{
public static void main(String [ ] arge){
//普通代码块
String info="局部变量-1";
System.out.println(info);
}
String info = "局部变量-2";
System.out.println(info);
}
}
2、构造块,在类中定义的代码块,在创建对象时被调用,优于构造方法执行。
class Demo{
{ //构造块
System.out.println("构造块");
}
public Demo{
System.out.println("构造方法");
}
}
3、在类中使用static声明的代码块称为静态代码块、在第一使用时被调用(创建对象)只会执行一次,优于构造块执行。在项目开发中,通常会使用静态代码块来初始化只调用一次数据
class Demo{
{
System.out.println("构造快");
}
static{
System.out.println("静态代码块");
}
public Demo{
System.out.println("构造方法");
}
}
重点使用顺序:静态代码块,普通代码块,同步代码块,构造代码块。
八、单例设计模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1、构造方法私有化
2、声明一个本类对象
3、给外部提供一个静态方法获取对象实例
两种实现方式:
1、饿汉式:在类被加载后,对象被创建,到程序结束后被释放。
(占用内存时间长,提高效率)
2、懒汉式,在第一次调用getInstance方法时,对象被创建,到程序结束后被释放。
(占用时间短,效率低(懒加载,延迟加载),在多线程访问时会有安全问题)
在项目中为什么要使用单例,单例有什么好处?
1、在设计一些工具类的时候(通常工具类、只有功能方法,没有属性)。
2、工具类可能被频繁调用(目的是为了节省重复创建对象所带来的内存消耗,从而来提高效率)。