7、java中的面向对象思想和体现

       java是一种面向对象的程序设计语言,在程序中使用对象来描述具体的事物,当多个事物具有共同的特点时,可以将事物的共同特点进行抽象,然后封装成一个包含事物共同特点的集合,在java中叫做封装成一个类,可以将面向对象的主要特点是(抽象)封装、继承和多态。

封装

       所谓抽象,就是将一些具体的事物之间存在的共同之处抽取出来,然后形象化的描述,在java中抽象的过程就是将事物共同的静态属性和动态属性封装成类的过程,事物的静态属性可以抽象成变量,动态属性则可以封装成一个方法(函数),封装是面向对象的核心思想,封装指的的是将对象的属性和动作进行封装,对外隐藏本身的实现细节。例如:狗、猫,可以找他们之间的共同点,都有颜色这一属性,则可以封装一个颜色属性到类中;再者他们都要吃饭,则可以封装一个吃饭的方法到类中,不管是狗还是猫,我们只需要知道他们能吃饭就可以了,并不需要具体了解他们吃饭的具体步骤,这就是对外开放但是隐藏本身的实现细节。

 类、方法、变量

        定义类、变量和方法时都会用到权限修饰符:public、protected、default、private,被public修饰的变量和方法可以随便访问;被protected、private修饰的变量和方法只能在当前类中使用。

        类中可以包含变量和方法,具体的实现代码必须要写在具体的方法中,变量又分为局部变量和成员变量,方法中声明的变量就是局部变量,类里边、方法外边声明的变量就是成员变量,变量的定义包含以下部分:修饰符、变量类型、变量名 ,代码如下:


public class Dog{//变量的声明//private 私有修饰符//int 变量类型//color 变量名private int color;}

方法的定义包含以下部分:修饰符、返回值类型(构造方法除外)、方法名、方法体。类中的方法根据功能划分可分为两类,一类时构造方法、另一类是普通的方法,构造方法用来构造当前类的对象,初始化对象的属性,而普通的方法就是根据对象动态属性抽象过来的方法。代码如下:

public class Animal {public String color;/*** 构造方法,没有返回值,方法名和类名相同,可用于初始化类中封装的变量*/public Animal(String color) {//this.color中的color指的是当前类中的变量//第二个color是局部变量color的值//this关键字可用于表示当前类this.color = color;}/*** 普通方法,int是返回值类型,eat是方法名 */public int eat() {//局部变量int flag = 0;System.out.println("Animal在吃饭。。。");return flag;//返回值}}

定义方法时可以调用其他的方法,方法可以被重载,一个类中不可以定义完全相同的两个方法,但是可以定义两个方法名相同但是参数列表不同的方法,这两个方法的关系就是重载,代码如下:

public class Animal {/** 两个方法的方法名相同参数列表不同则两个方法重载,和返回值无关,方法可以重载多个*/public void eat() {}public int eat(int flag) {return flag;}public void eat(String flag) {}
}

每一个类就相当于一个模板,可以根据这个模板创造出具体的对象,在java中使用new关键字来创建对象,使用 “.” 来调用类中公开的方法和变量代码如下:

class Animal {public int flag;public void eat() {System.out.println("正在吃饭");}}public class Test {public static void main(String[] args) {Animal animal = new Animal();//创建对象animal.eat();//调用方法}}

继承、抽象类、接口

       当一个类被封装后,一般不鼓励二次封装,一般当类的功能不足以支持当前需求时,我们会考虑对此类进行扩展,java中可以使用继承来实现这一想法。例如这里有类A,类中有一个计算四边形周长的方法,但是现在想计算正方形的周长,虽然计算四边形周长的方法可以用于计算正方形,但是想实现的简单点,就可以再封装一个类B,然后B继承类A,在java中用关键字extends来表示继承,B extends A,这就叫做类B继承自类A,A是B的父类,B是类A的子类,然后可以在B中重新声明一个方法用来计算正方形的周长。子类可以使用父类所有公开的属性和方法,每一个类只能继承一个父类(例如:在血缘关系上,一个儿子只有一个父亲),所以java中是单继承。再如上边的计算四边形的方法,如果在子类中声明一个方法,此方法与父类中的方法完全相同,这就是方法的重写。代码如下:

public class Animal {public int flag;public void eat() {//这里已经声明了eat方法System.out.println("正在吃饭");}}-----------------------------------------------------------------------------------//Dog类继承了Animal类,拥有了Animal类的公开的功能
public class Dog extends Animal{@Override//这个注解的意思是重写方法public void eat() {//重写父类方法System.out.println("Dog在吃饭。。。");}
}

