一.代码块
/* * 代码块 * 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("我是奥迪的有参"); } }
三.方法的重写
* 方法的重载(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; } }