OOP⑻
1.接口:
类 和 对象 对象 is a 类
例子:
小鸟 is a 动物
飞机 is a 交通工具
子弹 is a 武器
卫星 is a 通讯工具
问题?
01. 小鸟 飞机 子弹 卫星 虽然不是一类! 但是却有一个公共点!!!都会飞!
02. 我们能不能把这个飞行的方法 写在 动物或者交通工具这些类中???
不能??为什么??
因为一旦我们把 飞行这个方法写在了 动物类中,代表所有的动物都会飞了!!!!
小鸟具有飞行的能力!
飞机具有飞行的能力!
子弹具有飞行的能力!
卫星具有飞行的能力!
这种关系 我们称之为 has a!
我们把 飞行这个能力! 写在一个叫 接口 的地方!
谁具有飞行的能力,就去 实现这个接口即可!
接口 : interface
特点:
01.接口不能被实例化,也不能有构造方法!
02.实现类必须重写接口中所有的方法!除非子类是抽象类或者接口!
03.接口中所有的变量 都是 静态常量!(必须赋予初始值) static final
04.接口中所有的方法都是 抽象方法! public abstract
05.解决了java中单根继承的问题,一个类只能extends一个类!但是可以implements N个接口
每个接口之间,使用逗号 隔开!
接口本身 只提供 某种功能,但是这个功能的具体实现,接口并不关注!
谁关注??谁实现了这个接口,谁关注!
接口A{
方法A();
}
接口B{
方法B();
}
接口C{
方法C();
}
接口D extends A,B,C{
}
实现类 implements 接口D{
方法A();
方法B();
方法C();
}
/*
* 动物类
*/
public abstract class Animal { public abstract void eat(); /**
* 因为 不是所有的动物都会飞行!
* 所以这个fly()压根 就不能定义在animal类中
*/
// public abstract void fly(); }
接口
/**
* 飞行的接口!
* 小鸟 飞机 以及 子弹 飞行的方式 一样吗?? 不一样!!
* 所以说 这个fly()有必要写方法体吗?? 没必要!!
* 说明这个fly()就是一个抽象方法!
*
*
*
*/
public interface FlyInterface { /**
* 静态常量
*/
static final int NUM = ; /**
* 飞行的能力
*/
public abstract void fly(); }
接口
public class Bird extends Animal implements FlyInterface {
@Override
public void eat() {
System.out.println("小鸟在吃虫子!");
}
@Override
public void fly() {
System.out.println("小鸟在飞翔.......");
}
}
接口
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("СèßäÔÙ³ÔÓã");
}
}
接口
2.内部类:
内部类:把一个类写在了另一个类或者方法中! 分类:
01.成员内部类
可以访问我们外部类的所有属性和方法!
如果我们想访问内部类,必须要有外部类,只能通过外部类来访问内部类!
// 01.实例化外部类对象
Father father = new Father();
// 02.通过外部类对象创建内部类对象
Father.Son son = father.new Son();
// 03.调用内部类的方法
son.sayHello();
特点:
01.成员内部类可以拥有private,protected访问权限修饰符
02.如果外部类和内部类有相同的属性和方法的时候,就近原则,使用内部类的!
想使用外部类的属性和方法时:
外部类名.this.属性/方法!
02.局部内部类
类被定义在一个方法体或者作用域中!
特点:
仅限于方法体内使用 ,可以理解成局部变量! 03.匿名内部类 ******
001.没有名称!看不到类的定义!
002.所有的匿名内部类必须继承一个类或者实现一个接口 04.静态内部类
01.在内部类上加static
02.不依赖于外部类,可以直接new
03.不能访问外部类的非静态方法和属性
public class Father { // 外部类
/**
* 外部类的成员变量
*/
private static int age = ;
private String name = "小黑";
class Son { // 成员内部类
int age = ;
String name = "小白";
/**
* 内部类打招呼的方法
*/
public void sayHello() {
System.out.println("外部类的姓名:" + Father.this.name);
}
}
/**
* 外部类的方法
*/
public void getSon() {
class Son { // 局部内部类 只能在getSon()中使用
public void sayBye() {
System.out.println("局部内部类 bye ");
}
}
Son son = new Son(); // 仅限于方法体内使用
son.sayBye();
}
static class Son2 { // 静态内部类
public void sayBye() {
System.out.println("静态内部类====》 bye " + age);
}
}
}
内部类
public interface Animal {
void eat();
void sleep();
}
内部类
import cn.bdqn.bean.Father.Son2;
public class InnerClassTest {
public static void main(String[] args) {
// 使用内部类???
// 01.实例化外部类对象
Father father = new Father();
// 02.通过外部类对象创建内部类对象
Father.Son son = father.new Son();
// 03.调用内部类的方法
son.sayHello();
// 使用局部内部类
father.getSon();
// 使用静态内部类
Son2 son2 = new Son2();
son2.sayBye();
}
// 当我们所在方法的形参需要在内部类中使用的时候,这个形参必须是final 修饰的!
class Son {
public void eatSomething(String something, final int age) {
// 使用匿名内部类
Animal dog = new Animal() {
@Override
public void sleep() {
System.out.println("小狗在睡觉");
}
@Override
public void eat() {
System.out.println(age);
}
};
dog.eat();
dog.sleep();
}
}
}
内部类
OOP⑻的更多相关文章
- c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】
字段(成员变量): 字段只能从对象中访问实例字段,无法直接从类中访问(换言之,不创建实例就不能访问),可以理解为:字段一般用在内部数据交互使用,当需要为外部提供数据时,(要优先使用自动实现的属性而不是 ...
- 一个简单oop的changeTab
好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...
- Python OOP(面向对象编程)
一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...
- OOP,WEB开发实用小技巧
偶然读到一篇博客,记录一下心得.这种设计对于新手来说一般是想不到的,它充分的发挥了OOP语言的特性,让代码专用而清爽.这是不是重构的思想呢? 我们在写业务层的时候,有很多方法是重复功能的,我们就可以使 ...
- 从OOP的角度看Golang
资料来源 https://github.com/luciotato/golang-notes/blob/master/OOP.md?hmsr=toutiao.io&utm_medium=tou ...
- 玩转JavaScript OOP[2]——类的实现
概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- iOS - 对OOA、OOD、OOP的理解
很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...
- OOP感悟
行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...
- 初识JAVA之OOP
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- 在未排序的数组中找到第 k 个最大的元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- Python全栈开发-Day3-Python基础3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3.递归 4.函数式编程介绍 5.高阶函数 1.函数基本语法及特性 三种编程范式: 1.面向过程:过程——> def 2.面向对象:类— ...
- pycharm设置连接github
pycharm与guthub连起来,推送代码会方便一些 教程很多,转发一个:https://www.cnblogs.com/feixuelove1009/p/5955332.html
- SQL中的where条件,在数据库中提取与应用浅析
1. 问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限 ...
- MySQL 8.0 安装时 Authentication Method
1. 使用强密码加密授权(推荐) 8.0提供的心的授权方式,采用SHA256基础的密码加密方法. 但是需要新版本的connector,目前和Connector/J最新的时8.0 目前8.0的连接器和使 ...
- Http Requests for PHP
一.Requests for PHP 官网:http://requests.ryanmccue.info官方介绍:Requests is a humble HTTP request library. ...
- canvas学习之小球动画
项目地址:http://pan.baidu.com/s/1skZGPgL 最近学习使用canvas做动画效果,主要原理就是创建一个小球对象,然后小球对象有一个moveball方法,每次让小球沿着随机路 ...
- Linux 权限管理命令
第四章(二)权限管理命令 Linux常用命令(二)权限管理命令
- loj#2353. 「NOI2007」 货币兑换 斜率优化
题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...
- 关于react16.4——转发refs和片段Fragment
1.转发refs Ref 转发是一种自动将 ref 通过组件传递给子组件的技术. 一些组件倾向于以与常规 DOM button 和 input 类似的方式在整个应用程序中使用, 并且访问他们的 DOM ...