从零双排学java之代码块.面向对象的继承.方法重写与final

一.代码块

/*
 * 代码块
 * 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)(前提:至少两个类  并且还要有继承关系)

扫描二维码关注公众号,回复: 999124 查看本文章

 * 方法重写作用:  相当于    父类的该方法  进行升级

 * 重写:跟父类的方法  完全一致  方法体中可以书写不同的代码

 * 

 * 

 * 书写一个类  都写什么方法

 * 有参 无参构造方法  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;
	}
}




猜你喜欢

转载自blog.csdn.net/jsymax/article/details/80274195