业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地!

我将会持续更新java基础知识,欢迎关注。

往期章节:

JAVA基础第一章-初识java

JAVA基础第二章-java三大特性:封装、继承、多态


类与对象

什么是类?

类是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法)。

什么是对象?

对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。

所以总结来说的话,类是对象的模板,对象是类的实例

举个例子:

人类就是一个类(class),你,我,他就是每一个人类的实例。我们每一个个体的最基本的属性有姓名、性别、体重、身高等。

具体的代码表现如下:

 public class Human
{
private String name;
private String sex;
private int weight;
private int heiht; public static void main(String[] args)
{
Human me = new Human();
me.setName("JJ");
me.setSex("man");
me.setHeiht(198); //我的理想身高~0.0
me.setWeight(180); Human he = new Human();
he.setName("name");
he.setSex("man");
he.setHeiht(180);
he.setWeight(150);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public int getHeiht() {
return heiht;
} public void setHeiht(int heiht) {
this.heiht = heiht;
}
}

从上面的代码我们可以看到,在main函数中,我们通过 new 关键字新建了2个对象。一个是me,一个是he,我们都来自Human类,但是我们具有不同的属性,我们除了性别相同,其他的属性完全不同。

这里特别再提到一点就是我们在 new 一个对象的时候后面的 Human() 函数,我们称之为构造函数(方法)。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

每个类都有构造函数。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。所以从上面代码可以看到,我们并没有指定构造函数,而是采用了默认的。

多个构造函数的写法,代码表现如下:

 //每次新建的时候直接先设置性别,那么当前新建的对象就不用再设置性别属性
public Human(String sex)
{
this.sex = sex;
} //这个构造函数和默认构造函数相同,不传任何参数
public Human()
{ }

如果我们没有声明构造函数,那么编译器会为我们提供一个默认无参的构造函数;如果我们声明了构造函数,不管几个,那么编译器就不再为我们提供默认的构造函数。

抽象类

使用了关键词 abstract 声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。

具体代码表现如下:

 public abstract class Human
{
private String name;
private String sex;
private int weight;
private int heiht; public abstract String sayHello(); public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public int getHeiht() {
return heiht;
} public void setHeiht(int heiht) {
this.heiht = heiht;
}
}

从上面的代码中我们可以看到类名称前面添加了abstract  关键字,抽象方法sayHello 前面也添加了关键字abstract,  同时这个方法不能写方法体。

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。

抽象类和普通类的主要一些区别:

抽象方法权限必须为public或者protected,因为如果为private,则不能被子类继承,子类便无法实现该方法,缺省情况下默认为public。

抽象类不能创建对象,也就是不能通过new实例化;

如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。

如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

在其他方面,抽象类和普通的类并没有区别。

接口

说起接口,那么很多时候我们就会和抽象类相比较,而且这个问题也是很多初级javaer,经常会被问到的面试问题。

接口(英文:Interface):在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以 interface 来声明。一个类通过继承(实现)接口的方式,从而来继承接口的抽象方法。

具体的代码表现如下:

 /**
* 动物接口
* @author JJJ
*
*/
public interface Animals
{
//接口内的静态成员常量
static String eyes = "1";
static final String leg = "2";
//吃东西
public void eatFood();
}

在上面我们已经制定了一个 Animals 接口,而人类作为高级动物,必然也是需要吃东西,下面我们就让人类实现 Animals 接口,具体代码如下:

 public  class Human implements Animals
{
private String name;
private String sex;
private int weight;
private int heiht;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public int getHeiht() {
return heiht;
} public void setHeiht(int heiht) {
this.heiht = heiht;
} public String eatFood()
{
return "今天我吃了米饭!";
}
}

看上面的代码第39行~我们重新实现了接口中的 eatFood 方法,并且写上了方法体。

另外在这里要说明一下,在 Animals 接口中我们声明了2个静态的成员变量eyes和 leg,后者被 final 修饰,在上一章节中我们说过凡是被 final 修饰的一旦初始化,就不可以更改。

那么 eyes 是不是就可以修改呢?

从上图可以看出,答案是不行~即使你在声明的时候没有显示的写 final ,在接口中依然会把这个变量归为常量,所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

抽象类与接口的区别:

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法;

一般的应用程序中,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现;

一个类只能继承一个父类,但可以通过继承(实现)多个接口实现多重继承,接口还有标识(里面没有任何方法,如序列化 java.io.Serializable接口)和数据共享(里面的变量全是常量)的作用;

抽象类和接口相同点:

都不能被实例化;

都可以定义静态常量;


文中若有不正之处,欢迎批评指正!

JAVA基础第三章-类与对象、抽象类、接口的更多相关文章

  1. Kotlin基础(三)类、对象和接口

    类.对象和接口 一.定义类的继承结构 一)Kotlin中的接口 Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态. interface Cl ...

  2. java基础(三章)

    java基础(三章) 一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表 ...

  3. java总结第三次//类和对象2、3

    四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...

  4. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  5. JAVA基础第五章-集合框架Map篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  6. JAVA基础第四章-集合框架Collection篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  7. Java程序设计(2021春)——第三章类的重用笔记与思考

    Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...

  8. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

随机推荐

  1. Google搜索排名优化-面向搜索引擎的网站设计

    内容摘要:网站在搜索营销方面最主要的缺点: 行业知识:不知道搜索引擎对吸引的新用户的重要性,在搜索引擎排名服务中追求“傻瓜相关”,购买一些其实没有太多实际意义的行业关键词.其实能够用户输入的关键词越多 ...

  2. EF Code First 数据迁移配置

    这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践. 1.1 数据迁移综述 EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分 ...

  3. gradle 将依赖打入Jar包的方法

    使用的是IDEA,直接引入 plugins { id 'com.github.johnrengelman.shadow' version '1.2.3' } 放在build.gradle的最上面,然后 ...

  4. Golang 交叉编译 window/linux 文件

    gox - 一款简单的交叉编译工具 下载地址:https://github.com/mitchellh/gox 使用 go get 命令安装: go get github.com/mitchellh/ ...

  5. windows系统命令行

    使用   命令+/?就可显示命令的详细说明. 比如   ping/?就可知道ping命令的详细使用说明 netstat /?就可知道ping命令的使用说明

  6. 3GPP 测试 /etc/udev/ruse.d/50文件 /lib/udev/ruse.d/55* 网络配置

    3GPP是个标准化协议组织,其工作目标是制定协议实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性. 3GPP协议的制订主要是以GSM核心网为基础. 测试 ...

  7. PAT1006:Sign In and Sign Out

    1006. Sign In and Sign Out (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  8. MySql常用两大存储引擎简介

    MyISAM存储引擎简介 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.M ...

  9. SSM-SpringMVC-30:SpringMVC中InitBinder的骇客级优化

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上篇博客利用initbinder做了局部的日期类型转换,但是兼容性不要,只支持yyyy-MM-dd这种,所以 ...

  10. Ames房价预测特征工程

    最近学人工智能,讲到了Kaggle上的一个竞赛任务,Ames房价预测.本文将描述一下数据预处理和特征工程所进行的操作,具体代码Click Me. 原始数据集共有特征81个,数值型特征38个,非数值型特 ...