1.代码块
什么是代码块?
由一对花括号{}括起来的代码就是代码块
代码块的分类?
局部代码块,构造代码块,静态代码块
什么是局部代码块?
定义在方法中的代码块就是局部代码块
什么是构造代码块?
定义在类中,方法外的代码块就是构造代码块
什么是静态代码块?
在构造代码块前面加上static关键字就是静态代码块
局部代码块,构造代码块和静态代码块的区别?
局部代码块:由于是存在方法内,它的作用是让局部变量尽可能早的从内存中消失,调高效率
构造代码块:将一个类中所有的构造方法里的共性的内容抽取出来,放到构造代码块中,这样写方便,每次创建对象都会执行,并且优先于构造方法执行
静态代码块:由于是静态的,所有是随着类的加载而加载,所以只能执行一次,是在第一次创建该类对象的时候执行那一次,之后不管常见该类对象多少次,静态代码块都不会再执行了
子父类之间的构造代码块,静态代码块和构造方法的执行顺序?
父类静态代码块 --> 子类静态代码块 --> 父类构造代码块 --> 父类构造方法 --> 子类的构造代码块 --> 子类构造方法
2.继承
什么是继承?
一个类的对象可以使用另一个类的对象的成员变量和成员方法,就被称为继承
继承的格式?
class 类B {}
class 类A extends 类B {
}
类A 是 子类
类B 是 父类
继承的好处?
提高了代码的复用性
让类与类之间产生了一种关系,它是多态的前提(以后学)
继承的特点?
Java中类只支持单继承,不可以多继承,可以多层继承,不可以循环继承
当我们使用继承的时候需要注意哪些问题?
子类不能使用父类里私有成员变量和成员方法
那我们要是想去使用该怎么办呢?
可以在父类里面创建一个公共的方法,在方法里去调用父类里私有的成员,然后我们子类里就可以直接只用父类的公共的方法,从而间接的使用了私有成员
子类不能继承父类的构造方法
我们不能单单为了获取某个功能去继承一个类
我们在什么时候可以使用继承?
当两个类之间存在“is a”的关系的时候
子父类之间成员变量的关系?
父类中有一个成员变量,子类中有一个成员变量,子类中的成员方法里有一个局部变量
如果这三个变量的名字都不相同的话
例:
class Fu {
int i = 1;
}
class Zi extends Fu {
int j = 2;
public void print() {
int z = 3;
System.out.println(z);//3
System.out.println(j);//2
System.out.println(i);//1
}
}
如果这三个变量的名字都相同的话
例:
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
public void print() {
int i = 3;
System.out.println(i);//3
System.out.println(i);//3
System.out.println(i);//3
}
}
通过查看结果,我们都知道打印出来的都是3,那如果我们想分别打印出三个变量的结果,该怎么办呢?
例:
class Fu {
int i = 1;
}
class Zi extends Fu {
int i = 2;
public void print() {
int i = 3;
System.out.println(i);//3
System.out.println(this.i);//2
System.out.println(super.i);//1
}
}
子父类之间构造方法的关系?
子类里面所有的构造方法的第一行都有一个隐藏的super(),前提:第一行不是this();
子类里的构造方法的第一行要么是super(...),要么是this(...),他们不能同时存在
子类里的所有的构造方法里至少有一个构造方法的第一行是super(...)
例:
class Fu {
public Fu() {}
}
class Zi extends Fu {
public Zi() {
//super();
}
}
System.out.println("---------------");
class Fu {
public Fu(String name) {}
}
class Zi extends Fu {
public Zi() {
this("小明");
}
public Zi(String name) {
super();
}
}
子父类之间成员方法的关系?
父类中有一个成员方法,子类中有一个成员方法
如果这两个方法的名字都不相同
例:
class Fu {
public void printFu() {
System.out.println("Fu");
}
}
class Zi extends Fu {
public void printZi() {
System.out.println("Zi");
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.printFu();//Fu
zi.printZi();//Zi
}
}
如果这两个方法的名字都相同
例:
class Fu {
public void print() {
System.out.println("Fu");
}
}
class Zi extends Fu {
public void print() {
System.out.println("Zi");
}
}
class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.print();//Zi
zi.print();//Zi
}
}
通过结果可以看出,打印出来的内容是一样的,这里面就印出来一个知识点,叫方法的重写
什么是方法的重写(覆盖)?
子类中出现与父类方法声明完全一样的方法,就被称为方法的重写
我们在使用重写的时候需要注意哪些问题?
子类不能重写父类中私有的成员方法
子类不能重写父类被final修饰的成员方法
子类方法的访问权限要大于或者等于父类中想要重写的那个方法的访问权限
静态方法只能重写静态方法
方法的重写和方法的重载的区别?
方法的重写:子类中出现与父类方法声明完全一样的方法,就被称为方法的重写
方法的重载:方法的名字相同,参数列表不同(参数的数据类型不同,个数不同,对应的顺序位置不同)
3.super关键字
什么是super关键字?
super关键字是父类内存空间的一个标识,在用法上可以理解为父类对象的引用,但是我们不能说super就是父类对象的引用,调用方法跟this是一样的
调用成员变量:
this.name
super.name
调用成员方法:
this.eat();
super.eat();
调用构造方法:
this(...);
super(...);
4.final关键字
什么是final关键字?
它是一个修饰符,代表最终的意思,它可以修饰类,变量和成员方法
final关键字的特点?
被final修饰的类不可以被继承
被final修饰的变量是常量
被final修饰的方法不可以被重写
|
|