7.JAVA面向对象之继承

一、继承(关键字extends)

1.1概述

继承是面向对象最显著的一个特性。

继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类/超类/基类。

这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

提高复用性:只要继承父类,就能有一样的功能

1.2特点

1、 使用extends关键字

2、 相当于子类把父类的功能复制了一份

3、 java只支持单继承

4、 继承可以传递(爷爷,儿子,孙子的关系)

5、 不能继承父类的私有成员

6、 继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展

7、 像是is a 的关系

1.3练习

package cn.tedu.oop;
//测试继承
public class Test5 {
	public static void main(String[] args) {
		new zi().eat();
		new zi().sleep();
//		new zi().money = 89;//继承这样写无效,无法更改父类的值
		System.out.println(new zi().money);
		sunzi sz = new sunzi();//继承的传递性
		sz.eat();
		sz.sleep();
		System.out.println(sz.money);
	}
}
class fu{//同一包里不可有相同名字,否则报错
	double money = 85;
	public void eat() {
		System.out.println("吃肉");
	}
	public void sleep() {
		System.out.println("睡觉觉");
	}
}
class zi extends fu{
	//子类把父类的功能复制一份
}
class sunzi extends zi{   }

二、super关键字

2.1概述

1、 在子类中用,用来调用父类的功能

2、 super代表父类的一个引用对象

3、 和this一样,出现在构造方法里,必须出现在第一行

三、方法重写(Override)

3.1概述

1、 继承后,子类就拥有了父类的功能,发生在父子类里的关系。

2、 那么在子类中,可以添加子类特有的功能也可以修改父类的原有功能(修改就要重写)

3、 子类中方法签名与父类完全一样(包括方法的返回值,方法名和参数列表,完全一致)时,会发生覆盖/复写操作,相当于修改功能

注意:

1、父类中的私有方法不能被重写

2、子类重写父类方法时,修饰符要大于等于父类修饰符的权限

3.2练习

3.2.1成员变量的使用

package cn.tedu.oop;
// --测试继承里的成员变量的使用
public class Test1 {
	public static void main(String[] args) {
		zi z = new zi();
		z.show();
	}
}
class fu{
	String name = "白小纯";
	public void eat() {
		System.out.println("吃饭饭");
	}
	public void sport() {
		System.out.println("跑步步");
	}
}
class zi extends fu{
	String name = "王林";
	int age = 20;
	public void show() {
		int age = 10;
		System.out.println(age);//就近原则
		System.out.println(this.age);//调用本类的成员变量
		System.out.println(name);
		System.out.println(super.name);//使用父类资源
	}
}

3.2.2继承里的方法使用

package cn.tedu.oop;
//测试 继承里的方法
public class Test2 {
	public static void main(String[] args) {
		zi1 z = new zi1();
		z.eat();
		z.show();
		z.study();
		new fu1().show();//遵循OCP原则
	}
}
class fu1{
	public void show() {
		System.out.println("访谈节目");
	}
	public void eat() {
		System.out.println("吃东西");
	}
}
class zi1 extends fu1{
	public void study() {
		System.out.println("学习历史");
	}
	public void show() {
		System.out.println("访谈节目2");
	}
}

3.2.3继承里的构造方法使用(构造方法不能被继承)

package cn.tedu.oop;
//测试继承里的构造方法
public class Test3 {
	public static void main(String[] args) {
		new zi2(); 
		new zi2(2); 
		
	}

}
class fu2{
	public fu2() {
		System.out.println(1);
	}
	public fu2(int age) {
		System.out.println("年龄");
	}
	public fu2(String name) {
		System.out.println("名字");
	}
}
class zi2 extends fu2{
	//在2前面先输出1,因为隐藏super(),会自动调用父类的无参构造方法
	public zi2() {
//		super();//必须放在方法里,会自动调用父类的无参构造方法
		super(2);//触发父类的含参构造方法
		System.out.println(2);
	}
	public zi2(int ID) {
		System.out.println("学号");
	}
	public zi2(char sex) {
		System.out.println("性别");
	}
}

3.3拓展

3.3.1this和super的区别

1、 this代表本类对象的引用,super代表父类对象的引用。

