Java学习笔记之面向对象编程精解

目录
  • 继承
    • super 关键字
    • final
    • protected关键字
  • 组合
  • 多态
  • 抽象类
  • 接口

面向对象编程(包、继承、组合、多态 、抽象类、接口)

包其实就是类的集合,其本质上其实就是一个文件夹,里面存放的. java 文件里面有我们写的代码,并且包的存在还可以有效解决在实际开发过程中程序员. java文件命名重叠问题,其实就是,一个包里面是能有两个名字相同的.java文件,但是如果是不同的包下就允许这样的情况存在。

我们创建一个包只需要在 src 目录底下去创建就行了,公司里面给报的命名一般都是用公司的域名的倒过来的形式,总而言之,要让别人看出来是这个包的作用。

还有就是,包中的权限问题,一个包或者包之中的内容压实有权限的我们先前已经了解的 private 和 public 权限区别是前者只能在当前类里面用,后者则可以在整个工程里面使用。但是如果一个包中的类或者类中的内容没有任何修饰符,那么即为默认权限。这种权限下面仅限在当前包中使用,想要跨包调用是不可能的。

继承

继承其实就是抽象和具体的关系,关键的地方就是将共性提取出来放在一个类里面,随后在交给下面具体的类去使用,譬如:猫,狗,这两个类的共性就是会吃饭,会叫,会跑,那么我们就将这三个共性抽象出来,创建一个类 :动物,让这个类里面包含前面那三种行为,这样的话,猫,狗两个类直接就写自己继承那个名叫动物的类,这样的话就可以省去大量重复的代码,大大减少我们的代码量。当然自己的类里面也可写上自己的独特行为,比如:猫的类里面可以写猫可以上树,这是猫所特有的。。下面看具体的代码示例。

class Animal {
    public void eat {
        System.out.println("吃饭");
    }
    public void shout {
        System.out.println("吼叫");
    }
    pubic void run {
        System.out.println("跑步");
    }
}
class Dog extends Animal{

}
class Cat extends Animal {
    public void climbtree {
        System.out.println("爬树");
    }
}
public class Test {

}

总而言之,可以把继承这种关系理解成 is a ,cat is a animal( 语法不要在意)。

super 关键字

super关键字与this的用法非常相似,super用于引用当前父类的对象的引用,使用super可在子类里面引用父类里面的字段和方法。

并且当我们想要给子类对象赋值的时候,我们是通过构造方法来赋值的,但是值是在父类里面的,因此,我们必须要先有父类的构造才能有子类构造,所以我们要使用 super来调用父类的构造方法(原理一如 this 调用 构造方法一样)。

此外,继承还可层层继承下去,套好几层,当然不推荐这样做,这个时候再使用super 引用的就是其最直接的那个父类。

class Animal {
    public String name;
    public Animal(String name) {
        this.name = name;
        System.out.println(this.name);
    }
}
class Cat extends Animal {
    public Cat (String name) {//此处为cat这个类的构造方法
        super(name);//此处即为声明调用父类那个只有一个参数的构造方法
    }
}
public class Test {
       public static void main(String[] args) {
        Cat cat = new Cat("咪咪");
    }
}
//最后打印结果为 咪咪

其实在我们正常继承中也会有第八至十行这样的代码,但是一般来说都是省略的,看不见的,就像是默认构造方法一样,里面没有参数。

下面便是我们的普通默认情况。

class Cat extends Animal {
    public Cat () {
        super();
    }
}

final

被 final 修饰的类是不可以继承的,一如被 final 修饰的变量不可以被改变一样,只要记住 final 修饰的东西就意味着不灵活,不能随意更改即可。

protected关键字

protected 是一种权限,使用了他之后可以在同一个包的同类或者不同类下面引用,或者不同的包的子类。

protected 与其他几种包的子类:

组合

类似于上面的,组合就是 has a 的关系。一辆小轿车在组装的时候,其自身含有四个轮子,两个后视镜,一个车标,等等。

其实就是讲一个类的示例当成里一个类的字段。

public class Student {
...
}
public class Teacher {
...
}
public class School {
   public Student[] students;
   public Teacher[] teacher;
}

多态

多态的发生条件是在,父类和子类当中的函数重写,且发生向上转型的的时候才会产生,而重写的条件则是要求两个函数的参数条件,函数内容完全一致。

(重写特点:函数名相同,返回值相同,函数列表相同;

重载的特点:函数名相同,函数的参数列表不同,返回值不做要求)

