一、静态 static
(一)定义
static是静态的意思,static可以修饰成员变量或者修饰方法。
static关键字的使用,它可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的,放在静态区中,没有static修饰的成员变量和方法则是属于对象的。
static关键字在Java开发非常的重要,对于理解面向对象非常关键。
(二)static修饰成员变量
有static修饰成员变量,说明这个成员变量是属于类的,这个成员变量称为类变量或者静态成员变量。因为类只有一个,所以静态成员变量在内存区域中也只存在一份。所有的对象都可以共享这个变量。
定义格式:
修饰符 static 数据类型 变量名 = 初始值;
//举例
public class Number {
private static int num = 1;
}
静态成员变量的访问:
直接用类名.变量名访问,或者先创建一个类的对象,再用对象名.变量名访问
public static void main(String[] args){
System.out.println(Number.num); //1
Number number = new Number;
System.out.printl(number.num)
}
区分:
无static修饰的成员变量属于每个对象的, 这个成员变量叫实例变,实例成员变量属于每个对象,必须创建类的对象才可以访问。
(三)static修饰成员方法
有static修饰成员方法,说明这个成员方法是属于类的,这个成员方法称为类方法或者静态方法,直接用类名访问即可。因为类只有一个,所以静态方法在内存区域中也只存在一份。所有的对象都可以共享这个方法。
与静态成员变量一样,静态方法也是直接通过类名.方法名称即可访问。
定义格式:
public class Student{
public static void study(){
System.out.println("学生在学习");
}
}
访问:
public static void main(String[] args){
Student.study();
}
区分:
无static修饰的成员方法属于每个对象的,这个成员方法也叫做实例方法。
需要注意的是:实例方法是属于每个对象,必须创建类的对象才可以访问。
格式:对象.实例方法
注意事项:
1、类方法中可以直接访问类成员,不可以直接访问实例成员
2、实例方法中及可以直接访问类成员,也可以直接访问实例成员
3、实例方法中可以出现this关键字,类方法中不可以出现this
(四)类方法的常见应用场景
类方法最常见的应用场景是做工具类。
在开发中会有一些非常实用的、具有独立功能的方法,而且希望这些方法可以被重复使用,就像一个个小工具一样 这些方法所在的类,就称为是工具类,而工具类中的方法,习惯上设置为类方法。
public class XxxxUtil {
//求最大值
public static int max(int a, int b) {
return a > b ? a : b;
}
//求最小值
public static int min(int a, int b) {
return a < b ? a : b;
}
}
相比于实例方法,类方法可以直接用类名调用,比较方便,而且不用创建对象,节省内存。
工具类没有创建对象的需求,建议将工具类的构造器进行私有。
(五)代码块
代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为两种:
1、静态代码块
格式:static { }
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次
作用:完成类的初始化,例如:对类变量的初始化赋值
2、实例代码块
格式: { }
特点:每次创建对象时,执行实例代码块,并在构造器前执行
作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值
二、继承
(一)概述
多个类中存在相同属性和行为时,我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可,其中,多个类可以称为子类,单独被继承的那一个类称为父类、超类(superclass)或者基类。
继承:就是子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。
好处:
1、提高代码的复用性(减少代码冗余,相同代码重复利用)
2、使类与类之间产生了关系
继承的格式
class 父类 {
...
}
class 子类 extends 父类 {
...
}
注意:Java是单继承的,一个类只能继承一个直接父类,跟现实世界很像,Java中的子类是更加强大的。可以多层继承,例如一个儿子不能同时有两个爸爸,但是可以有爷爷,那么儿子的能力就等于爷爷和爸爸和自己的相加
(二)权限修饰符
权限修饰符用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围。
private:修饰的成员只能被本类中的成员访问
缺省(什么都不写):修饰的成员只能被本类和同包中的类的成员访问
protected:修饰的成员能被本类、同包中的类、子孙类中的成员访问
public:修饰的成员能被任意位置的成员访问
(三)方法重写
当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法。声明不变,重新实现。
重写后,方法的访问会遵循就近原则
注意事项:
1、在重写的方法上标注Override注解,可以指定java编译器检查我们方法重写的格式是否正确
2、子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限( public > protected > 缺省 )
3、重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
4、私有方法、静态方法不能被重写,如果重写会报错
示例代码:
父类Father有一个makeFriend方法,子类Son继承后觉得这个方法不好,便对该方法重写。重写的方法名称,返回值类型,参数列表(如果有的话)都和父类中的方法相同。
public class Demo {
public static void main(String[] args) {
Son son = new Son();
son.makeFriend();
}
}
class Father{
//交朋友
public Father makeFriend(){
System.out.println("通过写信交朋友");
return null;
}
}
class Son extends Father{
//交朋友
@Override
public Father makeFriend(){
System.out.println("通过微信交朋友");
return null;
}
}
(四)子类中访问其他成员的特点
1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的:
先子类局部范围找,
然后子类成员范围找,
然后父类成员范围找,如果父类范围还没有找到则报错。
2、如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的,可以通过super关键字,指定访问父类的成员:super.父类成员变量/父类成员方法
3、super和this的用法格式
this.成员变量 -- 本类的
super.成员变量 -- 父类的
this.成员方法名() -- 本类的
super.成员方法名() -- 父类的
(五)子类构造器的特点
1、子类中的全部构造器,都必须先调用父类的构造器,再执行自己
2、super(...) -- 调用父类的构造方法,根据参数匹配确认
3、this(...) -- 调用本类的其他构造方法,根据参数匹配确认
4、this和super不能同时出现,他们都必须是在构造方法的第一行