         在写代码的过程中,声明了一个方法,但是不知如何实现,这时可以将方法体删掉,然后使用修饰符abstract 来修饰这个方法,这个方法就叫做抽象方法,如果一个类中存在抽象方法,那么这个类必须使用abstract修饰,以将此类标记成抽象类,如果一个类中的所有方法都是抽象的,那么这个类就可以声明成一个接口,使用interface 来声明接口。抽象类和接口都不可以实例化(就是指不可以使用new关键字来创建对象)。抽象类可以被继承,如果子类声明的不是抽象类,那么就必须重写继承的抽象父类中的所有抽象方法。接口可以被实现,使用implements 关键字进行接口的实现,实现接口的类如果不声明成抽象类,就必须重写实现接口中所有的方法,一个类不可以继承多个类,但是可以实现多个接口,这样就解决的java单继承的尴尬。代码如下:

//声明接口 interface
public interface Animal {//声明一个方法public abstract void run();}//声明接口 interface
interface Animal2 {//声明一个方法public abstract void eat();}------------------------------------------------------------------------------//实现Animal,Animal2接口,重写接口中的方法,如果多个接口,则每一个接口中的方法都要实现
public class Dog implements Animal ,Animal2{@Overridepublic void eat() {System.out.println("dog eat ...");}@Overridepublic void run() {// TODO Auto-generated method stub}}

static、final

         static关键字意为静态的意思,static可以修饰变量、方法、代码块,只需要记住一点:被static修饰的属性和方法是所有根据当前类创建的对象所共享的,一个对象做出修改,其他对象就会修改,在内存中只有一份。

         final关键字意为最终之意,final可用来修饰类、方法、变量,被修饰的类不可被继承、被修饰的方法不能重写、被修饰的变量不能重新赋值。秩序记住一点,只要被final修饰,什么东西就都不能改了,保持最终的状态。

多态

