封装/隐藏 : 通过类的访问限定符实现的   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. python新知识

    # 强制字符串转化 repr(1.1 + 2.2) # 字符串换行 a = "hello, world. " \ "it's a nice day. " \ & ...

  2. iptables command 常用命令列表

    命令 -A, --append 范例 iptables -A INPUT ... 说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则. 命令 -D, --delete 范例 iptab ...

  3. Python--day48--ORM框架SQLAlchemy之子查询

    一定要把第一次查询的结果作为一个结果再进行查询:代码后面加.subquery()标明是子查询 1,简单的子查询 #select * from (select * from tb) as B q1 = ...

  4. java 集合之Arraylist的遍历及排序

    最近培训是先学习java基础 从最基本的开始学起 因为今天刚刚开博客 要把上周的一些重点内容归纳一下 1.Arraylist常用遍历以及排序 import java.util.ArrayList; i ...

  5. Scrapy项目注意事项

  6. win10系统激活 快捷方式

    系统不定期就会提示激活,每次激活都是找各种工具折腾,今天捣鼓简单的脚本直接激活~~ 首先查看自己系统的版本,后面才能找到合适的激活码 win+R 启动程序 输入 winver 即可查看系统版本 2.查 ...

  7. Yet Another Number Sequence——[矩阵快速幂]

    Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  8. P1080 探测器

    题目描述 一个 n*n 的网格图上有 m 个探测器,每个探测器有个探测半径r,问这 n*n 个点中有多少个点能被探测到. 网格图上的点的坐标从(1,1)到(n,n). 输入格式 第一行3个整数n,m, ...

  9. H3C 路由表查找规则(2)

  10. 如何理解springMVC?

    springMVC 工作原理? 简单理解:客户端发送请求-->前端控制器接受客户端的请求DispathServelt-->找到处理器映射HandMapping-->找到处理器hand ...