文章目录
代码块de概述和分类(面试的时候问,开发的时候用的少)
什么是代码块呢?在java中,用{}括起来的代码叫做代码块。代码块根据位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。(多线程中的类容)
- 局部代码块:在方法中出现。限定变量生命周期,及早释放,提高内存利用率。
- 构造代码块(初始化块),在类中方法外出现。将多个构造方法相同的代码放在一起,每次构造都执行,并且在构造方法之前执行。
- 静态代码块。在类中方法外出现,并加上static修饰,用于给类做初始化,在加载类的时候执行,并且只执行一次。
面试题:
class Student {
static {
System.out.println("Student 静态代码块");
}
{
System.out.println("Student 构造代码块");
}
public Student() {
System.out.println("Student 构造方法");
}
}
class Demo2_Student {
static {
System.out.println("Demo2_Student静态代码块");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
程序输出什么呢?
程序会输出:
Demo2_Student静态代码块
我是main方法
Student 静态代码块 这个只在内加载进内存的时候加载一次。
Student 构造代码块
Student 构造方法
Student 构造代码块
Student 构造方法
继承
继承的意义是什么呢?让类与类之间产生关系,子父类关系。
继承的好处:
-
提高了代码的复用性
-
提高了代码的维护性
-
让类与类之间产生了关系,是多态的前提
继承的弊端: -
类的耦合变强了
-
开发的原则:低耦合,高类聚
java中继承的特点
java只支持单继承,不支持多继承。简单点的讲。就是一个儿子只能有一个父亲。但是Java支持多级继承父,子,孙。如果想用这个继承体系所有的功能用最低层创建类。如果想看这个体现的共性功能看最顶层的类。
继承的注意事项
- 子类能继承父类的所有非私有成员(成员方法,成员变量)
- 子类不能继承父类的构造方法。但是可以通过super调用父类的构造方法以及父类的方法。
- 不要为了部分功能而去继承
那么什么时候我们使用继承呢?继承体现的是一种包含关系。a is b。b要包含a。例如学生是人,老师也是人。那么Student类和Teacher类就可以继承Person类。
继承中成员变量的关系
this代表当前对象的引用,谁来调用我,我就代表谁。super代表当前对象父类的引用。
this和super有什么区别呢?
- this.成员变量(成员方法) 可以用来调用本类的成员变量,也可以用来调用父类的成员变量
- super.成员变量 (成员方法)只可以用来调用父类的成员变量。
this(…) 可以用来调用本类的构造方法。super(…)用来调用父类的构造方法。
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法。为什么呢?因为子类继承父类的数据,可能还会使用父类的数据。所以子类初始化完成之前必须初始化父类。其实每个构造方法的第一条语句默认都是super()。Object类是顶层父类。
继承中构造方法的注意事项
父类没有无参构造方法,子类怎么办?可以用super()解决,也可以用this解决。
this解决方法:
class Father {
private String name; //姓名
private int age; //年龄
public Father() { //空参构造
System.out.println("Father 空参构造");
}
public Father(String name,int age) { //有参构造
this.name = name;
this.age = age;
System.out.println("Father 有参构造");
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends Father {
public Son() { //空参构造
this("王五",25); //本类中的构造方法
//super("李四",24); //调用父类中的构造方法
System.out.println("Son 空参构造");
}
public Son(String name,int age) { //有参构造
super(name,age);
System.out.println("Son 有参构造");
}
}
面试题:
看程序写结果1
class Fu{
public int num = 10;
public Fu(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num = 20;
public Zi(){
System.out.println("zi");
}
public void show(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
class Test1_Extends {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
输出:Fu Zi 30 20 10
看程序写结果2
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
Zi z = new Zi(); 请执行结果。
输出结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
方法重写概述及其应用
什么是方法重写,重写指父子类出现一模一样的方法(返回值类型可以是子父类)。
那么什么时候应该进行方法重写呢?当子类需要父类的功能时,而功能主体类有自己的特有内容时,可以重写父类中的方法。这样,即沿袭了父类中的方法,又定义了子类特有的内容。
方法重写注意事项
- 父类中私有方法不能被重写。因为父类私有方法根本就不能被继承。
- 子类重写父类的时候访问权限不能更低,最好一致。
- 父类的静态方法,子类也必须通过静态方法重写。其实这个不算重写。静态只能覆盖静态。
- 子类重写父类的时候,最好声明一模一样。
面试题:
Override和Overload的区别?Overload能改变返回值类型吗?Overload能改变返回值。Overload只看参数列表。
方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
方法重载: 本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
子类对象调用发放的流程。先找子类有的,没有就找父类的。就近原则。
final关键字修饰类以及变量的特点
- 修饰类 类不能被继承
- 修饰变量 变量的值不能变,只能被修饰一次
- 修饰方法 方法不能被重写
final关键字修饰局部变量
final修饰基本类型是值不能改变。final修饰引用类型是地址值不能被改变,而里面的value可以被改变。
final修饰变量初始化的时机
可以直接赋值,也可以放在构造方法中初始化。两个只能取其中一个。且放在构造方法中赋值,系统不会给其默认值。