在面向对象的概念中, 所有的对象都是通过类来表述的, 但并不是所有的类都是用来描绘对象的, 如果一个类中么有包含足够的信息来描绘一类具体的对象, 这样的类就是抽象类。 抽象类往往用来表征对问题领域进行分析、 设计中得出抽象概念, 是对一系列看上去不同, 但是本质上相同的具体概念的抽象。抽象类对其共通行为提供规范, 但并不实现, 而将其具体实现放到子类中完成, 通过“abstract”关键字描述。

举个栗子:

定义一个平面图形类Shape, 任何平面图形都有周长和面积。

public abstract class Shape {
double dim;
public Shape(double dim){
this.dim = dim;
}
//抽象方法, 获得面积
public abstract void callArea();
//抽象方法, 获得周长
public abstract void callPerimeter();
}

抽象方法:

从语法层面上看, 在java中凡是用到abstract修饰的类都是抽象类。在java中,如果某个方法没有提供方法体实现,这种方法称为抽象方法。包含一个或者多个抽象方法的类叫做抽象类。
抽象类还可以包含具体数据和具体的方法,也可以包括构造方法。定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类。

举个栗子:

定义Shape的一个子类Circle来演示抽象类的使用

 public class Circle extends Shape{
public Circle(double dim) {
super(dim);
}
//实现父类的抽象方法
@Override
public void callArea() {
System.out.println("圆的面积="+3.14*dim*dim);
}
//实现父类的抽象方法
@Override
public void callPerimeter() {
System.out.println("圆的周长="+2*3.14*dim);
}
}

抽象类除了使用abstract关键字定义实现, 还可以通过继承实现, 即该类在继承一个抽象类或者接口的时候, 没有为所有抽象方法提供实现细节或方法主体时, 当前类也是抽象类。

 public abstract class Circle extends Shape{
public Circle(double dim) {
super(dim);
}
//实现父类的抽象方法
@Override
public void callPerimeter() {
System.out.println("圆的周长="+2*3.14*dim);
}
}

接口:

抽象类是从多个类中抽象出来的模板, 如果将这种抽象进行的更彻底, 则可以抽象出一种更特殊的“抽象类”----接口(interface), 接口里不能含有普通的方法, 接口里的方法必须是抽象方法。

和类定义不同, 定义接口不能用class关键字, 而是使用interface关键字, 其语法为:

 [访问修饰符] interface 接口名称[extends 父类接口名表]{
[访问修饰符] final 数据类型 常量名 = 值; //常量声明
[访问修饰符] 返回值类型 方法名(参数列表); //抽象方法

举个栗子:

 public interface Shape {
//面积
double area = 100.0;
//画出自己
void draw();
//得到面积
double getArea();
}
因为所有定义在接口中的常量都默认为public static final , 所有定义在接口中的方法默认为public abstract。 所以可以不用修饰符限定它们。

接口的实现:

多个无关的类可以实现同一个接口;
一个类可实现多个无关的接口;

<modifier> class <name> [extends <superclass>]
[implements<interface>[,<interface>]*]
{
<declarations>*
}

因为Java 是基于单根继承的, 即Java 继承中, 只能继承一个类, 在Java中,可以通过接口来模拟多继承; 
自定义Circle类, 实现Shape接口:

public class Circle implements Shape{
@Override
public void draw() {
System.out.println("draw a circle...");
}
@Override
public double getArea() {
//area = 200.0;//error 常量的值不可被改变
return area;
}
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
System.out.println(shape.getArea());
}
}

接口实现的一些注意事项:
在类的声明部分,用implements关键字声明将要实现那些接口;

  • 接口里的抽象方法访问修饰符都已指定为public,因此,类在实现方法时,必须显示地使用public修饰符,否则,将缩小接口定义方法的访问控制范围。
  • 如果实现某接口的类不是abstract类,则在类的定义部分里必须全部实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一直;
  • 如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法,但其非abstract的子类必须有所有抽象方法的实现的方法体;

Object类

Object类是所有Java类的基类或根类, 所有类的对象(包括数组对象)都继承了Object的方法。

如果在类的声明中未使用extends关键字指明其基类, 则默认基类为Object类。

 public class Animal{
.........
}
等价于:
public class Animal extends Object{
.........
}

Object类常用方法 :

方法 含义
boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”;
String toString() 返回该对象的字符串表示;
int hashCode() 返回该对象的哈希码值;
Object clone() 创建并返回此对象的一个副本;
void finalize() 当垃圾回收器确定不存在对该对象的更多引用
时, 由对象的垃圾回收器调用此方法;

