技术基础还是重要的..分享一下以前的笔记,梳理一下概念。
1.代码块
分为4种:局部代码块,构造代码块,静态代码块,同步代码块
1.1 局部代码块
“局部”和方法有关。用于限定变量的作用域,控制其生命周期。方法弹栈后,局部代码块中变量释放。用于及时释放内存,提高内存利用率。
1.2 构造代码块
在类中方法外出现;多个构造方法方法中相同的代码存放到一起。即,class中,方法外单独定义一对“{}”,里面写的内容就是构造代码块。
什么时候执行这个代码块?每次调用构造(创建对象时,new的括号里有参或无参均可),执行,并且在构造方法前执行。
运用场景
当这个类里所有对象,都需要具备同一个方法时,则在该类定义时,将所需执行代码用“{...}”括起,即可在创建对象时执行。
提高代码复用性。但开发中用得不多,面试可能会问。
1.3 静态代码块
在类中方法外出现,并加上static修饰;用于给类进行初始化,在类加载的时候就执行,并且只执行一次。如果是在有main函数的类里,该代码块会比static 的main函数还要提前执行。
运用场景
给类做初始化的,即,一般用于加载驱动
(一个程序启动后,驱动只要加载一次就行。而不是说游戏每创建一个角色都要再重新加载驱动。当.class加载到内存方法区时,执行一次)
1.4 同步代码块
和线程有关
2.继承(Extends)
2.1 运用场景
猫类和狗类,可以继承共同的“动物类”。动物类来封装猫、狗它们共有的属性变量和函数方法。
越往父类,就越“聚类”、抽象。越往子类,越具化,方法和变量可能越多。
2.2 好处
(1)封装,多次调用该封装。提高代码的复用性。
(2)提高代码可维护性,利于纠错
如果要在Animal里增加一个属性,则Cat和Dog里就会同时都增加,而不用逐一增加。
(3)让类和类之间产生关系,为“多态”做铺垫。
要想用多态,必须先有继承
2.3 弊端
增加了两个类(父类和子类)的耦合性。而开发原则是“高内聚、低耦合”(自己能完成,不求人一起做)
2.4 形式
Class Animal{
int legs_count;
public void eat(){...}
public void sleep(){...}
}
Class Cat extends Animal{}
Class Dog extends Animal{}
2.5JAVA类继承的特点
(1)Java只支持单继承,不支持多继承。(编译就会报错)
(而有些语言是支持多继承,格式:extends 类1,类2,...)
原因:如果C类能同时继承A和B,而A和B都有参数一致的同名函数,执行不同的功能。这样C就会乱。——多继承会有安全隐患!!
(2)Java支持多层继承(继承体系)
这样N层孙子类节点,所拥有的东西(属性、方法等)会越来越多
如果想使用这个体系(爷爷-父亲-孙子-重孙...)最全的功能,则直接创建“重孙”(最底的叶子)的实例对象。
如果想看该体系最共性的功能,就看曾祖父类(最顶端的类)
什么时候用继承?
继承其实体现的是一种关系:"is a"。假设有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
2.6 this与super的使用方法
都代表什么
this:代表当前对象的引用,谁来调用我,我就代表谁
super:代表当前对象父类的引用
使用区别
* a:调用成员变量
* this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
* super.成员变量 调用父类的成员变量
* b:调用构造方法
* this(...)调用本类的构造方法
* super(...)调用父类的构造方法
* c:调用成员方法
* this.成员方法 调用本类的成员方法,也可以调用父类的方法
* super.成员方法 调用父类的成员方法
Son s=new Son(); s.getName();//如果Son里没有getName()方法,那么就会找父类、祖父类、曾祖父类等等,直到找到。就近原则使用。
2.7有关继承的构造函数
* 子类中所有的构造方法默认都会访问父类中空参数的构造方法,而且是先运行父构造方法,再运行子构造方法。为什么?
* 因为子类会继承父类中的数据,可能还会使用父类的数据。
* 所以,子类初始化之前,一定要先完成父类数据的初始化,而构造函数都是用于初始化数据的。类似:
Class Son{
super();//先调用父类的无参构造,父类也一样再调用父类的父类无参构造。这句不写,系统也是会默认加进去。
public Son(){...}
}
* 其实:每一个构造方法的第一条语句默认都是:super()
Object类:最顶层的父类。如果不写继承的话,默认就继承Object类。
2.8注意事项子类只能继承父类所有非私有的成员(成员方法和成员变量)
虽然子类还是可以通过get\set方法来访问私有变量,但父类的私有方法是绝对不能访问的。子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
类名都不一样,而构造方法必须和类名一样,所以不可能继承构造方法来把自己的替换成父的。而且,同一个文件夹(包)里,不能有同名函数,Father构造方法不能出现在两个类里。不要为了部分功能而去继承
如果子类和父类有同名函数,则按就近原则
子类中的show会输出子类变量。但继承就是为了直接用父类的,子类替换掉,这样就没继承的意义了。
注意
调用构造方法this(...)和super(...),必须放在子类构造方法里的第一句位置。
2.10重写成员方法
形式:在子类里对一摸一样的方法,重写代码块
如果重写了xxx(),则调用http://son.xxx()会执行子类的
与重载overload的区别:
方法重写:子类中出现了和父类中方法声明一模一样的方法,参数列表也一样,全部一摸一样!与返回值类型有关,返回值是一致(或者是子父类)的。
方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关
应用场景
比如升级后的手机类,有一些功能不再适用了,那么就在后期子类继承父类后,重写父类的这些需要更新的方法。
但如果定义子类功能后,仍然想用父类原先的部分功能,可在子类方法里,直接http://super.xxx()即可。
注意事项
父类中私有方法不能被重写
子类重写父类方法时,访问权限不能更低 比如父类是public,子类变成private或default是错的,最好和父类保持一致。
父类静态方法,子类也必须通过静态方法进行重写,否则编译报错。
子类重写父类方法的时候,最好声明一模一样
3.Final
用法
修饰符,被修饰的不能不被改或继承若用于修饰类,类不能被继承希望类里所有定义的方法,都不被别人继承后改写
final Class Son(){}
若用于修饰变量,变量就变成了常量,只能被赋值一次希望别人接着做项目时,对π等变量有同一的认知解释:
public static final int FINAL_NUM; //final修饰变量时,一般会搭配public static
若用于修饰方法,方法不能被重写希望被继承后,这个方法不会被son类修改
public final void func(){}//如果是跟主方法并列放在一个类里的,都配上static省得再创建对象开堆空间了。
修饰局部变量
基本数据类型定义final,则值不能被改变。引用类型定义final,则地址值不能被改变,而对象中的属性可变。