对Java中对象、类、抽象类、接口的理解

  • Post author:
  • Post category:java

类和对象

一个对象对应一个实体,用代码来描述实体的状态和行为。而如果一切皆对象,那么由什么来决定某一类的对象的外观和行为呢,也就是对象的类型(Type)。也就是说,类是对一类具有相同外观和行为的对象的抽象。

先有对象还是先有类

看似是先有鸡还是先有蛋的哲学问题,其实从现实生活中发现。是先有实体的存在,然后人们将这些实体的外观和行为统一抽象概括。比如说:你我他、小明的存在。我们都被归于人这个类型,因为我们具有相似的外观和行为。

抽象是有层次的

对某一类的对象的抽象程度不同,形成的类在抽象层次树中的位置不同。继上个例子。小明被概括成男人,小红被概括成女人。而小明、小红都可以被概括成人。那么男人、女人、人这三种都是对对象的抽象。可以很明显的看到其中的差异。人这个类型包含的对象的数量是男人、女人所包含的对象的数量的总和(外延)。而对对象说明的力度却小于男人、女人这两个类型(内涵)。那么显然,人这类型是处于更高层次的,是对男人、女人这两个类型进一步抽象,概括相同的外观和行为,形成人这一类型。

抽象类的形成

我们对类进行抽象之后,发现内涵变低了,无法具体的描述对象的行为,比如动物,都有个行为:吃。但是吃什么呢,不清楚。猫吃鱼,狗吃骨头,人啥都吃。所以能在动物这个类中具体的描述行为吗。是不能的。但是我们能在猫、狗、人的类型中具体的描述吃这个行为。

抽象类,是对不同类型的统一特征和行为的进一步抽象。但是无法明确具体地描述这一行为。所以在java中抽象类不是能够直接new 对象的。因为具体的行为都没有,这个对象是不存在的。现实中任何实体,都有明确的特征和行为。

抽象类的构成

从上面分析,我们发现抽象类与普通类相差不多,都是对对象的抽象,只是抽象的层次不一样。所以普通类所能包含的东西,抽象类都能够包含。但是,在java中,抽象类中有些方法不能明确的描述对象的行为,用abstract进行修饰,表示这个是抽象方法,没有方法体,也就是没有具体的描述这个行为。

抽象类和普通类

我们知道,一个类如果能够new一个对象,那么必须能够明确的定义对象的特征和行为。显然抽象类并不具备这个能力,他对部分的行为是不能够明确描述的。所以在java中抽象类是不能够直接new对象的。

因为抽象类是对些类中的共同特征和行为的进一步抽象,所以抽象类的存在并不是和对象关联的,而是给它的子类提供部分特征和行为。同样如果子类是普通类(能够直接创建对象的类),那么必须要实现它的抽象方法(给出明确的行为定义)。所以在java中抽象类是不能使用private修饰类,因为它的存在是要给子类提供一些属性和方法。

接口的意义

上面我都没有提到接口,接口虽然也是对对象或者类的抽象,但是它是独立于抽象层次树的一个概念。

从现实世界的角度来说,各行各业都有他的标准,比如插板,在国内都有个国标。国标一旦定下来,所有生产厂家必须按照这个标准来生产,否则你就是不合格。这就是设计和生产分离之后必须要进行的趋势。

java中的接口也是如此,它就是一个规范,一个标准。设计人员负责制定标准,而开发人员必须在这标准下实现功能(设计人员不管开发人员如何实现)。接口的出现,使得软件开发分工更加明确,开发难度降低。

接口和抽象类

抽象类是固有存在的。是对对象的高度抽象,先有对象,才有抽象类。而接口(标准)是人为设计,是先设计出接口,才能产生对象(实体)。对象在被创造出来之前并不存在。先后顺序不一样。

接口的所有设计都只为软件开发服务,使其开发更快,更合理。抽象类是固有存在的,是用来描述存在的对象的公共特征和行为。两者的概念差异很大。
在java中可能出现,使用抽象类和接口能够实现相同的效果,虽然效果一样,但是本质是不一样的。