toString 方法:

  • Object类中定义有public String toString()方法,其返回值是String类型,描述当前对象有关的信息;
  • 在进行String与其他类型数据的连接操作时(如:System.out.println(“info”+person)),将自动调用该对象类的toString(()方法;
  • 可以根据需要在用户自定义类型中重写toString()方法;
  • 一个字符串和另外一种类型连接的时候,另外一种类型会自动转换成String类型,然后再和字符串连接;

举个栗子:

 public class TestToString {
public static void main(String[] args) {
Duck d = new Duck(); // 输出的结果:
Duck@e0a386
System.out.println(d);
}
}
如果没有重写toString方法, 那么输出来的默认的字符串内容是”类名+哈希编码”;

重写toString方法例子 :
为了使打印出来的信息能看懂, 那么在Duck类里面把继承下来的toString()方法进行重写:

public class Duck {
//重写object类的toString()方法
@Override
public String toString() {
return "I'm a cool Duck";
}
public static void main(String[] args) {
Duck d = new Duck();
System.out.println(d);
// 输出的结果: I'm a cool Duck
}
}

equals 方法:

判断两个对象是否相等, 是要看两个对象引用是否指向同一个对象,“是”则返回true,“否”则返回false。

Java语言规范要求equals方法具有以下特点:

  • 自反性 对于任何非空引用值,x.equals(x)都应返回true;
  • 对称性 对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true;
  • 传递性 对于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equal(z)应返回true;
  • 一致性 对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改;
  • 对于任何非空引用值,x,x.equals(null)都应返回false;

Object下的equals方法源码:

 public boolean equals(Object obj) {
return (this == obj);
}
通常自定义的对象, 需要重写equals方法, 比较的结果才会为真。

举个栗子 equals :

 public class TestEquals{
public static void main(String args[]){
String s1=new S ring("hello");
String s2=new String("hello");
System.out.println(" 1==c2: "+(s1==s2));//false
System.out.println("s1.equals(s2): "+s1.equals(s2));//true
}
}

equals与“==” :

“==”操作符的作用:
1) 用于基本数据类型的比较;
2) 判断引用是否指向堆内存的同一块地址;
equals的作用:
用于判断两个变量是否是对同一个对象的引用, 即堆中的内容是否相同, 返回值为布尔类型;

举个栗子:

      String s1 = new String("java);
String s2 = new String("java");
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true

同一个对象, “==”和equasl结果相同 :

     String s1 = new String("java");
String s2 = s1;
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true

如果值相同, 对象就相同, 所以“==”和equals结果一样 :

     String s1 = "java";
String s2 = "java";
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true

抽象,接口和Object类的更多相关文章

  1. JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

    /** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...

  2. java第四节 类的继承/抽象/接口/多态性

    /* 类的继承 类的继承可以简化类的定义 java只支持单继承,不允许多重继承 可以有多层继承,即一个类可以继承其一个类的子类,如类B继承了类A,类C又可以继承类B 那么类C也间接继承了类A 子类继承 ...

  3. (1)抽象类 (2)接口 (3)内部类 (4)Object类

    1.抽象类(重点)1.1 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰如: public abstract void cry(); 1.2 ...

  4. 第10章 接口、继承与多态----Object类

    在Java中,所有的类都直接或间接继承了java.lang.Object类.Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类.当创建一个类时,总是在继承,除非某个类已经指定要 ...

  5. Java自学-接口与继承 Object类

    Java中的超类 Object 步骤 1 : Object类是所有类的父类 声明一个类的时候,默认是继承了Object public class Hero extends Object package ...

  6. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  7. C#抽象工厂简单实现类

    曾经参与开发过的的项目,一般都是采用MVC模式进行开发,大概框架图如下: web界面层调用BLL业务层,BLL通过抽象工厂DALFactory动态生成继承了IDAL的数据库操作层实例,以进行对数据库的 ...

  8. Java基础12:深入理解Class类和Object类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

随机推荐

  1. 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互

    实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了.在读取本地html并展示在前台的时候,并不需要在Androidmenifast ...

  2. python3 装饰器初识 NLP第三条

    还是先抄一条NLP假设... 三,有效果比有道理更重要   光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...

  3. pyspider 文档介绍

    一 代码区结构 def on_start(self)是脚本的入口点.单击run仪表板上的按钮时将调用它. self.crawl(url, callback=self.index_page)*是这里最重 ...

  4. nginx 安装、启动、重启、关闭 (linux系统命令行)

    前言: 最近在部署我的hexo静态博客到腾讯云服务器上,用到了很多nginx的知识,在此做下总结: 刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下. 1.卸载 y ...

  5. 新更新kb4493472导致无法正常开机

    昨天陆续接到电话,说是系统更新后电脑不能正常使用,症状基本是开机到欢迎界面就出现各种各样的状况,比如鼠标能动,其他无反应;欢迎界面结束后黑屏,只有鼠标能动:开机后正常,但电脑使用很卡等等状况.因为昨天 ...

  6. C#常见金额优选类型及其三种常用的取整方式

    这两天一直在做一个商城后台的对账方面的工作,忽然发现C#真的有很多值的学习的东西: 一.C#常用的三种取整方式(主要适用于double.decimal.float这一类型的数据): Math.Roun ...

  7. 关于:未能加载文件或程序集“ICSharpCode.SharpZipLib”或它的某一个依赖项异常的解决方案

    问题: 今天项目迁移忽然又个ICSharpCode.SharpZipLib.dll 程序包丢失了,于是我在网上下载一个这样的包,结果程序运行就提示:未能加载文件或程序集“ICSharpCode.Sha ...

  8. Python爬虫10-页面解析数据提取思路方法与简单正则应用

    GitHub代码练习地址:正则1:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac15_RE1.py 正则2:match. ...

  9. 【自然语言处理篇】--以NLTK为基础讲解自然语⾔处理的原理和基础知识

    一.前述 Python上著名的⾃然语⾔处理库⾃带语料库,词性分类库⾃带分类,分词,等等功能强⼤的社区⽀持,还有N多的简单版wrapper. 二.文本预处理 1.安装nltk pip install - ...

  10. colly源码学习

    colly源码学习 colly是一个golang写的网络爬虫.它使用起来非常顺手.看了一下它的源码,质量也是非常好的.本文就阅读一下它的源码. 使用示例 func main() { c := coll ...