您的位置:首页 > 编程语言 > Java开发

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

2018-05-10 22:08 211 查看

一.代码块

/*
* 代码块
* 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;
}
}




阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