步骤:我们先通过 把子类对象的引用传给父类对象的引用 (或者其他方法,总之要保证让父类对象的引用指向子类对象的引用所指向的),这样我们便发生了向上转型,之后再用父类对象的引用来引用父子类公有的函数,这个时候就会发现,结果出来为子类。这就是由于编译时程序引用的是父类当中的函数,但是当运行时就改引 子类当中的函数了,这也就是所谓的动态绑定,在父类基础上又绑了子类,这样,我们每次给父类对象的引用附上不同的子类对象的引用,就会导致最后产生不同的结果,这便是所谓多态,多种状态。

下面看代码示例:

class Animal  {
    public String name;
    public Animal (String name) {
        this.name = name;
    }
    public void running() {
        System.out.println(this.name + "正在跑(animal)");
    }
}
class Rabits extends Animal {

    public Rabits(String name) {
        super(name);
    }

    public void running() {
        System.out.println(this.name + "正在跑(rabits)");
    }
}
class Cat  extends Animal {

    public Cat (String name) {
        super(name);
    }

    public void running() {
        System.out.println(this.name + "正在跑(Cat)");
    }
}
class Pig extends Animal {

    public Pig (String name) {
        super(name);
    }

    public void running() {
        System.out.println(this.name + "正在跑(Pig)");
    }
}

public class TestDemo {

    public static void main(String[] args) {
        Animal animal = new Rabits("兔兔");
        animal.running();
        Animal animal2 = new Cat("猫猫");
        animal2.running();
        Animal animal3 = new Cat("猪猪");
        animal3.running();
    }

}

执行结果,可以很明显看到,虽然是用 animal 来引用的,但是最后打印的都是子类自己的

抽象类

抽象类专门就是用来服务于多态的,它没有办法实例化,并且类的前面必须要有一个 abstract 来修饰它,下图为抽象类的特性整理。

接口

接口是由用来弥补继承的不足的,继承的话只能继承一个类,但是如果是接口的话,一个类就可以 implements 多个接口 ,而且接口注重的是功能,我们需要在意的是它里面有哪些我们需要的功能,如果有派上用场的就把它 implements 过来。

