一、静态
1、static(静态):可以修饰成员变量,成员方法
2、static修饰成员变量
2-1、有static修饰的成员变量叫类变量(静态成员变量),推荐使用类名.变量名访问
特点: 属于类,与类一起加载一次,在内存中只有一份,会被类的所有对象共享
2-2、无static修饰的成员变量叫实例变量(对象变量),使用对象.实例变量访问
特点:属于对象,每个对象中都有一份,只能用对象访问
代码实现:
public class Demo {
public static void main(String[] args) {
//需求1: 访问Student中的类变量name,赋值张三
//方式1: 类名.类变量(推荐)
Student.name = "张三";
//方式2: 对象名.类变量(不推荐)
Student student = new Student();
student.name = "李四";
//需求2: 访问Student中的实例变量age,赋值18
student.age = 18;
//需求3: 获取Student的name和age的值,打印在控制台
System.out.println(Student.name);
System.out.println(student.age);
}
}
class Student {
//定义1个类变量: 记录学生姓名name
//有static修饰,属于类,随着类的加载而加载,在计算机中只有一份,会被类的所有对象共享
static String name;
//定义1个实例变量, 记录学生的年龄age
//无static修饰,属于每个对象自己
int age;
}
2-3类变量的应用场景:
类变量是所有对象共享的,只有一份;例如记录对象创建了几次
3、static修饰成员方法
3-1、static修饰的成员方法叫类方法(静态方法),推荐使用类名.方法名访问
特点:属于类,可以直接用类名访问,也可以用对象访问
3-2、无static修饰的成员方法叫实例方法(对象的方法),使用对象.实例方法访问
特点:属于对象,只能用对象访问
代码实现:
public class Demo1 {
public static void main(String[] args) {
//需求1: 类方法调用
// 类名.方法名() [推荐]
Student.printHello();
// 对象名.方法名() [不推荐]
Student student = new Student();
student.printHello();
//需求2: 实例方法调用
//对象名.方法名()
student.printHelloWorld();
}
}
class Student {
//编写一个类方法(使用Static修饰方法)打印hello
public static void printHello(){
System.out.println("hello");
}
//编写一个实例方法(不使用Static修饰方法)打印HelloWorld
public void printHelloWorld(){
System.out.println("HelloWorld");
}
}
3-3、static修饰成员方法的应用场景
类方法最常见的应用场景是做工具类
例如:单独创建一个工具类,完成求两个整数的最大值、最小值、总和的方法
代码实现:
public class Demo {
public static void main(String[] args) {
//调用工具类的方法完成功能
int x=10;
int y=20;
System.out.println(MathUtil.max(x,y));
System.out.println(MathUtil.min(x,y));
System.out.println(MathUtil.sum(x,y));
}
}
//需求: 单独创建一个工具类,完成求两个整数的最大值、最小值、总和的方法
class MathUtil {
//私有构造器
private MathUtil(){}
//两个整数最大值
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;
}
//两个整数总和
public static int sum(int a, int b) {
return a + b;
}
}
3-4、工具类就是一些完整的功能,经常使用的方法所在的类
3-5、为什么工具类要用类方法,而不是用实例方法?
类方法可以不创建对象,直接调用,使用方便,节省内存,提高代码的复用性
实例方法需要创建对象来调用,浪费内存
3-6、工具类定义时有什么建议
工具类不需要创建对象,建议将工具类的构造器私有化
private MathUtil(){}
4、static的注意事项
类方法中可以直接访问类的成员,不可以直接访问实例成员
实例方法中既可以直接访问类成员,也可以直接访问实例成员
实例方法中可以出现this关键字,类方法中不可以出现this关键字
5、代码块:代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)
5-1、静态代码块:
格式:ststic{ }
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次
作用:完成类的初始化,例如:对类变量的初始化赋值
5-2、实例代码块(不常用只了解即可):
格式:{ }
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。
二、继承知识点
1、继承就是用extends关键字,让一个类和另一个类建立起一种父子关系
Public class A extend B{
}
特点:子类可以继承父类非私有的成员(成员变量、成员方法)
继承后对象的创建:子类的对象是由子类、父类共同完成的
2、使用继承的好处:减少重复代码的编写,提高了代码的复用性
3、权限修饰符:
用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围
private<缺省<protected<public
Private:只能本类
缺省:本类、同一个包中的类
Protected:本类、同一个包中的类、子孙类中
Public:任意位置
4、单继承:Java是单继承的,Java中的类不支持多继承,但是支持多层继承
5、方法重写:
当子类觉得从父类中继承到的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖掉继承到的这个方法,这就是方法重写
注意:重写后,方法的访问会遵循就近原则
6、方法重写的注意事项:
1.在重写的方法上标注Override注解,可以指定java编译器,检查我们方法重写的格式是否正确
2.子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public > protected > 缺省)
3.重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
4.私有方法、静态方法不能被重写,如果重写会报错的
7、在子类中访问成员(成员变量、成员方法)遵循就近原则,局部没有找子类成员,子类成员没有找父类成员你,父类没有就报错
8、如果子父类中出现了重名的成员,此时一定要在子类中使用父类就要使用super关键字
Super.父类成员变量/父类成员方法
9、子类构造器
特点:子类的全部构造器,都会先调用父类的构造器,再执行自己
默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有),它会调用父类的无参数构造器
如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(….),指定去调用父类的有参数构造器
应用场景:在子类构造器中调用父类的有参构造器给父类传递参数来完成父类对象的初始化
补充:this(…)调用兄弟构造器
任意类的构造器中,是可以通过this(…) 去调用该类的其他构造器
this(...)和super(…)使用时的注意事项:
this(…) 、super(…) 都只能放在构造器的第一行,因此,有了this(…)就不能写super(…)了,反之亦然