第十天 final常量 abstract抽象类,接口

本文详细介绍了Java编程中的方法重写、静态与非静态方法、构造代码块与静态代码块的区别,抽象类与接口的特性,以及类型转换(强转)的概念。重点强调了Java中单继承与多实现/多继承的区别,以及编译期和运行时类型的检查规则。
摘要由CSDN通过智能技术生成

方法 =重写 静态方法= 隐藏

重载 括号里面加入变量的不同

构造代码块,构造方法在创建对象前执行
成员变量不能用在静态代码块,静态在类加载之前完成

成员方法需要先定义后使用 (){}

ctrl+alt+m = 封装方法
ctrl alt t
ctrl insert setget方法

private修饰。提供setget方法

static不需要创建对象就能调

父类中有抽象方法,子类要么是抽象 class,要么实现自己的方法

继承接口后就要实现所有的方法

接口可以多继承,因为都没有实现m()方法

final

常量
修饰的变量称为常量
final修饰的基本数据类型,其值不能发生改变
final修饰的引用数据类型,其地址不能发生改变直接赋值外还可以在构造代码块和构造方法赋值

final修饰静态变量除直接赋值外,需要在静态代码块中赋值

final修饰方法

final修饰的方法称之为最终方法,不能被重写或者隐藏。可以被继承,可以被重载

final修饰类

final修饰的类称之为最终类,不能被继承

abstract

abstract可以修饰方法,也可以修饰类。修饰的方法称之为抽象方法,修饰的类称为抽象类

抽象类中的方法的权限默认是默认的权限

抽象类不能创建对象

抽象类中可以编写非抽象方法,抽象方法只能在抽象类中。

子类继承抽象类之后必须重写其中的抽象方法,除非子类本身也是抽象类

抽象类不能被final修饰。抽象类一定不是最终类,因为抽象类一定要被继承

抽象方法可以被重载, 必须要被重写

抽象类不能被private、final、static 修饰

抽象方法只有方法的定义,没有具体的实现,不能有方法体,连{}都没有。格式 :abstract 返回值类型 方法名()

继承抽象类后,如果没有重写其中的抽象方法,他会标红提醒,接口中的抽象方法没写也会提醒

继承抽象类之后重写的的方法的访问权限也得大于或等于抽象类中的权限

接口

接口中都是方法,往往比较短,只是起连接作用,就是为了你继承之后写固定的方法。
接口中的方法重写时必须加public
接口不是一个类,是一个引用数据类型

接口是功能的集合,可以看作一种数据类型。继承了接口就

在jdk1.8 之前,接口中存放的都是抽象方法。没有具体方法的实现
jdk1.8后,接口中允许出现实体方法

先记住接口只能包含抽象方法

接口中的方法,使用public abstract 修饰,不能使用其它权限修饰符修饰,接口中的方法都是抽象的,所以必须都实现
如果不写public abstract ,直接写 void(){}在编译时系统会自动加上public abstract

接口中的变量都是静态变量,被public static final修饰

接口的实现类一般用 接口名+lmpl命名

一个类可以实现多个接口,实现接口的所有方法
接口可以继承,并且接口和接口时多继承

接口中没有构造方法,

接口不能创建对象,接口编译完之后会产生class文件,但它不是类

接口中的变量会被public static final 修饰

继承时使用implements

使用向上转型使用接口 接口 接口名 = new 继承接口的类名
接口名.方法名。

所有共有放父类,部分共有放在接口中

重写接口中的方法时,方法的权限必须大于等于接口中的,接口中的是public,方法中的也必须是public

接口中有数据默认是常量,没有变量

接口中可以写默认方法 defult void test(){}。默认方法可以重写也可以不重写,意味着默认方法可以不变,保证稳定性

接口中可以写默认方法 static void test(){}

引用数据类型强转问题

父类可以强转为子类


public class TestDemo2 {
    public static void main(String[] args) {

        // 引用数据类型强转问题
        
        /**
         * 在编译时候会检查对象的声明类型和要强转的类型是否有继承
         * 在编译期间。a对象的声明类型是A类
         * a对象要强转的类型是B1,B1是A的子类,所以编译通过。
         * 到了运行阶段,发现a对象的实际类型是B1类
         * 要强转的类型也是B1类。类型匹配,可以强转。
         */
		
        /**
         * ClassCastException 类型转换异常
         * a对象的声明类型是A类,在编译期间检查A类和B2类有继承关系,所以编译通过
         * 运行时发现a对象的实际类型是B1类,要强转的类型是B2类。类型不匹配,抛出异常
         */
		
        /**
         * a的声明类型是A类。要强转的类型是C类,C和A没有继承关系,编译失败
         */
		

        /**
         * 类和类之间是单继承,因此可以形成一颗继承 树状结构
         * 比较容易确定两个类之间是否有继承关系
         *
         * 在java中,接口和接口是多继承,类和接口是多实现,所以形成网状结构
         * 在网状结构中,不容易确定两个节点之间的关系
         * 为了提高编译效率,java在编译期间放弃检查
         * 也就意味着在编译期间,任何一个接口都可以强转
         */
        
    }
}

左边是编译时的类型,右边是实际运行时的类型

class A{}

class B1 extends A{}

class B2 extends A{}

class C{}

interface D{}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值