对象->类->抽象类是从下往上抽象,接口->类(抽象类)->对象 是从上往下设计。有些人再设计的时候先设计的抽象类然后在创建对象,其实这是接口的设计思想。

接口的构成

java中的接口:只能定义常量,比如制定一个某型号的螺丝的标准,其半径,螺纹数都是固定的。生产必须按照这个标准生产,否则就是不合格。

jdk1.7之前,只能定义public abstract 方法

jdk1.8,可以定义默认方法和静态方法,可以写方法体。因为考虑到之前的实现接口的类已经使用,如果想扩展接口的功能,会导致所有实现该接口的类都要修改,很麻烦。而增加默认方法和静态方法就不会有这样的情况,功能可以增加,也不用修改其实现的类(ps:针对已经使用的接口,对于未使用的接口,使用抽象方法来扩展功能,因为这符合接口出现的初衷)
jdk1.9接口中出现了私有方法。私有方法有个特点,只能在本类中使用,那么为什么接口要定义私有方法呢。这是对jdk1.8出现的静态方法和默认方法的扩充。我们可以把接口中的静态方法和默认方法中重复出现的代码抽取到私有方法中去。这样即不用暴露该方法接口,也可以更好的维护。

———————————————————————————
最近学习了java基础知识,遇到了一系列概念,包括对象,接口,类,方法等!下面对这些概念做个简单的阐述。

类:类是具备某些共同特征的实体的集合,它是一种抽象的概念,比如“汽车”这类事物就是一个类。
//定义一个类(以汽车为例)
class Car
{
String color=“red”;
String bind =“ao di”;
void run()
{
System.out.println(“行驶”);
}
}

对象:对象就是类的实例化,是对事物的抽象描述。就拿人来说,一个人是一个具体的对象对象,是人类这个类的实例化,每个实例化的对象中封装了属性和方法,属性有:(名字,年龄,性别,身高…等)你的方法有:(你能走路,你能说话,等等…)
//创建汽车这类事物的对象
Car c = new Car();
方法:方法可以说是对象具有的某些功能,比如,人可以工作,汽车可以驾驶等等,在汽车类中的方法就是
void run(){
System.out.println(“驾驶”);
}

继承:继承指的是类之间只存在继承关系(extends ) ,比如,汽车是个大类,电动汽车又是一类,同时电动汽车又具有汽车这类事物的共性,如颜色、品牌。。。电动汽车继承了汽车类,同时又具有自己的特性和方法,
class ElecCar extends Car{
void YongDian(){
System.out.println(“太阳能电池板”);
}
}

接口:接口是一系列方法的声明,也可以看做是一系列功能的集合。这也体现了java的封装性,比如定义了一个类,类的属性是私有的,外界不能访问,而外界可以通过公有方法来访问这个类。我们说一个类的公有方法就是这个类的对外接口。只不过是先把这些属性和方法封装起来,我们可以通过接口来访问一些功能。implements
//我们需要创建线程时,可以实现Runnable接口
class Cus implements Runnable{
private Bank b = new Bank();
//实现每个储户存储三次,每次100
public void run(){
for(int x=0;x<3;x++){
b.add(100);
}
}
}

内部类:共性
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
内部类分类:
成员内部类:
方法内部类:
1.方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
2.方法内部类对象不能使用该内部类所在方法的非final局部变量。

匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例 。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、静态方法。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效

静态嵌套类编辑
静态内部类中可以定义静态或者非静态的成员。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。

以上是关于内部类的一些概念,
静态代码块:
一 般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情 况下,
其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
比如main方法就必须是静态的 这是程序入口
两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.
静态方法:
在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:
public static int maximum(int n1,int n2)
使用类的静态方法时,注意:

a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。
(2)静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如:
fun()
{
static int i=0;//非法。
}
(3)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}