Day 10开篇:
"今天java基础主要学习了面向对象的构造方法的概念,特征,作用,分类,注意事项,JavaBean;代码块,继承的概念,特点,好处,缺点,this和super的区别,继承的注意的问题,构造方法的关系,extends关键字等。 "
知识点反馈:
今天的知识点总结思维导图
一. 构造方法
1. 构造方法的特征:
(1)他的名字和类名必须完全一致
(2)构造方法没有返回值,连void也不存在
(3)不能被任何的修饰符进行修饰(权限修饰符除外)
(4)不能有return语句返回值
2. 构造方法的作用:
创建对象;给对象进行初始化
例:String name = null;
这个等于null,也有赋值的过程,这个过程是谁完成呢?
构造器完成的,这个过程被称之为隐式赋值
3. 构造器的分类:
(1)隐式无参构造器(系统默认提供)
(2)显式定义一个或多个构造器(无参、有参,自己提供)
4. 构造器的注意事项:
(1) Java语言中,每个类都至少有一个构造器
(2) 默认构造器的修饰符与所属类的修饰符一致
(3) 一旦显式定义了构造器,则系统不再提供默认构造器(一般我们即使提供了带参,一般也会自己手动的写上一个无参)
(4) 一个类可以创建多个重载的构造器(构造器的名字既然和类名一致,那么是不是意味着,同一个类当中只能出现一个名字的构造;这种情况其实就会造成构造重载:当一个构造方法无法满足我们的需求的时候,定义多个同名的构造方法。就是所谓的构造重载)。
(5) 父类的构造器不可被子类继承
(6) 所有的对象被实例,一定会去调用该类的构造方法
5. JavaBean:
(1) 定义:JavaBean其实就是一个Java的可重用组件
(2) JavaBean必须具备特征:
<1>具备封装思想
<2>类必须是公共
<3>必须提供一个无参构造(必须是公共),如果你对一个构造器进行了私有化,那么也就意味其他人无法通过这个构造器创建对象
二. 代码块
1. 定义:在Java语言当中,用{}包裹起来的被称之为代码块。
2. 代码块的分类:
(1)局部代码块:位置是在方法的范围,作用是为了限制某一段代码只能在限制的区域生效,其实就是限制作用范围。
举例:
mian(){
{
//code
}
}
(2)构造代码块:位置是在方法的范围,作用是为了限制某一段代码只能在限制的区域生效,其实就是限制作用范围
当你的这个类,存在多个构造方法被重载,且每一个重载有一个一模一样的代码的时候,可以将这些代码单独的提取出来,
放到构造代码块当中,减少了代码的编码量。
举例:
class Demo{
{
//code
}
}
(3)静态代码块:位置是类的成员位置,这个代码块使用static进行修饰。
他主要的作用是,一般是类的数据进行初始化、一些代码片段只需要被执行一次的时候、当某一些代码片段是需要被共享的时候
举例:
class Demo{
static{
//code
}
}
3. 执行顺序:静态的代码块 > 构造代码块 > 构造方法
4. 执行特点:静态代码块只会被执行一次;构造代码块、构造方法每一次实例化对象都会执行。
三. 继承
1. 定义:把多个类当中,相同的属性和行为进行单独提取到一个独立类
2. 如何实现继承?
java提供了一个关键字:extends
3. 格式: class 子类名 extends 父类名{}
4. 继承的好处:
(1)避免了代码的冗余
(2)提高了代码复用
(3)提高了代码的维护性
(4)让每个类之间产生了联系,是多态必学的
5. 继承的弊端:
其实就是他的"让每个类之间产生了联系,是多态必学的",高内聚(就是自己独立完成工作能力),低耦合(类和类之间的联系)
"牵一发而动全身"
6. 继承的特点:
(1)java当中的继承只支持单根继承,不支持多根继承
例如:class Son extends Father,GrandFather{} //错误
(2)不过java支持多层继承
例如:class Father extends GrandFather{}
class Son extends Father{}
7. 继承的注意的问题:
(1)子类无法访问父类的私有属性和私有方法
(2)子类无法继承父类的构造,但是可以通过一些手段进行访问(super)
(3)不要仅为了获取其他类中某个功能而去继承
例如; class A{
public void show1(){}
public void show2(){}
public void show3(){}
}
class B extends A{
//在编写B类的时候,你发现A类有一个show2方法是可以自己用到的,所以你应该考虑使用继承了
//如果你使用了继承,你要考虑show1和show3要不要用?
//如果不要用,那么这个两个方法同样会被继承下来(拷贝到你类B的内存当中)
}
8. 继承,在什么时候使用?
继承的前提一定是要实现一个is-a的原则(B是A的某一种)
假设法:如果有一个A/B类,只有B类是A类的某一种,或者A类下面能够兼容B类就可以使用继承。
9. 成员变量查找的顺序问题:
(1)a.子类的成员变量和父类的成员变量名字冲突的时候
1.先去局部访问去选择,如果就有执行
2.再去本类的成员位置去寻找,有就执行
3.本类仍然不存在,则去父类的成员变量去选择
4.父类依旧不存在,就去父类的父类的去选择,到了顶层父类仍然不存在,则报错。
(2)不行,我偏偏要访问父类的数据
1.访问局部变量,直接写变量名
2.访问成员变量,写上this
3.访问父类变量,如果命名冲突,可以参考this一样的道理
访问的是父类的空间:super
10. this和super的区别:
this:本类对象的应用,哪个对象进行调用即代表哪个对象的堆空间
super:代表的是父类存储空间的标识(就是父类的地址值),子类就可以通过这个地址值去访问父类空间
11. this和super操作:
(1)调用成员方法:
this.成员方法 调用的本类的方法
super.成员方法 调用的是父类的成员方法
(2)调用成员变量:
this.成员变量 调用的本类的成员变量
super.成员变量 用的是父类的成员变量
(3)调用构造方法:
this.(...) 调用本类构造,但是this必须是第一句,而且只能是构造方法里面
super(...) 调研是父类构造,但是super必须第一句,而且只能是在构造方法里面
注意:this和super不能同时存在。因为避免同一个被子类和父类反复初始化
12. 构造方法的关系:
(1)子类当中所有的构造方法,默认第一句都是super(你不写,默认访问父类无参)
(2)为什么?因为子类是不是要继承父类的数据? 这个父类的数据谁来初始化?是不是父类的自己的构造方法。
所以子类在自己初始化之前,是不是想要解决好父类初始化的问题,不然你怎么使用父类的数据呢?
一般父类一定要提供一个无参构造,因为子类默认访问父类无法,否则子类无法实例。
13. extends关键字:
(1)Java中使用extends关键字实现类的集成机制
(2)通过继承子类自动拥有了基类(superclass)的所有成员(成员变量和成员方法)
(3)Java只支持单继承
(4)一个子类只能有一个基类,一个基类可以派生出多个子类
来源:CSDN
作者:Andia
链接:https://blog.csdn.net/weixin_45406656/article/details/104202781