Java学习回忆录-基础语法-009

61 篇文章 0 订阅
48 篇文章 1 订阅

Java学习回忆录-基础语法-009

继承

​ 描述了类和类之间的关系.
xxx 是一个…

格式:class 子类名 extends 父类名{  }
好处:
    1. 提高了代码的复用性
    将重复代码(属性,行为),放在父类中,让子类继承父类, 子类中就不用重复编写了,直接继承,子类中只需要定义特有的属性和行为。
	2. 提高了代码的维护性
	定义类时,通过继承,定义父类,子类. 如果发现一些子类有共享的属性和行为,不用在每一个子类中添加, 找到父类,在父类中添加这些属性和行为, 子类通过继承就获取到了. 

弊端:类的耦合性增加
开发的原则:高内聚,低耦合
耦合:就是类与类的关系
内聚就是自己完成某件事的能力


特点:
	成员变量在继承中的特点:父类中有成员变量,子类中有成员变量. 
    java只支持单继承,不支持多继承。
        有些语言是支持多继承,格式:extends 类1,类2...
        如果一个类能够多继承,在继承的多个类中如果有两个一样的方法,当调用这个方法名的方法时,该调用哪个?
    java支持多层继承(继承体系)
    一个子类,可以有一个父类, 这个父类也可以有父类... 通过这样的继承,可以组成继承体系... 
    如果想用这个体系的所有功能用最底层的类创建对象,如果香烟这个体系的共性功能,看最顶层的类
        
注意事项:
    1. 子类只能继承父类所有非私有的成员(成员方法和成员变量)
        当父类的属性私有化之后,还可以通过get,set方法来实现调用,但是方法私有化之后就没有办法了
    2. 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法
    如果父类和子类中有同名的成员变量时,如果想要直接调用父类的成员变量时,可以直接使用super.成员变量名 。 
    3. 不要为了部分功能而去继承
    4. 什么时候使用继承: 继承体现的是一种关系:  xx 是 xxx 的父类,xxx属于xx
    5. 当子类中出现于父类同名的变量,使用就近原则,子类有就不用父类的
    6. 子类中的所有构造方法默认都会访问父类中空参的构造方法
        因为子类会继承父类的数据,可能还会使用父类的数据
        所以子类初始化前一定要完成父类数据的初始化。
        其实,每一个构造方法的第一条语句默认都是super(),object类最顶层的父类,如果不写super();系统会默认加上

成员变量在继承中的特点:

在子类的成员方法中,如果想要访问成员变量(这个变量可能在父类中,也可能在子类中)的查找的顺序:

1. 子类的成员方法内部找,找到了执行,如果没有找到就 2;
2. 子类的成员变量中找,找到了执行. 如果没有找到就 3;
3. 父类的成员变量中找,找到就执行, 如果没有就报错。

顺序:子类成员方法没有->子类的成员变量->父类的成员变量中找 ->报错了...

☆ 子类在新建对象的时候会默认访问父类的无参构造

super()方法和this()方法

在子类继承父类的时候,调用子类的构造方法时默认调用super()方法,
子类的每一个构造方法的第一条语句默认都是super(),
super()会访问父类的无参构造方法,object类最顶层的父类,如果不写super();系统会默认加上
this()方法是用来调用本类的构造方法,注意,不能形成递归构造方法调用
注意: 
    super方法和this方法只能存在一个;
    super(...)和this(...)必须放在构造方法的第一条语句,

注意:子类的构造方法调用前一定会调用父类的构造方法

代码块

概述:在java中使用 {} 括起来的代码被称为代码块
分类:根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)
应用:局部代码块:
        在方法中出现,限定变量的生命周期,及早释放,提高内存利用率
    构造代码块(初始化块)
        在类中方法外出现,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
    静态代码块
        在类中方法外出现,加了static修饰
        在类中方法外出现,并加上static修饰,用于给类进行初始化,在加载的时候就执行,并且只执行一次
        一般用于加载驱动
局部代码块
    写在方法中的代码块
public class ArrCharTest {
   public static void main(String[] args) {
   	{   // 这个{}里面的内容就是局部代码块,在执行完后 数据a就会释放掉,这要就提高了内存的利用率
   		int a = 10;
   		System.out.println(a);
   	}
   }
}
构造代码块
    定义在一个类中,但是在方法外,每创建一次对象就执行一次,优先于对象执行
public class StudentDemo {
	// 属性
	private String name;
	private int age;
	
	// 行为(局部方法)
	public void Study(){
		System.out.println("学生学习");
	}
	
	{ 
		System.out.println("这里是构造代码块,每次创建对象都会先执行这里");
	}
}
静态代码块
    定义在一个类中,但是在方法外,有static修饰,只在类加载的时候加载
public class StudentDemo {
	// 属性
	private String name;
	private int age;
	
	// 行为(局部方法)
	public void Study(){
		System.out.println("学生学习");
	}
	
	static {	// 只有在类加载的时候执行,主要用于初始化类中某些需要初始化的参数,一般用来加载驱动
		System.out.println("这里是静态代码块,随着类的加载而加载");
	}
}

面试题

public class FuziTest {
	public static void main(String[] args) {
		zi z = new zi();
	}
}

class fu{
	static{
		System.out.println("父类静态代码块");
	}
	{
		System.out.println("父类构造代码块");
	}
	public fu(){
		System.out.println("父类构造方法");
	}
}

class zi extends fu{
	static{
		System.out.println("子类静态代码块");
	}
	{
		System.out.println("子类构造代码块");
	}
	public zi(){
		System.out.println("子类构造方法");
	}
}
输出结果:  父类静态代码块
            子类静态代码块
            父类构造代码块
            父类构造方法
            子类构造代码块
            子类构造方法

方法重写

子类中出现了与父类中一模一样的方法时,在调用的时候后优先调用子类方法,这个就叫做重写,
但是可以通过super.方法名()来调用父类功能。
当子类需要用到父类的功能,而功能主体子类有自己特有内容时,
可以重写父类中的方法,这样,即沿袭了父类的功能,有定义了子类特有的内容
注意事项:
    父类中私有方法不能被重写
        因为父类私有方法子类根本就无法继承
    子类重写父类方法时,访问权限不能更低
        最好一值
    父类静态方法,子类也必须通过静态方法进行重写
        其实这个算不上方法重写,但是现象确实如此,静态只能覆盖静态
    子类重写父类 方法的时候,最好申明一模一样

重载和重写的区别(overload与override的区别)

重载--overload ~~~~~ 重写--override
重载可以改变返回值类型,只看参数列表
方法重写:子类中出现了和父类中方法声明一模一样的方法,与返回值类型有关,返回值是一致(或者是字父类)的
方法重载:本类中出现的方法名一样,参数列表不同的方法,与返回值无关
子类对象调用方法的时候
    先找子类本身,在找父类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值