Java基础03--static-代码块-单例设计模式-继承-多态-final-抽象类-接口-内部类-枚举-泛型

一、static

静态,修饰成员变量、成员方法

1.修饰成员变量

因为类变量被类的全部对象共享,所以可用类名.类变量来访问,而实例变量只能用对象.实例变量来访问。

2.类变量的应用场景

如果某个数据只需要一份,且希望能够被共享(访问,修改),则该数据可以定义成类变量

例如:
系统启动后,要求用户类可以记住自己创建了多少个用户对象

3.修饰成员方法

4.类方法的应用场景

最常见的应用场景就是做工具类

作用:

提高了代码复用;调用方便,提高了开发效率。

5.static注意事项

this是拿到对象,而类方法不用创建对象就可以调用,所以类方法不能出现this

二、代码块-类的5大成分

成员变量-构造器-方法-代码块-内部类

如果不同的构造器中有相同内容,实例代码块可以减少冗余。

三、单例设计模式

1.设计模式

  1. 一个问题有n个解法,其中有一种解法是最优的,这个最优的被人总结出来了,称之为设计模式。
  2. 设计模式有20多种,对于20多种软件开发中会遇到的问题。

 只需要知道两点:1解决什么问题,2怎么写设计模式

2.单例设计模式

特点:确保一个类只有一个对象

写法:

  1. 把类的构造器私有
  2. 定义一个类变量记住类的一个对象
  3. 定义一个类方法,返回对象 

饿汉式单例书写模式: (获取类的对象就已经创建了对象)

 应用场景:例如任务管理器,只需要一个,就可以完成任务,避免浪费内存

懒汉式单例设计模式:(拿到对象时,才开始创建对象)--很少用的时候再调用

写法:

  1. 把类的构造器私有
  2. 定义一个类变量用于存储对象
  3. 定义一个类方法,保证第一次调用时创建一个对象,后面再调用会返回同一个对象

 

四、继承

1.认识继承

Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系

继承的特点:
--子类能继承父类的非私有成员(成员变量、成员方法)。--可以直接使用
继承后对象的创建:
--子类的对象是由子类、父类共同完成的。

子类对象是由父类公有成员模板和子类成员模板共同构成的。

2.继承的好处

减少重复代码的编写,子类有共同特征

3.权限修饰符

4.单继承,Object类

--Java是单继承的,Java的类不支持多继承,但是支持多层继承

--创建一个类,没继承别的类也会默认继承一个Object类

5.方法重写

①认识重写:

--当子类认为父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法

注意:重写后,方法的访问遵循就近原则

声明不变,重新实现

重载:重载是指在相同的作用域内使用相同的函数或操作符名称,但是参数的数量或类型(或二者)不同。这允许同一个函数名根据传入参数的不同而执行不同的任务

②常用场景

--子类重写Object类的toString()方法,以便返回对象的内容。·

6.子类访问其他成员的特点

无指定的时候遵循: 就近原则

如果父类、子类以及方法中都有相同的成员变量
想要访问子类中的成员:使用this
想要访问父类中的成员:使用super

7.子类构造器的特点

①认识子类构造器:

子类的全部构造器,都会先调用父类的构造器,再执行自己的构造器

代码上体现时,在执行子类的构造器时会默认有一条super()去调用父类的无参构造器
如果父类只有有参构造器,那么在子类构造器内得手动写一条super(父类构造器参数)

②常见场景:

父类的有参构造器为它的成员变量赋值,子类中想要方便去给父类成员赋值可以在子类构造器中加上super(父类构造器参数)。

③补充知识:this()调用兄弟构造器

--任意类的构造器中,是可以通过this(...)去调用该类的其他构造器的。

好处:可以复用兄弟构造器的代码

五、多态

1.认识多态

多态是在继承/实现情况下的一种现象,表现为:对象多态,行为多态。

对象多态理解:同一个人既会是父母的儿子,也会是男朋友,也会是公司职员
行为多态理解:同一个唱歌行为,有的对象唱的很好听,但是有的对象唱的不堪入耳

代码体现:Student和Teacher都是People的子类,且两个子类各自重写了父类run方法

对于方法,它是编译时看父类是否有此方法,但运行时看子类中的此方法
对于变量,它是编译和运行都看父类中的变量

多态的前提:有继承/实现的关系;存在父类引用子类对象;存在方法重写

2.多态的好处

  1. 在多态形式下,右边对象是解耦合的,更便于扩展和维护
  2. 定义方法时,使用父类型的形参,可以接受一切子类对象,扩展性更强,更便利

对于第一条,体现时等号右边可以随时更换不同的子类,实现不同的业务
对于第二条,形参使用父类,则实参可以用一切子类

缺点:

多态下不能使用子类的独有功能--因为方法,编译看父类,父类中没有这个独有功能

3.类型转换:

因为存在强转可能出现类型转换异常,所以推荐使用p instanceof Student,判断是否是其子类

六、final

认识final关键字

final关键字是最终的意思,可以修饰(类、方法、变量)

例如:
工具类加final不让继承
常量:staic final修饰的成员变量,建议名称全部大写,多个单词下划线连接

七、抽象类

1.认识抽象类

--在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法

修饰类,就是抽象类;修饰方法,就是抽象方法

抽象方法:只有方法签名,一定不能有方法体

2.抽象类的好处

