一.代码块
/*
* 代码块
* 1.局部代码块(想到方法 )
* 书写位置:类中方法内 作用:限制作用域
* 2.构造代码块
* 书写位置:类中方法外 代码执行顺序: 系统调用的 创建对象的时候就会被执行 在构造方法之前被执行
* 作用: 当有些方法需要每一个对象都调用的时候,可以将这个方法在构造代码块中调用 (不常用)
* 3.静态代码块
* 使用关键词static修饰的代码块
* 书写位置:类中方法外 代码执行顺序:随着类的加载而加载 只加载一次,在构造代码块之前执行
* 应用场景:加载驱动 (加载数据库的驱动)
* 4.同步代码块(多线程部分)
*
示例代码: 代码中的注释数字为 执行的顺序
public class Demo02 {
static {
System.out.println("我是main方法的静态代码块"); // 1
}
public static void main(String[] args) {
System.out.println("我是main函数"); // 2
Test test1 = new Test();
Test test2 = new Test("小明");
}
}
class Test {
String name;
public Test() {
System.out.println("我是Test类 无参构造方法");//5
}
public Test(String name) {
this.name = name;
System.out.println("我是Test类 有参构造方法");//7
}
{
System.out.println("我是Test类的构造代码块"); //4 //6
}
static {
System.out.println("我是Test类的静态构造代码块"); //3
}
}
打印结果:
二.面向对象的继承
继承一些基本概念:
* 继承:
* 1.可以进行传递
* 2.继承的是 属性 和 行为(不是全部) 构造方法是不能继承的
* 3.建立 类和类 之间的关
* 继承好处:
* 1.减少代码量(提高代码复用性)
* 2.提高工作效率
* 3.增强了 类与类 之间的关系(让类和类之间的关系更加紧密)
* 继承的弊端:
* 高内聚:希望一个类中,方法与方法之间的联系加强
* 低耦合:希望 类与类之间减少联系
* 继承违反了 低耦合
* java中 只允许 单继承(通过接口实现多继承)
* java中 还允许 多层继承(继承链) A->b->c
* 当你只想使用共有方法和属性时 使用哪个类的对象?
* 一般使用继承链的最顶端的类
* 当你只使用特有方法的时候 使用哪个类的对象?
* 一般使用继承链的最末端的类
*
* 如果一个类没有写继承 默认继承Object类(基类)
*基类中的tostring方法可以 返回 在jvm中静态方法区的地址
在创建子类对象的时候,为了保证继承的完整性(不管你在创建子类对象的时候 使用的是 无参还是有参的构造方法)
系统都会默认帮你调用 父类的无参构造方法
那么在父类 没有无参的构造方法是 该怎么办?
系统会默认在子类的构造方法的第一行帮你加上 如果父类中有 有参的构造方法 却没有无参的构造方法 :
就需要在子类的 有参构造中 书写父类的有参构造
* super 和 this
* super 在子类中代表的是 父类的对象
*
* this 在字类中可以调用子类的属性 和 方法
* (当子类中 没有这个属性 或者方法的时候 就去父类中去找,找到就使用,没有就报错)
* super关键字可以在子类中 调用父类的属性 和方法
ublic class Demo07 {
public static void main(String[] args) {
Audi audi=new Audi();
}
}
class Car {
String name;
// public Car() {
// System.out.println("我是Car的无参");
//
// }
//
public Car(String name) {
this.name = name;
System.out.println("我是Car的无参");
}
}
class Audi extends Car {
public Audi() {
super("sds");
//只要你在构造方法的第一行
//调用一下父类构造方法(有参 无参都行)
System.out.println("我是奥迪的无参");
}
public Audi(String name) {
super(name); //
System.out.println("我是奥迪的有参");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/2f28319d2e84dab7e62acf4467f4e5a3.png)
三.方法的重写
* 方法的重载(Overload)(在一个类中进行)
* 方法的重写(Override)(前提:至少两个类 并且还要有继承关系)
* 方法重写作用: 相当于 对 父类的该方法 进行升级
* 重写:跟父类的方法 完全一致 方法体中可以书写不同的代码
*
*
* 书写一个类 都写什么方法
* 有参 无参构造方法 set/get方法
* 重写 toString方法输出属性
class TestC {
public void print() {
System.out.println("我是c类的 print方法");
}
}
class TestD extends TestC {
public void print() {
// 重写父类的方法的时候
// 调不调用父类的方法,根据你的需求而定
super.print();
System.out.println("我是D类的 print方法");
}
}
四.关键字final
final作用:
* 1.修饰方法 方法不能被重写
* 2.修饰类 类不能被继承
* 3.修饰变量 变量不能被修改
* 4.修饰引用数据类型 不能进行重新指向(地址不能修改了) 对象中的属性可以修改
class TestE {
// 堆内存分配的默认值是 无效的默认值
// final 修饰成员变量的时候 需要赋 初始值
// 赋值 初始值 三种方式
//一般使用final时会直接定义成 静态常量 使用类名直接调用 方便
//常量命名规范 所有字母大写 多单词用下划线分开
public static final int MAX_VALUE=10; //声明变量的时候进行赋值
public final void fun() {
}
public TestE() {
//可以在构造方法中对变量进行赋值
//num = 10;
}
{ //可以在构造代码块中进行赋值
//num=20;
}
}