到此这篇关于Java学习笔记之面向对象编程精解的文章就介绍到这了,更多相关Java 面向对象 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 带你用Java全面剖析类和对象

    目录 一.面向过程?面向对象? 二.类和类的实例化 2.1普通成员变量和普通成员方法 2.2 静态成员变量和静态成员方法 三.封装 3.1 private 3.2 getter 和 setter 四.构造方法 4.1 基本语法 4.2 this 关键字 五.代码块 5.1 普通代码块 5.2 构造代码块 5.3 静态代码块 5.4 注意事项 六.快捷方法 6.1 toString方法 6.2 setter / getter 方法 6.3 构造方法(快捷) 总结 一.面向过程?面向对象? C 语言

  • Java创建对象(显式创建和隐含创建)

    目录 一.显式创建对象 1. 使用 new 关键字创建对象 2. 调用 java.lang.Class 3. 调用对象的 clone() 方法 4. 调用 java.io.ObjectlnputStream 对象的 readObject() 方法 二.隐含创建对象 对象是对类的实例化.对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为.Java 对象的生命周期包括创建.使用和清除. 一.显式创建对象 对象的显式创建方式有 4 种. 1. 使用 new 关键字创建对象 这是常用的

  • Java 基础语法让你弄懂类和对象

    目录 Java 基础语法 一.类与对象的初步认知 二.类和类的实例化 三.类的成员 1. 字段/属性/成员变量 2. 方法 3. static 关键字 四.封装 1. private 实现封装 2. getter 和 setter 方法 五.构造方法 1. 基本语法 2. this 关键字 六.认识代码块 1. 什么是代码块 2. 本地代码块 3. 实例代码块 4. 静态代码块 七.补充说明 1. toString 方法 2. 匿名对象 八.总结 Java 基础语法 其实在学习 C 语言时就一直

  • 带你了解Java的类和对象

    目录 五丶封装 (1)包的概念与创建 1>概念 2>创建 (2)包的使用–导入包 (3)封装定义–权限控制访问 (4)补充些常用的包(小拓展) 六丶关于static成员 (1)修饰成员变量–区分成员丶静态成员变量 (2)修饰成员方法–调用私有变量 (3)访问私有属性 七丶代码块 (1)普通代码块 (2)构造代码块 (3)静态代码块 总结 五丶封装 (1)包的概念与创建 1>概念 在我们的电脑上有许多的文件,我们为了方便管理,大致给它们进行了不同的命名. 然后在不同的文件夹下面再给它们进行

  • Java运行时动态生成对象的方法小结

    目录 一.利用JDK自带工具类实现 二.利用三方Jar包实现 三.利用Groovy脚本实现 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生成对象处理特定规则的逻辑.如果手写不仅每次都要修改代码,还要每次测试发版,而且无法灵活根据用户定义的规则动态处理逻辑.所以想到将公共逻辑写到父类实现,将特定逻辑根据字符串动态生成子类处理.这就可以一劳永逸解决这个问题. 那就着手从Java如何根据字符串模板在运行时动态生成对象. Java是一门静态语言,通常,我们需要的c

  • Java学习笔记之面向对象编程精解

    目录 包 继承 super 关键字 final protected关键字 组合 多态 抽象类 接口 面向对象编程(包.继承.组合.多态 .抽象类.接口) 包 包其实就是类的集合,其本质上其实就是一个文件夹,里面存放的. java 文件里面有我们写的代码,并且包的存在还可以有效解决在实际开发过程中程序员. java文件命名重叠问题,其实就是,一个包里面是能有两个名字相同的.java文件,但是如果是不同的包下就允许这样的情况存在. 我们创建一个包只需要在 src 目录底下去创建就行了,公司里面给报的

  • java学习笔记之DBUtils工具包详解

    DBUtils工具包 一.介绍 DBUtils是Apache组织开源的数据库工具类. 二.使用步骤 ①.创建QueryRunner对象 ②.调用update()方法或者query()方法执行sql语句 三.构造方法及静态方法 QueryRunner类 1.构造方法 ①.无参构造 QueryRunner qr =new QueryRunner(); 使用无参构造的时候,调用update方法和query方法时就需要使用带Connection 类型参数的重载形式 ②.有参构造 QueryRunner

  • php学习笔记之面向对象编程

    复制代码 代码如下: <?phpclass db {     private $mysqli; //数据库连接     private $options; //SQL选项     private $tableName; //表名     public function __construct($tabName) {         $this->tableName = $tabName;         $this->db ();     }     private function d

  • Spring学习笔记1之IOC详解尽量使用注解以及java代码

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4. 一.准备工作. 1.m

  • Python学习之面向对象编程详解

    目录 什么是面向对象编程(类) 类的关键字-class 类的定义与使用 类的参数-self self的解析与总结 类的构造函数 构造函数的创建方法 关于对象的生命周期 什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程 自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法).在我们一开始学习 Python 的时候说过,要尽量避免使

  • Java设计模式之里氏替换原则精解

    1.什么是里氏替换原则? 我们都知道,在面向对象编程中有三大特性(封装.继承.多态),在这里我们来说 继承 这个东西. 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏. 也就是说:继承在给程序设计带来便利的同时,也带来了弊端.比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到

  • JAVA学习笔记:注释、变量的声明和定义操作实例分析

    本文实例讲述了JAVA学习笔记:注释.变量的声明和定义操作.分享给大家供大家参考,具体如下: 本文内容: 注释 变量的声明和定义 成员变量和局部变量 首发时间:2018-03-16 15:59 注释: 单行注释:// 多行注释:/* - */ 变量: 变量是内存中的一个存储区域,变量的定义就是给每一个变量名定义一个内存区域 JAVA中定义变量的格式为: 数据类型 变量名=初始化值,比如 变量可以先声明再定义,也可以声明并定义. 同类的变量可以一起声明,一起定义. 变量的使用要注意: 1.变量的作

  • Java学习笔记:基本输入、输出数据操作实例分析

    本文实例讲述了Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 首发时间:2018-03-16 16:30 输出数据: JAVA中在屏幕中打印数据可以使用: System.out.print(x):x可以是一个变量.表达式.字符串. System.out.println(x):x可以是一个变量.表达式.字符串.与print不同的是打印完后会换行 System.out.print

  • Java设计模式之开闭原则精解

    目录 1.什么是开闭原则? 2.违反Ocp代码案例 3.遵守Ocp代码案例 1.什么是开闭原则? 开闭原则(Open Closed Principle)是编程中最基础.最重要的设计原则. 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框架,用实现扩展细节. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则. 2.违反Ocp代码案例 package c

  • Java设计模式之依赖倒转原则精解

    目录 1.什么是依赖倒转原则? 2.代码案例 3.依赖关系传递的三种方式和案例举例 3.1 接口传递 3.2 构造方法传递 3.3 setter方法传递 4.依赖倒转原则总结 1.什么是依赖倒转原则? 高层模块不应该依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象. 依赖倒转 (倒置) 的中心思想是面向接口编程. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多.以抽象为基础搭建的架构比以细节为基础的架构要稳定的多.在Java中,抽象指的是接口

随机推荐