父类知道每个子类都要做某个行为,但每个子类的情况不一样,父类就定义成抽象方法,哪个行为的方法定义为抽象方法,交给子类去重写实现,设计抽象类是为了更好地支持多态。

3.常见应用场景-模板方法设计模式

模板方法设计模式解决的问题:

如果某个方法有一部分子类是一样的,那么在父类中可以定义为抽象类,设置两个方法,模板方法中写相同的内容,不同的地方调用抽象方法,子类去重写那个抽象方法来体行为多态,并且减少冗余。

所以建议模板方法建议加final关键字,避免子类去重写。

八、接口

1.认识接口

Java提供了一个关键字interface,用这个关键字可以定义一个特殊的结构:接口
默认成员变量为常量,成员方法为抽象方法

注意:

  1. 接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类被称为实现类
  2. 一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。 

2.接口的好处-重点

  1. 弥补了类单继承的不足,一个类同时可以实现多个接口。
  2. 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。

对于第一条:单继承无法扩展其他特征,接口可以扩展其他功能,使用接口实现,可以告诉别人你有这个相应的功能
对于第二条:可以随时切换不同的对象,实现不同业务切换

3.接口的案例

若对班级的操作有两套打印方式,可以随时切换

首先定义Student类,包含Student所有信息
其次定义ClassManager,实现对班级人员录入,以及实现方法的操作平台
然后定义一个接口,包含了班级操作平台中的要实现切换的方法
最后定义两个不同的操作类,都实现这个接口,编辑不同的操作方式
在ClassManager中只需要对studentOperator后new的操作方式修改就可以实现对不同方法的切换

 4.细节:新增的三种方法

我的理解:可以拓展很多功能,便于维护,default必须有实现类,创建类才能调用;private是为其他两个方法服务,让代码更清晰;static必须用接口名来调用。

5.细节:接口的多继承

一个接口可以继承多个接口

注意:

  1. 一个接口继承多个接口,若多个接口存在方法签名存在冲突,则不支持多继承
  2. 一个类实现多个接口,若多个接口存在方法签名存在冲突,则不支持多实现
  3. 一个类继承了父类,又同时实现了接口,若父类中和接口中有同名的默认方法,实现类会优先使用父类的
  4. 一个类实现多个接口,若多个接口存在签名相同的默认方法,可以不冲突,重写方法即可

 九、内部类

是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。

 场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

1.成员内部类

就是类中的一个普通成员,类似前面的普通成员变量,成员方法。

 注意:

  1. 主程序中创建对象格式:外部类名.内部类名 对象名=new 外部类(...).new内部类(..)
  2. 像成员方法一样可以使用外部类中实例成员和静态成员
  3. 在内部类中想要使用外部类中的变量,可以使用外部类名.this.变量名

 2.静态内部类

用static修饰的内部类,属于外部类自己持有,

注意:

  1. 主程序中创建对象格式:外部类名.内部类名 对象名=new 外部类.内部类(..)
  2. 可以比作之前按静态方法一样,只能访问外部类的静态类

3.局部内部类-鸡肋

 局部内部类是定义在在方法中、代码块中、构造器等执行体中。

3.匿名内部类-重点 

①认识匿名内部类

 就是一种特殊的局部内部类;所谓匿名:就是程序员不需要为这个类声明名字。

特点:创建匿名内部类后,会编译一个子类,然后会立即创建一个子类对象出来。同时是一个子类也是一个子类对象。
作用:用于更方便地创建一个子类对象

②匿名内部类的使用场景

通常作为一个参数传输给方法

真实应用场景:使用接口或类中的方法时它的形参为一个类,就可以使用匿名内部类来实现。我们不主动编写匿名内部类,只在必须使用这种方法时使用来简化代码。

十、枚举

1.认识枚举

是一种特殊的类

注意:

  1. 第一行必须罗列的时枚举对象的名字,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
  2. 枚举类的构造器是私有的,因此,枚举类对外不能创建对象。
  3. 枚举类都是最终类,不可以被继承
  4. 枚举类中,从第二行开始,可以定义类中的其他各种成员
  5. 枚举类提供一些额外的API

2.抽象枚举

就是在枚举中定义了抽象方法,而在抽象枚举中罗列对象的名字时,会创建抽象枚举,所以要对其中的抽象方法重写

3.单例

可以使用枚举构建单例设计模式-由于构造器是私有的,对外不能构造对象

这样在外就只有X这一个C类的对象。

4.应用场景

用来表示一组信息,然后作为参数进行传输-信息标志和分类

对于第一钟,会创建一个Constant类,来储存各种常量

对于第二种,会创建一个枚举,来限制

十一、泛型

1.认识泛型

定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类、泛型接口,泛型方法、它们统称为泛型。

加了<E>后就只能使用E类型参数
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力。这样可以避免强制类型转换,及其可能出现的异常
泛型的本质:把具体的数据类型作为参数传给类型变量。

2.泛型类

在类中写方法时:                                                    可以定义多个变量

限定变量为继承指定父类的任意子类:

3.泛型接口

类实现泛型接口,就可以针对不同的类类型去重写方法

4.泛型方法

自己声明了泛型类型变量

5.通配符?

使用泛型的时候可以代表一切类型

加上extends接收的是Car和Car的一切子类的集合
若加上super接收的是Car和Car的一切父类的集合

6.泛型注意事项

编译的时候会把<>去掉,把类型进行强转

泛型不支持基本数据类型,只支持引用类型
--若想用int可以使用Interger
--若想用doublie可以使用Double

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值