封装/隐藏 : 通过类的访问限定符实现的   private    public

继承的意义之一:代码的复用

类的继承是指在一个现有类的基础上去构建一个新的类,构造出来的新类被称为派生类(子类),现有类被称为基类(父类),子类会自动拥有父类的所有可以继承的属性和方法。

在Java中需要用到extends关键字来判断两个类是否具有继承关系。

public class DeriveTest {
public static void main(String[] args) {
B b1 = new B();
B b2 = new B();
A a = new A(10); b1.test();
}
} class A{
protected int a; static{
System.out.println("A static block init.");
} {
System.out.println("A instance block init.");
} public A(){
System.out.println("A()");
this.a = 0;
} public A(int a){
System.out.println("A(int)");
this.a = a;
} public void show(){
System.out.println("A.show a:" + a);
}
} /**
* 派生类B有两部分
* 1.从基类继承来的成员
* 2.自己定义的成员
*
* super和this都必须写在第一行
*/
class B extends A{
private int b;
private int a; static{
System.out.println("B static block init.");
} {
System.out.println("B instance block init.");
} public B(){
// 如何在派生类中调用基类的构造函数呢?
super(); // A() a = 0
System.out.println("B()");
} public B(int data){
super(data); // A(int) a = data
System.out.println("B(int)");
} public void show(){ // 作用域不同 show A.show a A.a
System.out.println("B.show a:" + super.a);
} void test(){ // 测试方法
// 在派生类中,调用基类的方法
super.show();
show();//派生类的方法
}
}

在继承中可以继承父类的私有属性和方法,但是不可以调用。

继承结构中,基类和派生类的方法通常有两种关系:重载和重写
     * 重载:在一个类作用域中,函数名相同,参数列表不同(在同一个类中)
     * 重写:在基类和派生类中,出现返回值相同,函数名相同,参数列表也相同的实例方法(在不同的继承类中)
     * 重写指的是派生类方法表中,派生类提供的重写方法,把基类相应的方法的地址给重写了(覆盖了)

基类引用,可以引用派生类对象
         *派生类引用,不可以引用基类对象
         *把基类和派生类的继承结构,也经常称作从上到下的继承结构,
         *继承结构中的类型,只支持从下到上的转换,不支持从上到下
         *的转换

* private和protected的区别?
 * 1.它们两个修饰的成员,在类的外部都不能访问
 * 2.基类的private成员,在派生类中无法访问;基类的protected成员,在派生类中可以访问

一般定义类  -   抽象某个实体的类型
 * 但是基类类型 - 不是为了抽象某个实体的类型而定义的,它是为了:
 * 1.把派生类公共的成员抽取出来,放到基类里面,通过继承达到代码的复用
 * 2.在基类里面给所有派生类保留统一的抽象方法,等待派生类重写,实现多态的使用

* 抽象方法:
 * 1.是在实例方法的返回值前面添加abstract,代表该方法不用提供实现
 * 2.抽象方法一般放在基类里面
 * 3.拥有抽象方法的类,一定得定义成抽象类

* 抽象类:
 * 1.类定义的前面添加abstract
 * 2.和普通类最大的区别是抽象类不能实例化对象(不可以new 一个抽象类)

* 拥有抽象方法的类  一定是 是抽象类
 * 抽象类  不一定拥有 抽象方法
 
 * 什么叫多态???
 * 多态就是用基类引用,引用不同的派生类对象,通过基类的引用变量调用同名覆盖方法,这个基类引用引用了哪个派生类对象,就会调用哪个派生类对象重写的方法
 * 它的好处就是,在代码设计的时候,不用给每一个派生类都提供相应的入口,而是用基类引用接收所有的派生类对象,然后调用同名覆盖方法,实现多态调用 多态调用的实现(依赖函数的动态绑定实现的)
 *

 *  is a
 * 抽象类里面提供的方法,所有的派生类必须都得支持,但是有些方法只有某些派生类支持,其它的派生类是不支持的,我们应该把这些方法定义在_接口has a_里面,表示一种功能约定,表示某个派生类是否 拥有这个

功能,而不是从基类继承来,就必须得实现这个功能

interface IAnimal{  // 写一些动物特有得功能,不是 是个动物都具有这里定义得功能的
int DATA = 10; // public static final
void fly(); // 接口的方法默认就是public abstract的
} abstract class Animal { // 拥有抽象方法的类,必须是一个抽象类
protected String name; public Animal(String name) {
this.name = name;
} // 给所有派生类保留统一的抽象方法,等待派生类去重写
public abstract void bark(); // 抽象方法
} // 猫 - 实体类
class Cat extends Animal{ public Cat(String name) {
super(name);
} @Override // 在派生类中一定要重写基类继承来的抽象方法
public void bark() {
System.out.println(name + "bark: miao miao!");
}
} // 狗 - 实体类
class Dog extends Animal{ public Dog(String name) {
super(name);
} @Override
public void bark() {
System.out.println(name + "bark: wang wang!");
}
} // 猪 - 实体类
class Pig extends Animal{ public Pig(String name) {
super(name);
} @Override
public void bark() {
System.out.println(name + "bark: heng heng!");
}
} // 鸟 - 实体类
class Bird extends Animal implements IAnimal{ public Bird(String name) {
super(name);
} @Override
public void bark() {
System.out.println(name + "bark: ji ji zha zha!");
} public void fly(){
System.out.println(name + " flying!!!");
}
} /**
* 多态描述:
*
*/
public class 多态 { /**
* 请你提供一些API接口,接收不同的动物对象,打印动物的叫声
* 软件设计的终极的原则 “开-闭”原则
* 对扩展开放 对修改关闭
*/
/*public static void show(Cat cat){
cat.bark();
} public static void show(Dog dog){
dog.bark();
} public static void show(Pig pig){
pig.bark();
}*/ public static void show(Animal animal){ //
animal.bark(); // 通过函数的动态绑定做到的
// 如果这个动物是鸟的话,还要飞一下
if(animal instanceof IAnimal){
((IAnimal) animal).fly();
}
/**
* animal -> 对象(对象头 取 方法表地址) -> 方法表中的函数
*/
} public static void main(String[] args) {
show(new Cat("加菲猫"));
show(new Dog("哈巴狗"));
show(new Pig("佩奇"));
show(new Bird("百灵鸟"));
}
}

