java面向对象学不会?看完这篇文章就会了
众所周知java是面向对象的编程语言,那么什么是面向对象呢,大家经常把面向对象和面向过程混淆,下面就说个例子,一秒就会!
例如小明有一些脏衣服需要去洗干净,这是就相当于一个命令把衣服洗干净
A:面向过程:小明需要自己独立完成,打水、放洗衣液、搓衣服等等一些列操作直至衣服洗干净
B:面向对象:小明不需要自己独立完成,但是他需要把衣服送到具有洗衣服功能的地方,例如洗衣房,你需要办一张会员卡,然后对工作人员说:我不管你用什么办法,总之给我洗干净就行
首先需要一个类,这里面不写main方法,这里面会有三部分组成
A:类变量B:类方法C:构造函数
假如现在有一个学生类
A:类变量,又称作成员变量,它是用来描述这个类的属性,、一个学生肯定有姓名、学号、年龄、性别等一些列属性!所以这些成为成员变量
B:类方法:类方法就是这个类他有什么功能,他能干一些什么,例如一个学生他能算数、考试、吃饭等一系列技能
C:构造函数:构造函数就是给这个类找个实体,现在只知道这是一个学生类,这个学生类具体是谁啊,目前不知道,现在就需要一个构造函数来完成定义一个实体,注意构造函数他主要有两种,一种是无参构造另一种有参构造构造函数可以有多个或者一个没有,接下来就说一下这两个的区别
无参构造:无参构造来定义一个实体时,只是指明有一个学生,但是学生的信息没有说!当在学生类中没有写构造函数,java会自动为这个类提供一个无参构造,用于创建对象(实体)
有参构造:有参构造定义的一个学生,他还指定了一个这个学生的一些信息,比如这个学生叫什么,今年多大了,下面通过代码来说明一下描述
学生类:
测试类:
因为在学生类中我们没有写main函数,没有办法运行,需要写一个测试类
注意:一个类中可以没有构造函数,也可以有多个构造函数
方法的重载这个也比较重要,方法重载指的是在一个类中两个方法方法的名字相同,但传递的参数不同,代码如下
当一个类中的成员变量与方法的形参重名里,在方法中要使用成员变量的值需要用this.成员变量
静态是比较常用的一个关键字,静态经常修饰变量,方法,静态代码块
用static修饰的有两个特性A:静态B:共享
B:共享:用static修饰的变量和方法,表示他不是一个对象独有的,他是所有对象公用的,用static修饰的变量和方法,不需要创建对象就可以直接类名.方法名/变量名即可调用
静态代码块是类加载便执行的部分,他是第一个执行的,但是他只执行一次,当再次访问这个类时,static代码块不会执行,接下来说明一下静态代码块、构造函数,构造代码块执行顺序
所以执行顺序静态代码块>构造代码块>构造函数
还有继承,这是java的特点之一,下次更新
为了让大家更快速高效的学习,我整理了一份 Java 全能资料包含(高可用、高并发、高性能及分布式、 Jvm 性能调优、 Spring 源码, MyBatis , Netty , Redis , Kafka , Mysql , Zookeeper , Tomcat , Docker , Dubbo , Nginx ,架构,面试等等…)
Java基础之面向对象详解
#####################################
- 基本概念
- 类与对象
- 构造方法及其重载
- static修饰符
- 封装
- 继承
- 抽象
- final修饰符
- 多态
- instanceof运算符
- this指针#####################################
面向对象可以说是采用现实模拟的方式来设计和开发程序。比如:1岁的鹦鹉正再说话。那么面向对象的理解就是:需要一只鹦鹉,它具有健康的属性,说话的行为,它现在在说话。程序代码如下:
可以很简单就和面向过程区分开,我举例:举办一场魔术表演面向过程:主持人宣布开始—演员小明表演—结束表演面向对象:我们先分析表演需要什么类?主持人,魔术师,道具等等。分析每个类的行为,主持人讲话,过场;魔术师变魔术;不同的道具也具有不同的作用(可以看作行为)。
显而易见,面向过程的中心是功能。而面向对象技术利用面向对象的思想描述世界,每个对象都拥有自己的属性和行为。我们创建对象,调用对象的行为(方法)。面向对象的过程就是抽象的过程,。把现实生活中的物,抽象成软件程序中的“对象”。
类是对某一类事物的描述,可以说是一个模板,拥有属性和行为。类是抽象的,概念上的定义。对象是实际存在的,具体的事物个体。比如创建一个类:人;根据这个人的类创建出小明这个对象。
构造方法的名称和它的类名相同,没有返回值。
构造方法在我们创建对象时执行,执行一些初始化操作,比如给属性赋值。
那如果这个类我看不到构造方法,是怎么回事?
看不到,不是没有,而是藏起来了。我们称它为隐式构造方法。
当我们构建一个类,没有写构造方法时,系统会提供一个空的构造方法(隐式构造方法)。
执行结果:
我们可以通过带参构造方法解决这个问题。
在一个类中,方法名相同,参数列表(方法的参数个数或参数类型)不同,我们称为重载。重载和方法访问修饰符,以及返回值无关。我们 可以通过构造方法的重载来实现多种初始化行为,在创建对象时可以根据需要选择合适的构造方法。
如果我们此时将无参构造注释掉,只留下有参构造。在YingWu yingWu1=new YingWu();处会编译报错。告诉你是new YingWu()因为该构造未定义。
之前不是说有个隐式的构造吗?是这样的,java在构建类时,我们没有写上构造方法,系统会给我们提供一个隐式无参构造。但是当我们显式地写了自定义的构造方法,系统就不会给我们提供隐式无参构造。想要,自己写一个。
static可以用来修饰属性,方法和代码块。static修饰的变量属于这个类所有。即由这个类创建的所有对象共同用一个static变量。通常把static修饰的属性和方法称为类属性和类方法。不使用static修饰的属性和方法属于单个对象,通常称为实例属性和实例方法。
可以看下static的执行顺序,如下:
得出结论:在类加载的过程中,先分配好静态变量,再执行静态代码块,这些都是在创建对象之前执行的。类属性和类方法可以通过类名和对象名访问,实例属性和实例方法只能通过对象名访问。类方法只能访问类属性和其他类方法。实际上,static变量和方法的主要用途就是在没有创建对象的前提下,仅通过类本身调用;在类加载时候初始化,常驻在内存中,调用快捷方便。
封装 继承 多态
封装就是将类中的属性声明为私有的,同时提供公有的方法实现对该成员的存取操作。好处是,隐藏了类的实现细节 (对外提供接口,外面不能随意获取该类中隐私数据),让使用者只能通过规定的方式获取数据(通过getter获取数据),保证数据的安全性。
Java只支持单继承(一个类只能有一个直接的父类)。当然,java类的根父类是java.lang.Object。类的修饰符如果是public,代表该类在整个项目下可见。若没有修饰符,代表该类只能在当前包下可见。不可以使用private和protected修饰类。
子类可以重写父类的方法,重写需满足以下要求:
重写方法和被重写方法的方法名必须一致。重写方法和被重写方法的参数列表必须一致。重写方法的返回值类型必须和被重写方法的返回值类型一致或是其子类。重写方法的访问修饰符不能严于被重写方法的访问修饰符。
继承条件下构造方法的调用规则如下:
子类构造方法如果没有通过super显示调用父类的有参构造函数,并且没有通过this显示调用该类其它的构造方法,会默认先调用父类的无参构造函数。在构造方法中,this语句和super语句只能放在第一条。一个构造方法内,不能同时出现this和super语句。静态方法(类方法)不允许出现this,super关键字。(静态方法和对象无关,类即可调用 )
有时候,有些父类我们不会去实例对象,这个类存在的意义只是为了提供一个模板,供子类使用。这时,我们可以使用Java中的抽象类来实现,用abstract来修饰。抽象类不能实例化。
抽象类提供的方法,如何让子类强制重写呢?
用abstract关键字修饰抽象类的方法可以实现,我们称为抽象方法。要注意,抽象类中,抽象方法没有方法体(大括号)。非抽象类不能有抽象方法。
抽象类有构造方法。构造方法不能被继承。
如果想让一个类不被其它类继承,就为这个类加上final。如果想让一个方法不被子类重写,就为这个方法加上final。如果想让一个属性的值不允许改变,就为这个属性加上final。
1.abstract的作用说白了就是让子类继承的,让方法重写的,加个private,子类都访问不到了。2.static的作用就是直接让类访问方法和属性,abstract只能用于修饰类和方法,作用是让子类继承和方法重写。abstract修饰的方法没有方法体。如果两者共用,你用类调用一个没有方法体的抽象方法,明显有问题。3.final是最终的意思,可以使类不被继承,方法不被重写,属性不被改变值。abstract修饰的类可以被继承,修饰的方法必须重写。两者矛盾。
当final修饰引用型变量(dog)时,dog变量(对象)无法在指向另外一个对象(重新创建对象),该变量值无法改变。但是引用型变量的属性值是可以改变的。
思考一个问题,用final修饰类,类里的方法可以重写吗?
多态是具有表现多种形态的能力的特征。同一个实现接口,使用不同的实例可以执行不同的操作。解释如下:
使用多态的主要方式:
做法:修改Person类,注释play(Penguin penguin)和play(Dog dog)方法,新增play(Pet pet)方法。
修改之后,如下:
看出,两者输出结果没有区别。区别只是修改后代码量更少了,提高了代码的可扩展性和可维护性。
举例:为Person类添加购买方法,实现购买宠物功能购买方法返回值是Pet我们调用宠物吃的方法,来看下返回值Pet是什么宠物
总结多态三个条件多态以继承为基础。没有继承,就没有多态。子类重写父类的方法,多态情况下会调用子类重写的方法父类引用变量指向子类对象(子类向父类转换,向上转型)
既然有向上转型,那么就有向下转型父类向子类转型可以说是向下转型。
在向下转型时,如果没有转换为正确的子类类型,会报出强制转换异常。可以用instanceof运算符判断,避免异常,提升代码健壮性。
语法:对象 instanceof 类
在java中,this是一个引用当前类的对象的引用变量。一共有6种用法
可以用来引用当前类的实例变量(普通属性,非静态属性)可以用来调用当前类的方法,this可以隐藏不写。this()可以用来调用当前类的构造函数,this()只能在构造函数中第一行写。可以用作方法调用中的参数传递。可以用作构造方法调用中的参数传递。可以用于从方法返回当前实例,如下。
Java基础语法之面向对象程序设计
一、面向对象的三大特征:封装,继承,多态。
(一)封装
什么是封装? 隐藏实现细节,暴露出合适的访问方式。
1、封装的实现步骤
⚫ 一般对成员变量使用private(私有)关键字修饰进行隐藏,private修饰后该成员变量就只能在当前类中访问。
⚫ 提供public修饰的公开的getter、setter方法暴露其取值和赋值。
(二)继承
什么是继承?Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。
1、使用继承的好处
当子类继承父类后,就可以直接使用父类公共的属性和方法了。因此,用好这个技术可以很好的我们提高代码的复用性。
2、格式
public class Student extends People {}
Student称为子类(派生类),People称为父类(基类 或超类)。
3、继承的特点
子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
Java是单继承模式:一个类只能继承一个直接父类。
Java不支持多继承、但是支持多层继承。
Java中所有的类都是Object类的子类。
4、在子类方法中访问成员(成员变量、成员方法)满足:就近原则
1)、先子类局部范围找
2)、然后子类成员范围找
3)、然后父类成员范围找,如果父类范围还没有找到则报错。
(三)多态
同类型的对象,执行同一个行为,会表现出不同的行为特征。
1、多态形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
2、多态中成员访问特点
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
3、多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写。
4、多态的优势
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
二、类、对象概念
类(设计图):是对象共同特征的描述。
对象:是真实存在的具体实例。
三、类的定义
① 格式
public class 类名 {
1、成员变量
2、成员方法
3、构造器
4、代码块
5、内部类
}
② 创建对象
类名 对象名 = new 类名();
③ 访问成员
对象名.成员变量
对象名.方法名()
Ø 注意事项:
l 成员变量的完整定义格式是:
修饰符 数据类型 变量名称 = 初始化值; 一般无需指定初始化值,存在默认值。
l 类名首字母建议大写,且有意义,满足“驼峰模式”。
l 一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
² 实际开发中建议还是一个文件定义一个class类。
四、构造器
(一)构造器的作用
用于初始化一个类的对象,并返回对象的地址。
(二)构造器的定义格式
修饰符 类名(形参列表){
…
}
(三)构造器分类
⚫ 无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值。
⚫ 有参数构造器:在初始化对象的时候,同时可以为对象进行赋值。
² 注意事项:
⚫ 任何类定义出来,默认就自带了无参数构造器,写不写都有。
⚫ 一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写一个无参数构造器了。
五、this关键字
(一)this关键字可以出现在成员方法、构造器中,代表当前对象的地址。
(二)作用:访问当前对象的成员变量、成员方法。
六、super关键字
可以通过super关键字,指定访问父类的成员。
七、标准JavaBean
标准JavaBean须满足如下要求:
⚫ 成员变量使用 private 修饰。
⚫ 提供每一个成员变量对应的 setXxx() / getXxx()。
⚫ 必须提供一个无参构造器。
八、方法重写
什么是方法重写?在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。