Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总    

1.多态:
  1)意义:
    1.1)同一类型的引用指向不同的对象时,有不同的实现
        行为的多态:cut()、run()、study()
    1.2)同一个对象被造型为不同的类型时,有不同的功能
        对象的多态:我、你、水
  2)向上造型:
    2.1)父类型的引用指向子类的对象
    2.2)能造型成为的类型: 父类、所实现的接口
    2.3)能点出来什么,看引用的类型
  3)强制类型转换,成功的条件只有两种:
    3.1)引用所指向的对象,就是该类型
    3.2)引用所指向的对象,实现了该接口
  4)若不符合如上两个条件,则ClassCastException类型转换异常
    建议在强转之前先通过instanceof来判断引用的对象是否是某种类型

2.成员内部类:应用率比较低
  1)类中套类,外面的称为外部类,里面的称为内部类
  2)内部类通常只服务于外部类,对外不具备可见性
  3)内部类通常在外部类中创建
  4)内部类中可以直接访问外部类的成员(包括私有的)
    内部类中有个隐式的引用指向了创建它的外部类对象
       外部类名.this

3.匿名内部类:
  1)若想创建一个类(子类)的对象,并且该对象只被创建一次,
    此时该类不必命名,称之为匿名内部类
  2)匿名内部类中访问外面的数据,该数据必须是final的

4.面向对象三大特征:
  1)封装:
    1.1)类:封装的是对象的属性和行为
    1.2)方法:封装的是具体的业务逻辑功能实现
    1.3)访问控制修饰符:封装的是访问的权限
  2)继承:
    2.1)作用:代码的复用
    2.2)通过extends来继承
    2.3)子继承父后,具有:父+子
    2.4)单一继承、传递性
    2.5)继承类、实现接口
  3)多态:
    3.1)意义:行为的多态、对象的多态
    3.2)向上造型、强制类型转换、instanceof
    3.3)表现形式:
        3.3.1)重写
        3.3.2)重载

程序设计规则:
1)将公共的属性和行为抽象到父类中
2)所有子类行为都一样------普通方法
  所有子类行为不一样------抽象方法
3)符合既是也是原则时,使用接口
  部分子类共有,设计到接口中
  接口是对继承单根性的扩展

println()-------是多态的(根据参数而多态)

面试题:
问:内部类有独立的.class吗?
答:有

成员内部类的演示

InnerClassDemo.java

package oo.day06;
//成员内部类的演示
public class InnerClassDemo {
public static void main(String[] args) {
Mama a = new Mama();
//Baby b = new Baby(); //编译错误
}
} class Mama{
private String name;
Baby createBaby(){
return new Baby();
}
class Baby{
void showMamaName(){
System.out.println(name);
System.out.println(Mama.this.name);
//System.out.println(this.name); //编译错误
}
}
}

多态演示

UpDemo.java

package oo.day06;
//多态的演示
public class UpDemo {
public static void main(String[] args) {
Aoo o1 = new Boo(); //向上造型
Boo o2 = (Boo)o1; //o1指向的对象就是Boo类型
Inter1 o3 = (Inter1)o1; //o1指向的对象实现了Inter1接口
//Coo o4 = (Coo)o1; //ClassCastException类型转换异常
if(o1 instanceof Coo){ //false
Coo o5 = (Coo)o1;
}
System.out.println("over");
}
} interface Inter1{ }
class Aoo{ }
class Boo extends Aoo implements Inter1{ }
class Coo extends Aoo{ }

匿名内部类的演示

NstInnerClassDemo.java

package oo.day06;
//匿名内部类的演示
public class NstInnerClassDemo {
public static void main(String[] args) {
//1.创建了Inter2的一个子类,没有名字
//2.为该子类创建了一个对象,叫o1
//3.大括号中的为子类的类体
Inter2 o1 = new Inter2(){ }; //1.创建了Inter2的一个子类,没有名字
//2.为该子类创建了一个对象,叫o2
//3.大括号中的为子类的类体
Inter2 o2 = new Inter2(){ }; final int num = 5;
Inter3 o3 = new Inter3(){
public void run(){
System.out.println("abc");
System.out.println(num);
}
};
o3.run(); }
} interface Inter3{
public void run();
} interface Inter2{
}

银联卡系统V-1.1.1

UnionPay.java