描述抽象类和接口的区别:
只能继承一个抽象类;可以实现多个接口
抽象类可以定义类变量和实例变量,类方法和实例方法,抽象方法;接口定义的变量都是public static final修饰的,定义的方法都是public abstract修饰的,而且不能提供代码实现
Java8开始,接口也可以通过定义default方法,给方法提供实现
抽象类使用在继承过程中,体现派生类和基类是is a的关系;而类实现一个接口,体现的是一种has a的关系,所以把所有派生类公共的重写接口应该定义在抽象类里面,而把派生类特有的功能方法,放在接口当中定义。

函数绑定:

* 函数的静态绑定和动态绑定是什么?
 * 绑定(函数调用)
 * invokestatic指令就是在以静态绑定的方法,调用函数
 * invokevirtual指令就是在以动态绑定的方法,调用函数
 *
 * static方法都是静态绑定调用
 * 实例方法都是动态绑定调用
 *
 * 静态绑定,指的是编译时期的绑定,编译阶段,这个方法的调用就是确定好的,永不不会再改变
 *
 * 动态绑定,指的是运行时期的绑定,就是在编译阶段,此处调用哪个函数,是 不确定的,
 *
 * final的应用场景有三个:
 * 1.final int data = 10; 可以用来定义常量
 * 2.final可以修饰类称作密封类,不能再被继承
 * 3.final可以修饰类的实例方法,称作密封方法,表示该方法不能在派生类中重写(覆盖)

oop(面向对象语言的三大特征):封装,继承,多态; (抽象),函数绑定的更多相关文章

  1. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  2. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  3. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  4. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  5. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  6. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  7. C#面向编程的三大特征

    在面向对象的编程中,首先要清楚地理解面向对象编程的三个基本特征: 封装, 继承, 多态! 1.封装 更确切地说,是对象封装.就是每个对象都包含自己进行某种操作时所需要的所有信息,而不依赖于其他对象来完 ...

  8. Java的OOP三大特征之一——继承

    Java的OOP三大特征之一——继承 子类继承父类的特征和行为(属性和方法),使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类 ...

  9. 封装继承多态-java面向对象三大特征

    第七章  封装和继承 一.面向对象的三大特征 封装.继承.多态 二.封装 将类的属性(字段)设置为私有的(private),并添加getter/setter方法操作属性. 注意:get|set方法的固 ...

随机推荐

  1. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵

    上一节我们介绍了CRF的背景,本节开始进入CRF的正式的定义,简单来说条件随机场就是定义在隐马尔科夫过程的无向图模型,外加可观测符号X,这个X是整个可观测向量.而我们前面学习的HMM算法,默认可观测符 ...

  2. iptablesIP规则的保存与恢复

    iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载 使用命令iptables-save来保存规则.一般用 iptabl ...

  3. CF1B.Spreadsheets(电子表格) 题解 模拟

    作者:zifeiy 标签:模拟 题目出处:Spreadsheets 题目描述 在流行的电子表格系统中(例如,在Excel中),使用如下计算方式来对列号进行计算. 第1列对应A,第2列对应B,--,第2 ...

  4. Python--day46--分组(看了别人博客掌握的)

    原文链接:https://www.cnblogs.com/snsdzjlz320/p/5738226.html group by group by + group_concat() group by ...

  5. java异常处理格式

    异常处理的5个关键字 try ,catch, finally throw, throws   我的总结: 捕获异常:先捕获小异常再捕获大异常. 程序是调出来的,不是写出来的:多测试是程序员的必修课. ...

  6. svn 冲突解决办法(黄色感叹号)

    右键:"TortoiseSVN"->"Resolved..."已解决的..., 选中全部的文件,然后OK,,然后就可以commit提交了.

  7. H5 新增表单属性和事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. LOGO的浮空显示-Verilog

    为了方便生成准确的mif数据,以实现特定的透明效果.使用Photoshop将网上下载的Logo修改颜色,保存大小为120*120像素,如图1所示. 图1 ps修改后的Logo 使用Pic2mif软件, ...

  9. dotnet core 发布只有一个 exe 的方法

    在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...

  10. linux scull 中的缺陷

    让我们快速看一段 scull 内存管理代码. 在写逻辑的深处, scull 必须决定它请求的内 存是否已经分配. 处理这个任务的代码是: if (!dptr->data[s_pos]) { dp ...