抽象类/接口

回顾:
1.重写(override):
1)父子类中,方法签名相同,方法体不同
2)重写方法被调用时,看对象的类型
3)两同两小一大:
3.1)方法名同,参数列表同
3.2)子类返回值类型小于等于父类
3.2.1)void时,必须相同
3.2.2)基本类型时,必须相同
3.2.3)引用类型时,子类小于等于父类(父类大,子类小)
子类抛出的异常小于等于父类-----后期说
3.3)子类的访问权限大于或等于父类
2.重写与重载的区别
1)重写(override):父子类,方法名同,参数列表同
“运行期”绑定,看对象的类型调用方法
2)重载(overload):一个类,方法名同,参数列表不同
"编译期"绑定,看引用的类型绑定方法
3.package(声明包),import(声明类/引入类)
4.访问控制修饰符
public,protected,默认,private
对于类,只能用public或默认的
内部类,如上4种都可以
对于类的成员,如上4种都可以
5.static:静态的
1)修饰成员变量:静态变量(类变量)
类,方法区,一份,类名点访问
何时用: 当所有对象的数据都一样时使用
2)修饰方法:静态方法(类方法)
没有隐式的this传递,不能直接访问实例成员
何时用:方法的操作仅与参数有关,而与对象无关
3)块:静态块
类被加载期间自动执行,一次
何时用:初始化静态资源(图片、音频、视频......)
6.final:最终的
1)修饰变量:变量不能被改变
2)修饰方法:方法不能被重写
3)修饰类:类不能被继承
7.内部类:
1)类中套类,外面叫外部类,里面叫内部类
2)内部类只服务于外部类,对外不具备可见性
3)内部类对象在外部类中创建
4)内部类可以直接访问外部类的成员(包括私有)
内部类中有一个隐式的引用指向了创建它的外部类对象:
Mama.this.成员变量名
8.匿名内部类:
Aoo o = new Aoo(); //创建Aoo的对象
//1.创建了Aoo的一个子类,没有名字
//2.为该子类创建了一个对象,名为o
//3.大括号中的Aoo子类的类体
Aoo o = new Aoo(){
};

package a;
class Aoo{
}

package b;
class Aoo{
}

package c;
class Test{
main(){
a.Aoo o = new a.Aoo();
b.Aoo o1 = new b.Aoo();
}
}

正课:
1.static final常量:
1)必须声明同时初始化,不能修改,类名点来访问
2)常量名建议所有字母都大写
3)编译器编译时会直接替换为具体的值---效率高
2.抽象方法
1)由abstract修饰
2)只有方法的定义,没有方法的实现(连大括号都没有)
3.抽象类:
1)由abstract修饰
2)包含抽象方法的类必须是抽象类
不包含抽象方法的类也可以声明为抽象类-----我愿意
3)抽象类不能被实例化
4)抽象类是需要被继承的,子类:
4.1)重写所有的抽象方法----建议
4.2)声明为抽象类----不建议
5)抽象类的意义:
5.1)封装所有子类共有的数据和行为,实现代码重用
5.2)为所有子类提供了一种公共的类型(向上造型)
5.3)包含抽象方法,为所有子类提供一个统一的入口
4.接口:
1)是一个标准、规范-----制定方
遵守了这个标准,就能干某件事-----后期再理解
2)由interface定义
3)只能包含常量和抽象方法
4)接口不能被实例化
5)接口是需要被实现(implements)的,实现类:
必须重写接口中的所有抽象方法
6)一个类可以实现多个接口,用逗号分隔
若既继承又实现时,必须先继承,后实现
7)接口之间可以继承
7.1)类和接口之间为实现(implements)
7.2)接口和接口之间为继承(extends)
7.3)类和类之间为继承(extends)

interface UnionPay{ //银联接口
void 存钱();
void 取钱();
void 查余额();
}
interface ABC extends UnionPay{ //农行接口
void 支付电话费();
}
interface ICBC extends UnionPay{ //工行接口
void 在线支付();
}
class ABCImpl impelments ABC{ //农行卡
public void 存钱(){}
public void 取钱(){}
public void 查余额(){}
public void 支付电话费(){}
}
class ICBCImpl implements ICBC{ //工行卡
public void 存钱(){}
public void 取钱(){}
public void 查余额(){}
public void 在线支付(){}
}

UnionPayTest

Inter1 o1 = new Inter1(); //编译错误

Inter1 o1; //正确

Aoo o1 = new Aoo();
Inter2 o2 = new Aoo(); //向上造型
Inter1 o3 = new Aoo(); //向上造型

interface Inter1{
void a();
void b();
}
interface Inter2 extends Inter1{
void c();
}
class Aoo implements Inter2{
public void c(){}
public void a(){}
public void b(){}
}

interface Inter1{
void a();
}
interface Inter2{
void b();
}
abstract class Aoo{
abstract void c();
}
class Boo extends Aoo implements Inter1,Inter2{
public void a(){}
public void b(){}
void c(){}
}

interface Inter1{
void a();
void b();
}
class Aoo implements Inter1{
public void a(){}
public void b(){}
}

interface Inter1{
public static final int NUM=2;
public abstract void show();

void say(); //默认public abstract
double PI=3.14159; //默认public static final
}

生活中的接口:
1.电脑厂商做USB口------------------制定标准、规范
U盘、摄像头、充电线...----------遵守标准、规范
2.国家对商品房------------------------制定标准、规范
国家对家具、家电------------------制定标准、规范
开发商、家具厂商------------------遵守标准、规范
3.银行-------------------------------------制定标准、规范
银行卡----------------------------------遵守标准、规范

