代码块: 一对大括号括起来的代码
种类:
1:局部代码块
位置: 方法中
作用 限制了局部变量的生命周期(作用域问题)
2:构造代码块
位置: 在类中 方法外
调用顺序: 在你创建对象的时候 如果你有构造代码块
系统会帮你先调用构造代码块 在调用构造方法
3:静态代码块(使用 static 来修饰)
位置: 再类中 方法外
特点: 只加载一次 并且随着类的加载而加载
4:同步代码块(属于多线程)
代码块
{
int num = 3;
System.out.println(num);
局部代码块
在方法里面的代码块
构造代码块
在类里 不在方法里面的代码块
静态代码块
也是在类里 不在方法里面的代码块 但是前面加上了static
继承
特点:
1.能够减少重复的代码
2.可以把类中相同的代码 抽出来 写成一个父类
弊端: 高内聚 低耦合
使用继承: 要符合继承逻辑
继承链接了类与类之间的关系
继承时要写关键字 extends
class 子类 extends 父类{}
例如
创建一个猫类 狗类
思考: 猫 和 狗的共同点—>都是动物
所以先创建一个动物类
class Animal{
String color;
int leg;
public void sayHi(){
System.out.println(color + "---" + leg);
}
}
class Cat extends Animal{
}
calss Dog extends Animal{
}
这里面的cat
和dog
都是Animal
的子类 通过Animal
这个类把猫和狗共同有的属性都合在一起 达到了少写代码 减少工作量
java中的继承
1.java中只允许单继承 不允许多继承 但是可以通过接口来实现多继承
2.java中允许 多层继承 就是在子类的下面还可以有子类 父类的上面还可以有父类 java中最顶端的类Object
类(基类)
例子
写一个多层继承
class A{
String name ;
public void sayHi(){
System.out.println("name");
}
}
class B extends A{
}
class C extends B{
}
可以看到这里C继承了B 而B继承了A
这就是多层继承
继承中的构造方法
注意: 继承中的构造方法是不能被继承的
虽然不能被继承 但我们可以直接调用父类里面的构造方法
但是如果 你没有调用父类的构造方法的话
系统就会帮你调用父类里面的无参构造方法
而且你 有参无参的构造方法 只要你没有调用父类构造
系统都会帮你调用 这是为了继承的完整性
this和super在类中的区别
this在类中代表本类的对象(当前类的对象)
super在类中代表父类的对象
this.属性 —>可以调用到当前类的属性 如果当前类没有属性 会去父类里面找
super.属性 —>可以调用到父类的属性
this(); —>调用本类的构造方法
super(): —>调用父类的构造方法
当你没有父类的构造方法时 系统会给你一个无参的构造方法
当父类没有无参的构造方法(就是有 有参的构造方法)的时候 子类可以指定调用有参的构造方法
Override —> 方法的重写—>子类和父类的方法一致
Overlood —> 方法的重载
当子类的方法相对于父类的方法有了升级 这时可以使用方法的重写
例子
class IOS8{
public void siri() {
System.out.println("我能说英文和中文");
}
}
class IOS9 extends IOS7{
@Override
public void siri() {
super.siri();
System.out.println("功能升级 我能说中文中的粤语了");
}
}
这里的@Override
就标识着 这个方法是重写父类的方法
final 修饰符
1.修饰类 —> 不能被继承
2.修饰变量 —> 不能被修改 —>相当变成了常量
3.修饰方法 —> 不能被重写
final在赋值初值的时候有两种方法
1.直接给初值
2.从构造方法中赋值