2、 this用于区分局部变量和成员变量

3、 super用于区分本类变量和父类变量

4、 this.成员变量  this.成员方法()  this(【参数】)代表调用本类内容

5、 super.成员变量  super.成员方法()  super(【参数】),代表调用父类内容

6、 this和super不可以同时出现在同一个构造方法里,他们两个只要出现都得放在第一行。

3.3.2重写与重载的区别(Overload和Override的区别)

1、重载:是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同

2、重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型

3、重写是父类与子类之间多态性的一种表现

4、重载是一类中多态性的一种表现,体现出程序的灵活性。

四、static(静态)

4.1概述

1、 是java中的一个关键字

2、 用于修饰成员(成员变量和成员方法)

4.2特点

1、 可以修饰成员变量,成员方法

2、 随着类的加载而加载,优先于对象加载

3、 只加载一次,就会一直存在,不再开辟新空间

4、 全局唯一,全局共享

5、 可以直接被类名调用,普通资源不可类名调用

6、 静态只能调用静态,非静态可以随意调用

7、 static不能和this或者super共用,因为有static时可能还没有对象

package cn.tedu.oop;
//测试  static  关键字
public class Test5 {
	public static void main(String[] args) {
		Person p = new Person();
		System.out.println(p.age);
		p.eat();
		p.sleep();
		System.out.println(p.name);
		Person.sleep();//static可以直接通过类名访问
		System.out.println(Person.name);
		Person p1 = new Person();
		p1.name = "白熊爱吃";
		Person p2 = new Person();
		System.out.println(p2.name);
		Person p3 = new Person();
		System.out.println(p3.name);
	}
}
class Person{
	int age = 45;
	public void eat() {
		System.out.println(1);
		System.out.println(name);//普通资源随意调用静态资源
	}
	//static 可以修饰成员变量和方法
	//优先于对象加载
	//资源是共享的,可以直接被类名调用
	static String name="王林";
	public static void sleep() {
		System.out.println(1);
		System.out.println(name);
//		System.out.println(age);//静态资源不能调用普通资源
	}
}

五、静态代码块

5.1概述

随着类的加载而加载,并且只被加载一次,一般用于项目的初始化 static{…}

1、 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化,在成员位置。

2、 构造代码块:在调用构造方法前会自动调用,每次创建对象都会被调用

3、 局部代码块:方法里的代码块,方法被调用时才会执行

4、 静态代码块:static{   },位置:在类里方法外

5、 优先级:静态代码块构造代码块 - 构造方法 - 局部代码块

package cn.tedu.oop;
//测试  static 代码块
public class Test6 {
	public static void main(String[] args) {
//		Class.forName("cn.tedu.oop.Student");
		new Student().show();
	}
}
class Student{
	static {
		System.out.println("静态代码块");//类里方法外
	}
	public Student() {
		System.out.println("构造方法");
	}
	{
		System.out.println("构造代码块");//类里方法外
	}
	public void show() {
		{
			System.out.println("局部代码块");//方法里
		}		
	}
}

六、final关键字

6.1概述

1、 final是最终的意思

2、 final可以修饰类,方法,成员变量

3、用来约束父类资源的重写权限

6.2特点

1、 被final修饰的类,不能被继承

2、 被final修饰的方法,不能被重写

3、 被final修饰的变量是个常量,值不能被更改

4、 常量的定义形式: final 数据类型 常量名 = 值

package cn.tedu.oop;
//测试  final  关键字
public class Test7 {
	public static void main(String[] args) {
		zi123 z = new zi123();
		z.eat();
//		z.age = 56;
		System.out.println(z.age);
	}

}
class fu123{//前面加final。该类不能被继承
	final int age = 23;
	public final void eat() {
		System.out.println("麻婆豆腐");
	}
}
class zi123 extends fu123{
//	public  void eat() {
//		System.out.println("吃东子aaaaa");//不能重写,因为被final私有,可以继承
//	}
}

6.3面试题

6.3.1类和对象的关系

类是抽象的,对象是具体的,想用类的信息,要创建对象。

6.3.2封装的好处

提高了程序的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太彧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值