【Java】继承、接口、抽象类、多态之间的关系和区别 【一】

news/2024/7/3 13:21:50 标签: 封装, 集成, 继承, 多态, 封装继承多态

时间对于一个追梦的人来说就是黄金,没有什么能阻挡前行的脚步。--致所有和我一样追逐明天太阳的人
接口的理解:接口是对动作的抽象说动作还不如说功能   抽象类理解:抽象类是对根源的抽象  多态的理解:类加载运行时父类的引用指向子类的对象
抽象大小关系:接口>抽象类
先通过一个例子来有个的概率
人 、学生两个类
首先我们要确定是否有继承关系,我们一般讲 is a或者has a的关系进行判断,也就是说学生是人,人包含了学生,这一点要明确。
其次我们要定义父类,定义这一类的特性,如姓名、年龄、性别、肤色等等这样的共性,学生将会继承这些属性,但是每类职业都会有属于自己的工作,这是我们提炼出来的,对其工作抽象出来处理,让继承了人这个类的子类去实现自己的工作方式。与此同时每个类别的职业人都有自己的生活方式,比如学生除了上课,他还去做些兼职、公交司机上完班后还去跑滴滴等等,那么这时候我们需要使用接口去实现,换句话说除了我们设计的职业之外,他还去干了什么事儿,身上还有其他什么功能这些都是由接口决定的,这就是为什么说接口是实现多继承的原因。
换句术语来说接口是设计(需要什么我去设计什么)的结果 ,抽象类是重构(覆盖、重写)的结果
重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本。
比如一个游戏的版本升级,对某个功能的bug修复,这个时候就会在实现接口的类里面进行修复。归根接底是在类加载程序运行时父类的引用指向了子类的实例化对象,就行成了多态,但是由于java中的只能是单继承,所以担任就交给了接口。


阐述各自的概念:
继承1、主要是优化代码  2、类与类的层级关系(语言是面向对象的,任何时候都可以拿生活中的例子去套用,开发大脑吧)
强调一点,继承是不要乱用,在面向对象的思想里面,代码应该要有体现,一般用 is a或者has a的关系进行判断
定义一个【人】 类

package com.physical;
//定义一个抽象类,学生类的根源类就是人
public abstract class Person {
	int idcard;//身份证
	String sname;//姓名
	//定义抽象方法的时候一定要使用关键字abstract
	//因为抽象类可有可无抽象方法
	//抽象方法不能有完成操作的实体也就是{}
	abstract void toDoThings();
	//定义一个已实现的方法
	void eatFood() {
		System.out.println("每天一日三餐");
	}
}

学生类继承人类
 

package com.physical;

public class Student extends Person{
	//学生这个群体继承了人这个类,子类就隐式添加了父类的成员变量
	//定义了两个成员变量,职业、学生编号
	//此时学生子类就有了四个成员变量
	String profession;
	int stuid;
	//如果父类没有显示的创建构造函数,那么程序会在加载的时候自动创建一个无参的构造函数
	//当创建类的实例化对象的时候,子类隐式的构造函数会的调用父类的隐式构造函数  --一般情况下我们称构造器
	//父类过显示的创建了无参的构造函数,如果要创建一个默认对象的时候,子类也必须显示的创建无参数构造函数
	Student(){
		
	}
	//使用有参的构造函对类成员数初始化
	//无论有多少层的继承关系,程序的执行顺序都是从父类一直到Object类,所有没有显示添加继承关系的类都默认是Object的子类
	//现在想想Java之父一定是个哲学家,真是大神中的大神,膜拜三方
	Student(int idcard,String sname){
		super(idcard,sname);
	}
	//继承了抽象类的子类必须实现父类的抽象方法,除非继承的子类也是抽象类
	@Override
	void toDoThings() {
		System.out.println("我叫"+sname+"身份证号是:"+idcard+"是一名"+profession+"学生编号是"+stuid+"每天的工作就是学习");
	}
	//写到这里的时候我反问了下自己,父类为什么要去写已实现的方法
	//给自己的答案是:父类是所有继承类的超类,对所有超类实现了普适性,也就是说如果子类没有重写父类的方法,那么所有的对象会默认为是子类的行为
	//如果这里的eatFood方法我没显示的创建,父类的eatFood方法不会像变量那样加载到子类,这里要的节点在于对象是个引用类型,所以应该解释为子类的子类的eatFood()变量会指向父类的eatFood方法地址
	//如果显示的创建eatFood方法,那么就会指向student类的地址
	void eatFood() {
		System.out.println("我每天上午七点起床,吃早餐喝牛奶");
		System.out.println("八点一刻左右的时候练会儿瑜伽");
		System.out.println("中午吃点牛肉,碳水化合物很少");
		System.out.println("晚上的时候吃个三分饱");
	}
}

实现的方法

package com.physical;

public class Test {
	public static void main(String[] args) {
		Student stu=new Student(123456789,"Joncky");
		stu.eatFood();
		Person p=new Student();
	}
}

输出的结果是


http://www.niftyadmin.cn/n/864444.html

相关文章

【Java】继承、接口、抽象类、多态之间的关系和区别 【二】

多态:运行时引用指向子元素的实例对象【jvm内存模型很重要,也是入门的基础】 接着上面继续理解,创建一个老师类 package com.physical;public class Teacher extends Person{String profession;int teacherid;//一个无参的构造器Teacher()…

【Java】重写、集合笔记随笔

现在看来数组和集合的区别有两点: 1、数组只能存放一个类型的数据,且长度固定,如果需要动态扩容就需要重新声明数组 2、集合存放的数据可以不是一个类型,同时数据长度是动态的 浅谈理解重写toString、equals、hashCode方法所有类中…

什么是Servlet

1、Apache与Tomcat之间的关系 Apache和Tomcat两个都是免费的服务器,Apcahe只能处理静态页面,Tomcat无论是静态网页还是动态网页都能适应。但是Apache在处理静态页面比Tomcat快的多,一般情况下我们都会将Apache与Tomcat联合使用,将…

【Java】分页原理与思路

分页业务逻辑及核心知识点: SQL语句:select * from product where pid not in (select s.pid FROM (select pid from product limit "(nowPage-1)*pageSize") s) limit pageSize para:pageSize表示当前页显示条数 nowPage:当前页面的索引值…

为什么jsp发起请求后获取不到值

1、普通方式 <a href"">后面链接中传递的值是固定单一的值&#xff0c;其他的值是获取不到的。 2、提交表单 form表单的区域块中的数据会打包一起传递&#xff0c;在后台直接获取 A&#xff1a;如果是上传文件等&#xff0c;则需要判断是否是常用字段&#xf…

【Java】ognl表达式随笔

单选框 <s:radio list"#{1:男,2:女,0:妖 }" name"emp.esex" theme"simple"></s:radio> 复选框 <s:checkboxlist list"{上网,打篮球,泡吧,看书}" name"emp.arrEhod" theme"simple"></s:che…

Struts2中拦截器与过滤器

核心&#xff1a;Struts2的核心就是拦截器&#xff0c;是基于过滤器开发的&#xff0c;所以最好与filter联动对比学习 思想&#xff1a;拦截器是AOP思想&#xff0c;也就是面向切面编程&#xff0c;通俗点说就是纵向重复&#xff0c;横向提取&#xff0c;对aop不太理解的可以参…

Hibernate出现 is not mapped的解决方案

public User user(User user){this.beginTransaction();User rusernew User();System.out.println(user.getUname());ruser(User)this.getSession().createQuery("select aa from User aa where uname ? and upwd ?").setParameter(0,user.getUname()).setParamete…