package oo.day06;
//银联卡系统
public class UnionPayTest {
public static void main(String[] args) { ABCATM atm = new ABCATM(); //atm机对象
UnionPay card = new ICBCImpl(); //银联卡--工行卡
atm.insertCard(card); //插卡
atm.payTelBill(); //支付电话费 }
}
class ABCATM{ //农行ATM机
private UnionPay card; //银联卡
public void insertCard(UnionPay card){ //插卡
this.card = card;
} public void payTelBill(){ //支付电话费
if(card instanceof ABC){ //农行卡
ABC abcCard = (ABC)card; //强转为农行卡
abcCard.payTelBill("12345678945", 500); //支付电话费
}else{
System.out.println("不是农行卡,不能支付电话费");
}
} public void getBalance(){ //查询余额
System.out.println("当前余额为:"+card.getBalance());
}
} interface UnionPay{ //银联接口
public double getBalance(); //查询余额
public boolean drawMoney(double number); //取款
public boolean checkPwd(String input); //检查密码
}
interface ICBC extends UnionPay{ //工行接口
public void payOnline(double number); //在线支付
}
interface ABC extends UnionPay{ //农行接口
public boolean payTelBill(String phoneNum,double sum); //支付电话费
} class ICBCImpl implements ICBC{ //工行卡
public double getBalance(){return 0.0;}
public boolean drawMoney(double number){return false;}
public boolean checkPwd(String input){return false;}
public void payOnline(double number){}
}
class ABCImpl implements ABC{ //农行卡
public double getBalance(){return 0.0;}
public boolean drawMoney(double number){return false;}
public boolean checkPwd(String input){return false;}
public boolean payTelBill(String phoneNum,double sum){
System.out.println("支付电话费成功");
return true;
}
}

UnionPay.java V1.1.1

Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总的更多相关文章

  1. Java抽象类接口、内部类题库

    一.    选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是(  C  ).(选择一项)   public class Person { public String nam ...

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

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. Java程序设计8——抽象类、接口与内部类

    1 抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体.但在某些情况下,某个父类并不需要实现,因为它只需要当做一个模板,而具体的实现,可以由 ...

  4. 面向对象 继承 抽象类 接口 static 权限修饰符

    Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...

  5. Unit05 - 抽象类、接口和内部类(上)

    Unit05 - 抽象类.接口和内部类(上) 1.static final常量:  1)必须声明同时初始化  2)通过类名来访问,不能被改变  3)建议:常量名所有字母都大写(多个单词间用_)  4) ...

  6. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  7. 面向对象的理解 抽象类&接口

    一.关于面向对象 1.什么是面向对象     在解释面向对象之前,先说说面向过程.学过C的同学都知道,C就是面向过程的一种语言.那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始.买cpu ...

  8. Java入门教程十(抽象类接口内部类匿名类)

    抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...

  9. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

随机推荐

  1. How to crack gbooks

    Damn cnblogs, no auto saving set by default, even worse than csdn, can't believe it, lost half an ho ...

  2. windows下cmd时复制dos中的内容 错误信息等

    16:28 2015/11/23小发现 windows下cmd时复制dos中的内容,错误信息等:鼠标右键选择标记,然后ctrl c 即可.

  3. HDU 4751 Divide Groups

    题目链接 比赛时候,建图建错了.大体算法想到了,不过很多细节都没想好. #include <cstdio> #include <cstring> #include <cm ...

  4. BZOJ2097[Usaco2010 Dec] 奶牛健美操

    我猜我这样继续做水题会狗带 和模拟赛的题很像,贪心搞一下. #include<bits/stdc++.h> using namespace std; int read(){ ,f=;cha ...

  5. OpenSceneGraph学习笔记

    VirtualPlanetBuilder编译方法 转自:http://www.boyunjian.com/do/article/snapshot.do?uid=7327932418831703800 ...

  6. 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

    今天关闭一个窗体,报出这样的一个错误"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke.",这个不用多想,肯定是那个地方没有释放掉.既然碰到这个问题, ...

  7. 既然nodejs是单线程的,那么它怎么处理多请求高并发的?

    单线程解决高并发的思路就是采用非阻塞,异步编程的思想.简单概括就是当遇到非常耗时的IO操作时,采用非阻塞的方式,继续执行后面的代码,并且进入事件循环,当IO操作完成时,程序会被通知IO操作已经完成.主 ...

  8. 用GruntJS合并、压缩CSS资源文件

    合并.压缩CSS资源文件用到了grunt-contrib-concat.grunt-css插件,自己npm就可以了,下面直接呈上package.json.Gruntfile.js代码 package. ...

  9. Ohana Cleans Up

    Ohana Cleans Up Description Ohana Matsumae is trying to clean a room, which is divided up into an n  ...

  10. linux 有趣的命令

    input: echo ' > ..XXX. .XXX.. > .XXXXY.TXXXX. > XXXXXYXTXXXXX > .VXXVYXTVXXX. > `.TYX ...