面向对象
Posted caoxiangwang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。
面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点
首先让我们来了解一下什么是对象?
没错!要了解面向对象我们肯定需要先知道对象到底是什么玩意儿。关于对象的理解很简单,在我们的身边,每一种事物的存在都是一种对象。总结为一句话也就是:对象就是事物存在的实体。下面举个简单的例子,比如人类就是一个对象,然而对象是有属性和方法的,那么身高,体重,年龄,姓名,性别这些是每个人都有的特征可以概括为属性,当然了我们还会思考,学习,这些行为相当于对象的方法。不过,不同的对象有不同的行为
面向对象的特征
封装:就是把属性私有化,提供公共方法访问私有对象。举个简单的例子,我们去Apple店里买个iPhoneX,我们不需要知道它是怎么制造的,我们只需要知道它能用来打电话,上网和用来装B就行了。对于程序设计,用户只需要知道类中某个方法实现了什么样的功能,需要该功能的时候直接去调用就行了,不用去关心方法内部的实现细节
继承:当多个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它类继承这个父类。继承后子 类自动拥有了父类的属性和方法,比如猫,狗,熊猫他们共同的特征都是动物,有颜色,会跑,会叫等特征。我们可以把这些特征抽象成我一个Animal类(也就是父类)。然而他们也有自己独特的特性,比如猫会抓老鼠,喵喵叫,熊猫有黑眼圈,能吃竹子,狗会汪汪。于是我们就根据这些独特的特征分别抽象出来Cat,Dog,Panda类等。他们拥有Animal类的一般属性和方法,也拥有自己特有的某些属性和方法。
但特别注意的是,父类的私有属性(private)和构造方法不能被继承。另外子类可以写自己特有的属性和方法,目 的 是实现功能的扩展,子类也可以复写父类的方法,即方法的重写。子类不能继承父类中访问权限private的成员变量和方法
多态:简单来说就是“一种定义,多种实现”。同一类事物表现出多种形态。Java语言中有方法重载和对象多态两种形式的多态
方法重载:在一个类中,允许多个方法使用同一个名字,但是方法的参数不同,完成的功能也不同
对象多态:子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同
抽象:抽象是从许多事物中,舍弃个表的,非本质的属性,抽取出共同的,本质的属性的过程。例如教师,学生和工人,他们共同的特质是人类,既然是人类就有共同的属性:性别,年龄,身高,体重等。抽象的过程就是比较的过程,通过比较找出事物之间的共同属性,通过比较区分本质。
类与对象的关系
所有的事物都可以看做是一个对象,是对象就具有一定的属性和功能,这些对象是可以建立起联系的,而且这些对象是由类来构造的。类是具有属性和方法的一组对象的集合,对象是实际存在的该类事物的个体
在面向对象中,类和对象是最基本和最重要的组成单元。类实际上是表示一个客观世界某类群体的一些基本特征抽象,对象就表示一个个具体的东西,对象是以类模板创建的。
举个简单的例子:兰博基尼跑车,在工厂里首先要由设计师设计出一个汽车图纸,然后再根据图纸去生产兰博基尼,这样生产出来的每一辆跑车结构和功能都是一样的。但是不同的款式有不同的特征,比如车的颜色,内部装饰,马力等。在这个例子中,设计图纸就是一个类,它规定看跑车应该拥有的基本部件。而根据这张图纸生产出来的每一辆跑车就是一个个实时存在的对象。它们的初始状态是一模一样的,如果其中某一辆颜色,发动机重新改了之后并不影响其他的跑车。
stati修饰符:
static关键字的中文含义是静态的意思。使用static修饰的成员变量,常量,方法和代码分别称为静态变量,静态常量,静态方法,静态代码块,它们统称为静态成员。静态成员归整个类所有,不依赖特定的实例,被类的所有实例所共享的。只要被JVM加载就可以根据类名在全局数据区内找到
类的成员变量分为两种:
实例变量 (ps:也就是没有被static关键字修饰的变量)
静态变量
两者之间的区别:
访问静态变量
public class StaticDemo01
public static int ticket=10; //定义静态变ticket
public void sell() //定义tell()方法
ticket--;
System.out.println("剩余:"+ticket);
public static void left() //定义left()方法
int i=ticket-2;
System.out.println("还剩余:"+i);
public static void main(String[] args)
int x=ticket--; //直接访问ticket
System.out.println("x="+x+",ticket="+ticket);
int y=StaticDemo01.ticket--; //通过类名访问ticket
System.out.println("y="+y+",ticket="+ticket);
StaticDemo01 st1=new StaticDemo01();
int k=st1.ticket--; //通过实例访问
System.out.println("k="+k+",ticket="+ticket);
StaticDemo01 st2=new StaticDemo01();
st2.sell(); //通过非静态方法访问ticket
left(); //通过静态方法访问ticket
静态方法和和静态变量一样,可以不通过本类的实例对象而通过“类名.静态方法名”就可以调用。静态方法不能访问本类的实例变量和实例方法。因为静态资源在编译时(对象未实例化时)就被加载了,而非静态资源在运行时才被加载,多以静态方法只能调用静态变量,不能调用非静态资源!~
实例方法就不一样了,可以访问静态和非静态成员,包括静态变量、静态常量、静态方法,实例变量和实例方法。
变量的作用域
访问控制符
Java语言中,访问修饰符可以出现在类,成员变量,成员方法以及构造方法前,用来控制权限。Java提供了4种级别的访问控制
public 权限最宽 修饰的类,属性,方法不仅可以跨类还可以跨包访问
private 权限最狭隘 修饰的类,属性,方法只能被该类的对象访问,即使是其子类也不能访问! 做的很绝-.-
protected 介于public和private之间 修饰的类,属性,方法能被该类的对象,本包,子类访问(即使没和父类在同一包中)
default 默认访问模式,只向同一个包中的类公开,即同包访问。
代码块
代码块分为普通代码块,构造块,静态代码块
静态代码块主要用于初始化类,为类的静态属性初始化,有以下几个特点:
静态代码块不能存在于任何方法体内
不能直接访问实例变量和实例方法(上面说过了原因)
JVM在加载类时就会执行静态代码块,所以静态代码块优先于主方法执行
class Code
//构造块
System.out.println("Code的构造块");
static //静态代码块
System.out.println("Code的静态代码块");
public Code() //构造方法
System.out.println("Code的构造方法");
public class Codeblock03
//构造块
System.out.println("Codeblock03的构造块");
static //静态代码块
System.out.println("Codeblock03的静态代码块");
public Codeblock03() //构造方法
System.out.println("Codeblock03的构造方法");
public static void main(String[] args)
System.out.println("Codeblock03的主方法");
new Code(); //创建Code对象
new Code(); //创建Code对象
new Codeblock03(); //创建Codeblock03对象
new Codeblock03(); //创建Codeblock03对象
从程序的运行结果我们可以发现,在public类中的静态代码块优先于主方法执行,主方法由于构造块执行,够造块优先于构造方法执行。但是值得我们注意的是,无论创建多少个对象,静态代码块只会执行一次
程序中的执行顺序
public中静态代码块 -->主方法-->构造块-->构造方法
以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章