(本次学习总结,总结了目前学习java遇到的一些关键字和零碎知识点)
一.static关键字
static可以用来修饰类的成员方法、类的成员变量、类中的内部类(以及用static修饰的内部类中的变量、方法、内部类),另外可以编写static代码块来优化程序性能。
1.static修饰类的成员变量
static修饰的成员变量称为静态变量或类变量:
静态变量和非静态变量的区别:
静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。
2.static修饰的成员方法
static修饰的成员方法称为静态方法:在静态方法中不能访问类的非静态成员方法和非静态成员变量。但是在非静态方法中可以访问静态成员方法和静态成员变量。
public class Student {
//静态变量
public static String name="张三";
private static String sex="男";
//非静态变量
public int age=21;
//静态方法
public static void show1(){
System.out.println(name);
System.out.println(sex);
System.out.println(age);
}
//非静态方法
public void show2(){
System.out.println(name);
System.out.println(sex);
System.out.println(age);
}
}
(可以看到这里我们无法在静态方法中调用非静态成员变量,这里会报错)
3.static修饰代码块
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。并且静态修饰的代码块最先执行.
public class Daimakuai {
private String name;
private int age;
//构造代码块:
//1.写在成员位置的代码块
//2.作用:可以把多个构造方法中重复的代码抽取出来
//3.执行时机:我们在创建本类对象的时候会先执行代码块中的构造方法
{
System.out.println("这里是构造代码块!");
}
//静态代码块:
//随着类的对象创建而加载,同时只运行一次
static{
System.out.println("这里是静态代码块!");
}
//空参的构造函数
public Daimakuai() {
}
//带参的构造函数
public Daimakuai(String name, int age) {
this.name = name;
this.age = age;
}
//get,set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
从结果我们可以看到,静态的代码块最先得到执行.
4.static修饰内部类
public class Car extends AbsCar {
//静态内部类中可以用static继续修饰内部类
static class A {
static class B {
static int num0 = 10;
}
}
//静态内部类C
static class C {
int num1 = 10;
}
//普通内部类D
class D{
int num2 =10;
}
public static void main(String[] args) {
int num = A.B.num0;
C c = new C();
int a = c.num1;
}
}
二.this关键词
this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。
1.this.属性名
大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。
当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数
public class Person {
private String name;
private String sex;
private int age;
//空参构造
public Person() {
}
//带参构造
//在构造方法中使用了 this 关键字对属性 name、sex 和 age 赋值,this 表示当前对象。
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
}
2.this.方法名
this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。
大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。
public void da() {
// 使用this引用调用da()方法的对象
this.jump();
System.out.println("正在执行da方法");
}
注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。
3.this( )访问构造方法
可以使用在构造方法当中,通过当前的构造方法调用其他的构造方法,括号中可以有参数,如果有参数就是调用指定的有参构造方法。
注意:this( ) 不能在普通方法中使用,只能写在构造方法中。在构造方法中使用时,必须是第一条语句。
public class Person {
String name;
// 无参构造方法(没有参数的构造方法)
public Student() {
this("李四");
}
// 有参构造方法
public Student(String name) {
this.name = name;
}
// 输出name和age
public void print() {
System.out.println("姓名:" + name);
}
}
三.final关键字
final 是 Java 中的一个关键字,可以用于修饰类、方法和变量。当一个类被声明为 final 时,它意味着该类不能被继承。当一个方法被声明为 final 时,它意味着该方法不能被重写。当一个变量被声明为 final 时,它意味着该变量的值不能被修改。
1.final修饰类
如果声明一个类为final类, 那么这个类就是最终类,不能被继承,一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写。
public final class Parent {
public void happy() {
System.out.println("父母");
}
}
//如果要求继承他则会报错
public class Child extends ParentClass{
}
2.final修饰方法
当final用来修饰一个方法的时候,这个方法就是最终方法,那么很明显就是说不能被覆盖重写。
使用final方法的作用:第一个作用是把方法锁定,以防任何继承类修改它的含义;第二个作用是提高效率。
public class ParentClass {
public void happy() {
System.out.println("高兴");
}
//用final关键字修饰的方法
//final修饰的方法,是一个最终方法,不能被子类去覆盖重写
protected final void play(){
System.out.println("开心的玩耍");
}
}
3.final修饰变量
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
class Animal {
private final int count = 0;
public Animal() {
//只能赋值一次,会报错
count = 1;
final Object object = new Object();
object = new Object(); //报错
}
}
注意:final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。