农行-----存钱、取钱、转帐、查余额、支付电话费
农行卡-----具备如上5个功能

工行-----存钱、取钱、转帐、查余额、在线支付
工行卡-----具备如上5个功能

abstract class 人{
abstract void study();
}
class 程序员 extends 人{
void study(){
}
}
class 医生 extends 人{
void study(){
}
}
class 警察 extends 人{
void study(){
}
}

abstract class Shape{ //抽象类----不完整
double c; //周长
abstract double area(); //抽象方法----不完整
}
class Circle extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0796*c*c;
}
}
class Square extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0625*c*c;
}
}

new Tetromino(); //编译错误

new Tetromino(); //永远不需要的

new T();
new J();
new O();

abstract class Tetromino{
Cell[] cells;
void drop(){}
void moveLeft(){}
void moveRight(){}
void print(){}
}
class T extends Tetromino{
}
class J extends Tetromino{
}
class O extends Tetromino{
}

给我一组图形,找到这一组图形中的最大面积:
Shape[] shapes = new Shape[6];
shapes[0] = new Circle(1);
shapes[1] = new Circle(2);
shapes[2] = new Square(1);
shapes[3] = new Square(2);
shapes[4] = new Six(1);
shapes[5] = new Six(2);

double max = shapes[0].area(); //1.Shape类中包含area(),保证能点出来 2.此处调用的中子类的area()方法,因重写后调谁看对象的类型
for(int i=1;i<shapes.length;i++){
double area = shapes[i].area();
if(area>max){
max = area;
}
}
System.out.println("max="+max);

abstract class Shape{ //抽象类----不完整
double c; //周长
abstract double area(); //抽象方法----不完整
}
class Circle extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0796*c*c;
}
}
class Square extends Shape{
double area(){ //重写抽象方法---变不完整为完整
return 0.0625*c*c;
}
}

new Shape(); //编译错误
Shape s; //正确

abstract class Shape{ //抽象类----不完整
double c;
abstract double area(); //抽象方法----不完整
}
class Square extends Shape{
double area(){ //重写----变不完整为完整
return 0.0625*c*c;
}
}
class Circle extends Shape{
double area(){
return 0.0796*c*c;
}
}

时间: 2024-10-10 18:28:42

抽象类/接口的相关文章

小知识(五):抽象类&接口

抽象类abstract: 抽象类和抽象方法可以用abstract关键字进行标识.就是没有完全定义的类或方法.所以不能直接实例化操作. 就因为他没完全定义所以不能用sealed关键字进行密封. 抽象方法不含程序主体: public abstract class Student { //抽象方法,不含程序体 public abstract void GetStudentID(); //子类可访问字段 prodected int i; //定义i的属性 public int I { get { ret

普通类 抽象类 接口

首先得搞懂什么是抽象类:一.概念:    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样.并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.    比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆.三角形这样一些具体概念.它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念.正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的

虚函数/纯虚函数/抽象类/接口/虚基类

1.多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 在Java中,没有指针,就直接用父类实例化子类对象 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的,多态可以让父类的指针有“多种形态”,这是一种泛型技术. 所谓泛型技术,就是试图使用不变的代码来实现可变的算法 2.虚函数 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){ 函数

面向对象的理解 抽象类&amp;接口

一.关于面向对象 1.什么是面向对象 在解释面向对象之前,先说说面向过程.学过C的同学都知道,C就是面向过程的一种语言.那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始.买cpu,显卡,主板,电源,风扇,把这些都通过主板链接到一起.我需要清楚的知道主机组装的每一个步骤. 介绍了面向过程,再说会正题,什么是面向对象?对于上面的装主机过程面向对象会把主机先抽象成一个机箱,机箱里有cpu,显卡,主板,电源.用主机的人,不关心里面是怎么工作的,也不需要知道内部逻辑,只知道插上电源就能用.面

19 抽象类 接口类 封装. 多态

主要内容: 1.  抽象类(接口类): 制定一个规范  : from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def pay(self):pass class Alipay(Payment): def __init__(self,money): self.money = money def pay(self): print('使用支付宝支付了%s' % self.mon

“全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百零六章:匿名内部类与抽象类接口注意事项 下一章 "全栈2019"Java第一百零七章:匿名内部类与构造方法注意事项 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

Java实训笔记(二)——-抽象类-接口-泛型-集合

1.1方法的可变参数从JDK1.5之后,定义方法时参数的个数可以变化语法:最后一个数据类型后增加3个点注意:1.可变参数只能处于参数列表的最后:2.一个方法中最多只能包含一个可变参数:3.可变参数的本质就是一个数组,因此在调用一个包含可变参数的方法时,既可以传人多个参数,也可以传入一个数组.1.2装箱与拆箱基本数据类型与对应的封装类之间能够自动进行转换,其本质是Java的自动装箱与拆箱过程.-装箱是指将基本类型数据值转换成对应的封装类对象,即将栈中的数据封装成对象存放到堆中的过程.-拆箱是装箱的

PHP基础------抽象类------接口

<?php header("content-type:text/html; charset=utf-8"); //抽象类,抽象类不能被实例化,抽象方法不能有方法体,只能由子类继承去实现,抽象方法用abstract修饰 abstract class Person { abstract function eat(); abstract function say(); } class son extends Person { function eat() { echo "我能

【Java】第10讲:抽象类.接口

用处:父类的方法的不确定性,不写实现结果的话就要抽象化(abstract),如下下 隐藏要求,继承抽象类时,必须要实现所有的抽象方法,因为作者不知道子类需要什么,只是提供方法 接口 抽象类可以有实现主体,接口不能有 接口变量可以有变量,必须初始化,final,piblic,static