Java 面向对象的三大特性之一 继承
继承:
Java是继承的三大特性之一,是Java中实现代码重用的手段之一
将重复的代码抽取到父类中继承的有点或者现实
优点:
方便修改代码 减少代码量
Java中继承的语法:
修饰符 SubClass extends SuperClass{
(称为子类) (称为父类)
//定义类部分
}
继承通过关键字extends关键字来实现,修饰符if是public ,则该类在整个项目中可见,,若无public修饰,则该类至当前可见,不可以使用private和protected修饰类
总结访问修饰符
访问修饰符 本类 同包 子类 其他
private √ 默认 √ √ protected √ √ √ public √ √ √ √
继承需注意:
子类无法继父类的构造方法,无法继承private修饰符的属性
继承public和protected修饰的属性和方法,无论子类和父类是否在一个包里
继承默认权限修饰符的属性和方法,但子类和父类必须在同一个包里
如何去快速生成构造
alt+shift+s: 选择构造的模板。
删除当前行 ctrl+D
二:重写和继承关系中的构造方法:
方法重写需满足:
1:重写方法和被重写方法必须具有相同的方法名
2:重写方法和被重写方法具有相同的参数列表
3:重写方法的返回值类型必须和被重写方法的返回值类型或是其子类
4:重写方法不能缩小,重写方法的访问权限,
super代表当前对象的直接类型的默认引用
super必须出现子类子类方法(和构造方法)
可以访问父类的成员 父类方法和父类属性
访问权限的限制 无法访问private
super
super()父类的构造
super.父类的属性 或者方法 。必须是非私有的(protected,public)
2.子类重写父类的方法
在Java中,实现多态的条件是非常简单的。
父类(普通类)
方法(普通方法)
子类 extends 父类
方法(普通方法 ----->和父类某个方法同名)
结论:
父类 父类对象=new 子类对象();
父类对象.方法名称()(父子都有) 一定打印出子类方法体内容
三:抽象类和抽象类的特点:
1:修饰符:abstract
2:抽象类不能被实例化,抽象类中没有一个或者多个抽象方法,甚至全部方法都可以是抽象方法
3:抽象方法只有方法声明,没有方法实现,有抽象 方法的类必须声明为抽象类,子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类
抽象类和抽象方法的注意事项:
案例:实现不同宠物 吃东西方法
public abstract class Pet{ public abstract void eat();
} public class Cat extends Pet{
@Override
public void eat(){
syso("dog Eat");
}
} public class Penguin extends Pet{
@Override
public void eat(){
syso("Penguin Eat fish");
}
} Pet[] pets=new Pet[]; Cat cat=new Cat(); Penguin penguin=new Penguin(); pets[]=cat;
pets[]=penguin; for(Pet pet:pets){
pet.eat(); 子类重写父类的eat方法 多态的体现
}
抽象类和抽象方法的注意事项
1.抽象类中可以有抽象方法,也可以有非抽象方法
2.抽象方法中没有方法体,直接以分号结束
3.抽象方法必须在子类中重写,除非子类本身也是一个抽象类
4.如果用Abstract修饰,那么该类就是抽象类
5.抽象类不能被实例化
6.抽象类不能是静态类
7.抽象类可以有构造
8.抽象方法只能出现在抽象类中
9.抽象方法只是用来约束子类方法行为的
四: final注意事项:
final修饰属性,方法,类
final修饰属性:不能再次赋值
final修饰方法: 方法不能被重写
final修饰类,类不能被继承
public static final String NAME="xxxx"; //常量:不允许修改值
1:final和abstract是功能相反的两个关键字:
2:abstract 可以用来修饰类和方法,不能用来修饰属性和构造方法。final可以用来修饰类,方法和属性,不能修饰构造方法
3:使用final修饰引用型变量时,变量的值是固定不变的。而变量所指向的对象的属性值是可变得
4:
abstract 和private同时修饰一个方法
abstract 和static同时修饰一个方法
abstract 和final同时修饰一个方法或者类
继承关系下子类构造的执行过程
解析:
1.从Main---->子类构造不进入方法体
2.从子类构造------>父类构造
3.执行父类构造 ,创建了父类对象
4.回到子类构造,执行构造体
5.再回到Main。创建出对象
继承下构造方法的执行过程
父类静态块中方法----子类静态块中方法----父类的非方法代码块(单一{//内容}代码块)---
父类的构造方法---子类的非方法代码块(单一{//内容}代码块)---子类的构造方法
可以用构造方法为属性赋值
当我们实例化子类无参构造时父类没有自定义构造 系统会自动分配一个无参构造
实例化子类对象默认会先执行父类的构造,在执行子类的构造
super();默认调用父类的无参数构造
注意细节:必须是子类中在构造方法的第一条语句
(无参构造会默认调用)
super(参数列表);调用父类中的有参构造
使用super(参数列表);重复调用父类中的有参构造,默认直接调用父类中的有参数构造,而不会调用父类中的无参数构造
注意:
实例化子类对象时,子类相应的构造,第一行调用父类的哪个构造,就执行哪一个父类构造,,如果没有声明父类构造,默认皆父类的无参构造
实例讲解:
学生类
package Student; public class Student1 {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return Age;
} public void setAge(int age) {
if (age >= ) {
System.out.println("输入正确");
} else {
System.out.println("输入错误"); } Age = age;
} private int Age; public void print() {
System.out.println("我的名字是:" + this.name + ",年龄是:" + this.Age + "。");
}
}
学生的测试类
package Student; public class StudentTest { public static void main(String[] args) {
// TODO Auto-generated method stub Student1 stu =new Student1();
stu.setAge();
stu.setName("所期望的");
stu.print(); } }
学生1类
package Student1; public class Student2 { private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
private int Age;
private String sex;
private String subject; public void println() {
System.out.println("我的名字是:" + this.name + ",年龄是:"
+ this.Age + ",性别是:"+this.sex+",我的学科是:"+this.subject);
} /*
* 两个参数的构造函数
*/
public Student2(String name,int Age){
this.name=name;
this.Age =Age;
this.subject="ACCP";
this.sex="男";
}
public Student2(String name,int Age,String subject,String sex){
this.name=name;
this.Age =Age;
this.subject=subject;
this.sex=sex; } }
学生1测试类
package Student1; import Student.Student1; public class StudentText1 { public static void main(String[] args) {
// TODO Auto-generated method stub Student2 stu =new Student2("全球",,"男","ACCP");
Student2 stu1 =new Student2("钱钱钱",);
stu1.println();
// stu.setAge(1);
// stu.setName("哈哈");
// stu.setSex("男");
// stu.setSubject("java");
stu.println();
} }
Java 面向对象的三大特性之一 继承的更多相关文章
- Java学习笔记二十一:Java面向对象的三大特性之继承
Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...
- 2.Java面向对象编程三大特性之继承
在<Think in Java>中有这样一句话:复用代码是java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复用代码并对其加以改变是不够的,他还必须能够做更多的事情.复用 ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Java学习笔记十八:Java面向对象的三大特性之封装
Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态 二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- java面向对象的三大特性
1.面向对象的三大特性 继承.封装.多态 什么是继承? ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一. ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷. ③继承来的属性 ...
- 3.java面向对象编程三大特性之多态
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...
随机推荐
- Unity中sharedMaterials 和 materials
sharedMaterials 和 materials: 这两个属性用法是一样的,但是从效率上来说最好用sharedMaterial,它是共享材质,无论如何操作材质的属性(如更换颜色或者更换shade ...
- 十分钟带你理解Kubernetes核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- clustering
搞了将近一年的单细胞,聚类也是自认为得心应手了,自信满满. 但是多半是跑软件,对聚类的深层次的思想不甚了了. Google了一下clustering,看了一篇文章,突然了解到了clustering的算 ...
- 3 爬虫解析 Xpath 和 BeautifulSoup
1.正则表达式 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [-] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\w ...
- 第一章:IPsecVPN
第一章 一.VPN(virtual private Network,虚拟专用网)的基本概念 VPN连接模式分为两种,分别是传输模式和隧道模式 传输模式:在整个VPN传输中,ip包头并没有被封装进去 隧 ...
- python记录day24 模块的语法
使用模块的两种方式: import xxx from xxx import xxx 使用模块的优点: 1.实现代码的重用 2.可以把代码分类 一.import 导入模块的时候系统会做三件事 1.先去s ...
- laravel中连表查询
$skuList = ProductSkuModel::selectRaw('product_skus.id as sku_id, product_skus.code as code, product ...
- dp 最大正方形
洛谷P1387 最大正方形 分析:画图模拟,发现以坐标(i,j)为右下顶点的正方形可以根据它左上方的三个点得到,就很轻松写出状态转移方程了. 代码: #include<bits/stdc++.h ...
- 【转】预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法
[转]预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法 原文地址:http://www.iruanmi.com/upgrade-win8-china-to-a-higher- ...
- 成功解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra
解决问题 You are using pip version 9.0.3, however version 10.0.1 is available.You should consider upgrad ...