         最后说一下多态的理解,所谓多态就是多种状态,统一类的不同对象所表现的不同的状态,就是父类(接口)的引用指向子类(实现类)的对象,实现多态有以下几中方式 :继承类、实现接口。例如封装一个动物类,类中有动物的颜色这一变量、动物吃饭方法,然后分别封装狗类和猫类,然后狗类和猫类都继承动物类,这时我声明一个动物类的变量,然后创建对象的时候,将此变量指向一个狗的对象,以为狗属于动物(狗类继承自动物类),这时动物就表现出了多态性,创建谁的对象,这个动物就会表现出谁的状态。代码实现如下:

public class Animal {public String color;public void eat() {System.out.println("Animal在吃饭。。。");}}-------------------------------------------------------------------------------------public class Dog extends Animal{@Overridepublic void eat() {System.out.println("Dog在吃饭。。。");}
}class Cat extends Animal{@Overridepublic void eat() {System.out.println("Cat在吃饭。。。");}
}-------------------------------------------------------------------------------------public class Test {public static void main(String[] args) {normal();//正常执行,不表现多态poly(); //表现多态}/*** 正常调用* @author chaizepeng**/public static void normal() {Animal animal = new Animal();animal.eat();Dog dog = new Dog();dog.eat();Cat cat = new Cat();cat.eat();}/*** 表现出多态性* @author chaizepeng**/public static void poly() {Animal animalDog = new Dog();animalDog.eat();Animal animalCat = new Cat();animalCat.eat();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj1405-电缆建设【贪心,最小生成树】

正题 题目链接:https://jzoj.net/senior/#main/show/1405 题目大意 两个平行于xxx轴的线上有若干个点,求连接所有点需要多少距离的线。 解题思路 在同一平行线上的相邻的连边,然后在不同的上面的话就离最近的两个,跑最小生成树即可。 code…

动态规划训练21 [FatMouse and Cheese HDU - 1078 ]

FatMouse and Cheese HDU - 1078 这道题需要说一说,定义dp[x][y]表示从点(x,y)出发,每次走不超过k步,所能吃到的最大量。 有点难搞的是,这里递归的顺序不好确定,所以采用自顶向下的记忆化搜索的方式(不用担…

这个拖后腿的“in”

问题之源C# 7.2推出了全新的参数修饰符in,据说是能提升一定的性能,官方MSDN文档描述是:Add the in modifier to pass an argument by reference and declare your design intent to pass arguments by reference to avoid unnecessary copyin…

P4310-绝世好题【位运算,dp】

正题 题目链接:https://www.luogu.org/problem/P4310 题目大意 一个长度为nnn的序列,求一个最长的子序列使得每个数&\&&前一个数不为0。 解题思路 因为是&\&&不为0,所以只要有一位都为1即可。 用fif_ifi​表示以第iii个结尾…

8、java中的内部类

根据类定义时所在的位置不同可以将内部类分为四大类:成员内部类、方法内部类、静态内部类、匿名内部类。 成员内部类 顾名思义成员内部类定义在外部类的成员变量位置,相当于外部类的一个成员。将成员内部类当成当前封装类中的一个成员即可,…

Surging 微服务框架使用入门

前言本文非 Surging 官方教程,只是自己学习的总结。如有哪里不对,还望指正。 我对 surging 的看法我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架上搭建Socket RPC,通过分组轮询的方式调度RPC,经…

动态规划训练22 [Milking Time POJ - 3616 ]

Milking Time POJ - 3616 说实话这道题目非常简单,本质上就是 多段有向图的求最大值问题。稍微变化的地方在于这个的的有向边没有那么明显 ,而是需要自己去寻找 如果任务i到任务j之间存在有向边的话,那么一定有这个关系成立,即&a…

jzoj3888-正确答案【字符串hash,dfs】

正题 题目大意:https://jzoj.net/senior/#main/show/3888 题目大意 nnn个人mmm道题,已知道每个人的选项和有ppp个人满分和qqq个人零分,求字典序最小的可能的正确答案。 解题思路 用字符串hashhashhash判断即可。要注意的是如果没有一个人满分也没有一个…

9、java中的异常处理机制

Java中的异常(Throwable)分为两类:异常Execption和错误Error。 Error,也就是错误,这个是不可避免的,出现的问题使得应用停止,例如:服务器损坏、内存溢出等。在java中所有的错误都继承…

RabbitMQ教程C#版 - 工作队列

先决条件本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672)。如果你使用不同的主机、端口或证书,则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难,可以通过邮件列表联系我们。1.工作队列&…

动态规划训练23 [Making the Grade POJ - 3666 ]

Making the Grade POJ - 3666 这道题目有点意思。 我们定义dp[i][j]表示的含义是把包含前i个元素的子序列变成非递减的子序列,并且最后一个元素变成j所需要耗费的最小代价 那么状态转移方程可以写出来就是: dp[i][j] min(dp[i-1][k] abs(num[i] - j…

jzoj3889-序列问题【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/3889 题目大意 一个序列nnn&#xff0c;求两个集合S,T∈[1..n]S,T\in[1..n]S,T∈[1..n]使得ax(x∈S)a_x(x\in S)ax​(x∈S)的xorxorxor和就是ay(y∈T)a_y(y\in T)ay​(y∈T)的andandand和&#xff0c;且x<y(x∈S,y∈T)x…

10、java中文件的抽象表示

java中使用File类来作为文件和目录路径名的抽象表示&#xff0c;是对于文件或者目录本身的属性来说的&#xff0c;而不是针对于文件的内容。 一些关于File类基本操作的代码如下&#xff1a; public class FileTest {/*** 可用于操作文件或者目录* author chaizepeng** param a…

IdentityServer4实战 - 基于角色的权限控制及Claim详解

一.前言大家好&#xff0c;许久没有更新博客了&#xff0c;最近从重庆来到了成都&#xff0c;换了个工作环境&#xff0c;前面都比较忙没有什么时间&#xff0c;这次趁着清明假期有时间&#xff0c;又可以分享一些知识给大家。在QQ群里有许多人都问过IdentityServer4怎么用Role…

动态规划训练24 [Phalanx HDU - 2859 ]

Phalanx HDU - 2859 这是一道非常好的题目&#xff0c;我实在是没想到该怎么做&#xff0c;看了一下大神的题解才恍然大悟&#xff08;还有这种操作&#xff1f;&#xff09; 由于对称矩阵是以对称轴进行对称的&#xff08;废话&#xff09;&#xff0c;所以我们可以用dp[i][j…

jzoj3890-长途旅行【同余最短路】

正题 题目链接:https://jzoj.net/senior/#main/show/3890 题目大意 nnn个点mmm条边的图&#xff0c;询问是否有111到nnn长度为TTT的路径。 解题思路 让WWW等于连接111的最小权值的两倍&#xff0c;然后用fi,jf_{i,j}fi,j​表示到第iii个点是否有权值%Wj\%Wj%Wj。然后用fi,T%W…

11、java中的I/O流(1)

我对于流的理解是这样的&#xff0c;计算机的本质本来就是对输入的数据进行操作&#xff0c;然后将结果输出的一种工具&#xff0c;数据在各个数据源节点之间进行流动&#xff0c;感觉流就是对这种状态的一种抽象&#xff0c;一个数据流表示的就是一系列数据序列&#xff0c;ja…

nssl1436-赛艇表演【最短路】

正题 题目大意 nnn个点mmm条边的无向图&#xff0c;每个点有门票费&#xff0c;对于每个点求一个点使得去那里看完赛艇并回来消耗的时间最小。 解题思路 因为是无向图&#xff0c;所以去和回是同一条路&#xff0c;把每个点作为起点将门票费压入然后跑最短路。 codecodecode …

ASP.NET Core 集成测试

集成测试集成测试&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。实践表明&#xff0c;一些模块虽然能够单独地工作&#xff0c;但并不能保证…

12、java中的I/O流(2)

再介绍一下其他一些流的使用 数据操作流&#xff0c;数据输入流允许应用程序以独立于机器的方式从底层输入流读取原始Java数据类型&#xff0c;意思就是平台无关&#xff0c;相关的两个类DataInputStream、DataOutputStream&#xff0c;使用如下&#xff1a; public class Da…