day09-10

来源:互联网 发布:一键海淘 知乎 编辑:程序博客网 时间:2024/05/18 00:08
多态(动态绑定机制)
多态的概述
       事物存在的多种形态 
多态前提  继承 重写 引用
* a:要有继承关系。
* b:要有方法重写。
* c:要有父类引用指向子类对象。
多态的成员访问特点(代码体现)    方子
成员变量
编译看左边(父类),运行看左边(父类)
成员方法
编译看左边(父类),运行看右边(子类)。动态绑定
静态方法
编译看左边(父类),运行看左边(父类)。
(静态和类相关,算不上重写,所以,访问还是左边的)
只有非静态的成员方法,编译看左边,运行看右边 
多态的好处和弊端
       弊端:
                父类(接口)引用不能使用子类特有功能。
                为了解决这个弊端,我们需要向下转型
好处:
可以提高代码的扩展性(多态)和可维护性(继承)。
向上转型和向下转型  先上后下
       Person p = new SuperMan();向上转型
           SuperMan sm = (SuperMan)p;向下转型
//基本数据类型提升
int i=10;
byte b=20;
//自动提升 i=b;
//强制提升 b=(byte)i;
抽象类
抽象类的概述  abstract
              看不懂的
抽象类特点
* a:抽象类和抽象方法必须用abstract关键字修饰
* abstract class 类名 {}
* public abstract void eat();
* b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
* c:抽象类不能实例化那么,抽象类如何实例化呢?
* 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
* d:抽象类的子类
* 要么是抽象类
* 要么重写抽象类中的所有抽象方法
抽象类的成员特点
* a:成员变量:既可以是变量,也可以是常量。abstract不能修饰成员变量
* b:构造方法:有。
* 用于子类访问父类数据的初始化。
* c:成员方法:既可以是抽象的,也可以是非抽象的。
     a:抽象方法 强制要求子类做的事情。
                     * b:非抽象方法 子类继承的事情,提高代码复用性。
abstract不能和final private static关键字共存
抽象类的案例
接口
接口的概述
从狭义的角度讲就是指java中的interface
从广义的角度讲对外提供规则的都是接口 
接口特点
* a:接口用关键字interface表示
* interface 接口名 {}
* b:类实现接口用implements表示
* class 类名 implements 接口名 {}
* c:接口不能实例化
* 那么,接口如何实例化呢?
* 按照多态的方式来实例化。
* d:接口的子类
* a:可以是抽象类。但是意义不大。
* b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
接口的成员特点
               成员变量;只能是常量,并且是静态的并公共的。
* 默认修饰符:public static final三个关键字可以互相交换位置
* 建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。
* 默认修饰符:public abstract
* 建议:自己手动给出。
                
类与类,类与接口,接口与接口的关系
               * a:类与类:
* 继承关系,只能单继承,可以多层继承。
* b:类与接口:
* 实现关系,可以单实现,也可以多实现。
* 并且还可以在继承一个类的同时实现多个接口。
* c:接口与接口:
* 继承关系,可以单继承,也可以多继承。
抽象类与接口的区别
               A:成员区别
* 抽象类:
* 成员变量:可以变量,也可以常量
* 构造方法:有
* 成员方法:可以抽象,也可以非抽象
* 接口:
* 成员变量:只可以常量
* 成员方法:只可以抽象

* B:关系区别
* 类与类
* 继承,单继承 多层继承。
* 类与接口
* 实现,单实现,多实现
* 接口与接口
* 继承,单继承,多继承
接口的案例


包的概述: 就是文件夹
作用: 分类管理java源文件
包的分类: 
单级包 cn
多级包 cn.itcast
包的划分原则: CRUD  增删改查 按照功能和模块进行划分
       一般情况下是先按照模块进行划分,然后按照功能进行划分
需要使用package 对某一个java文件进行加包
包的注意事项:
a: package只能是一个java源文件的第一条可执行语句
b: 一个java源文件只能使用一个包
c: 如果没有没有定义包,那么使用的就是默认包


面试题:
package , import ,class的顺序是什么?
import在package和class的中间
import
               其实就是让有包的类对调用者可见,不用写全类名了 
四种权限修饰符




本类 同一个包下(子类和无关类)不同包下(子类) 不同包下(无关类)
private Y
默认 YY
protected Y Y Y
public Y Y YY
内部类

* 概述: 就是把一个类定义在另一个类中,那么这个类就被称之为内部类

举例: 把A类定义在B类中,那么这个A类就被称之为内部类


* 特点:

** 内部类可以直接的访问外部类的成员包含私有的
** 外部类要想访问内部类的成员必须创建对
   内部类分类:(位置划分)
   局部内部类   方法中
成员内部类   类中方法外
//测试类中直接调用成员内部类  Outer.Inner oi=new Outer().new Inner();
//测试类中直接调用静态内部类  Outer.Inner oi=new Outer.Inner();可以调用里面的一切静态,非静态成员
成员内部类常见修饰符及应用
       private:只能在本类中访问 
     作用:保证数据安全性
static:静态内部类中可以存在内部类方法和非静态方法
      静态内部类只能访问外部类的静态成员
  作用:简化创建对象,方便外部访问
局部内部类访问局部变量
              //调用局部内部类必须在方法中建立局部内部类对象调用
  局部变量必须是最终的,用final修饰//jdk1.8不需要
     why? 生命周期 
     局部变量的生命周期随着方法的建立二建立,随着方法的消失而消失
 对象存储在堆内存,其生命周期随着对象的建立而产生,随着垃圾回收器的回收而消失
 极有可能出现一种情况,方法以及消失了(包括局部变量)而对象还没被垃圾回收器回收
 就不能使用局部变量了
 加上final修饰后局部变量变为常量,纳入方法区的常量池,常量池的生命周期
 随着方法的建立二建立,随着方法的消失而消失
匿名内部类:局部内部类的简化 
    前提:需要一个类或者接口
格式;new 类名/接口名(){方法重写}; new Jump(){public void jump(){System.out.println("跳高")}};
本质: 就是继承一个类或者实现接口的子类对象
匿名内部类中this关键字:
this表示的是匿名内部类的对象
public interface Inter {
public static final int a = 23 ;
}

public class Test {

public static void main(String[] args) {
new Inter() {
public void show() {
System.out.println(this.a);
}
}.show();
}
}

0 0
原创粉丝点击