包、继承、Super、方法重写
1 包_继承
1.1 包
包(package) 用于管理程序中的类,主要用于解决类的同名问题。包可以看出目录。
包的作用
[1] 防止命名冲突。
[2] 允许类组成一个单元(模块),便于管理和维护
[3] 更好的保护类、属性和方法
1.1.1 定义包
package 用于定义包,必须写到源文件的有效代码的第一句。
package cn.sxt; public class Test01{ public static void main(String[] args){ System.out.println("test package"); } } |
编译带包的源文件
javac –d 目的地 源文件 |
编译完成后,Test01的全路径是cn.sxt.Test01
1.1.2 包命名规范
包命名原则:始终保持类的全路径唯一。
规范:
[1]包名由小写字母组成,不能以圆点开头或结尾。圆点有特殊意义——包分隔符
[2]包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。如:域名javagroup.net
package net.javagroup.xx
[3]包名后续部分依不同机构内部的规范不同而不同
package net.javagroup.project1.projectname.xx
1.1.3 导包
import 用于导包,告诉类需要的其他类在什么位置!
形式:
import cn.sxt02.Student // 导入cn.sxt02下的Student类。
import cn.sxt02.* // 导入cn.sxt02下的所有类。
package cn.sxt01; public class Test01{ public static void main(String[] args){ Student s = new Student(); } } |
package cn.sxt02; public class Student{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } } |
package cn.sxt01; + import cn.sxt02.Student; public class Test01{ public static void main(String[] args){ Student s = new Student(); } } |
如何优雅的管理源代码和class文件(B)
package cn.sxt01; import cn.sxt02.Student; public class Test01{ public static void main(String[] args){ Student s = new Student(); } } |
package cn.sxt02; public class Student{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } } |
编译过程: |
运行 |
注意:编译时还没有包出来,不能用源文件的全路径形式
1.1.4 不同包中的同名类
如果一个类中用到了两个不同包但同名的类时,如何处理?
package cn.sxt01; import java.util.*; import java.sql.Date; public class Test01{ public static void main(String[] args){ java.util.Date date1 = new java.util.Date(); System.out.println(date1); Date date2 = new Date(0); System.out.println(date2); } } |
在创建对象时写全路径
package cn.sxt01; import java.sql.Date; public class Test02{ public static void main(String[] args){ java.util.Date date1 = new java.util.Date(); System.out.println(date1); Date date2 = new Date(0); System.out.println(date2); } } |
1.2 jvm提供的包
包名 |
描述 |
java.lang/语言包 |
系统默认导入,String类保存在这个包中,所以我们在使用String时不需要导包 |
java.util |
工具包,一些常用的类库,Scanner,Date,Arrays |
java.io |
输入输出处理,文件的读写等 |
java.net |
网络编程 |
java.math |
数学计算.Math.random |
java.awt(C) |
这个包中的类用于构建和管理应用程序的图形用户界面 |
1.3 静态导入
如果一个类中定义的属性和方法都是静态时,可以考虑使用静态导入。jdk1.5+ 出现。
package cn.sxt01; public class Calc{ public static float PI = 3.14f; public static int add(int a,int b){ return a+b; } } |
package cn.sxt02; // import cn.sxt01.Calc; // 静态导入 import static cn.sxt01.Calc.*; public class Test01{ public static void main(String[] args){ System.out.println(PI); System.out.println(add(1,2)); } } |
思考:如果一个类中还有实例成员,能不能用静态导入?
1.4 继承
1.4.1 为什么要使用继承?
为了提取两个类中公共的代码,可以使用继承抽取重复性的代码到一个公共类中,这个公共的类称为父类(super class)。继承于父类的类称为子类(sub class).
java继承的特性
[1] 单根性。在java中,一个类只能有一个直接父类。
[2] 传递性。C继承于B,B继承于A,C具有A的特性和行为。
类B继承于类A,使用关键字extends,B拥有了A中非私有的属性和方法。
public class Person{ String name; int age; public void showInfo(){ System.out.println("姓名:"+name); System.out.println(",年龄:"+age); } } |
public class Student extends Person{ } |
public class Test01{ public static void main(String[] args){ Student s = new Student(); s.name = "张三"; s.age = 20; s.showInfo(); } } |
如果Person中定义了private 属性count
需要注意的是 Java 不支持多继承,但支持多重继承。 子类拥有父类非 private 的属性、方法。 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
1.5 Super
super关键字表示父类对象,只是一个关键字,里面没有引用。
[1]super访问父类构造方法
public Dog(String name,int health,int love,String strain){ /* this.setName(name); this.setHealth(health); this.setLove(love); */ super(name,health,love); this.setStrain(strain); } |
super调用父类构造方法时,必须写到构造方法有效代码第一句
[2] super调用父类的非私有属性
super可以访问父类的非私有属性。私有的属性不能用super访问。
public class Fruit{ float price; } |
public class Apple extends Fruit{ public void showInfo(){ // 不推荐使用 //System.out.println("价格:"+price); //System.out.println("价格:"+this.price); // 当需要访问父类的属性时,优先使用super System.out.println("价格:"+super.price); } } |
变量隐藏(C)
当子类定义了一个和父类同名的属性时,在子类中优先访问子类的属性,如果要访问父类属性一定要加super。
public class Fruit{ float price; private String color; int weight = 100; } |
public class Apple extends Fruit{ int weight = 200; public void showInfo(){ // 不推荐使用 //System.out.println("价格:"+price); //System.out.println("价格:"+this.price); // [1]当需要访问父类的属性时,优先使用super System.out.println("价格:"+super.price); // [2]不能访问父类的私有属性 // System.out.println("颜色:"+super.color); // [3] 访问和父类同名的变量weight System.out.println("重量:"+weight); System.out.println("重量:"+this.weight); System.out.println("重量:"+super.weight); } } |
一句话:如果要访问父类属性,通过super;如果要访问子类属性,通过this。
[3] super访问非私有父类方法
public void print(){ /* System.out.print("我的姓名"+super.getName()); System.out.print(",健康值"+super.getHealth()); System.out.print(",亲密度"+super.getLove()); */ super.showInfo(); System.out.println(",我是一只"+this.getStrain()); } |
1.6 子类继承父类的资源
1.7 访问修饰符
java中存在4类访问修饰符,分别是private、默认、protected、public。
修饰符 |
本类✘ |
同包子类 |
同包其他类 |
不同包子类 |
不同包其他类 |
private |
✔ |
✘ |
✘ |
✘ |
✘ |
默认 |
✔ |
✔ |
✔ |
✘ |
✘ |
protected |
✔ |
✔ |
✔ |
✔ |
✘ |
public |
✔ |
✔ |
✔ |
✔ |
✔ |
private:私有的,只能在本类可以访问。
friendly:默认的,同包可访问,也称包访问权限。
protected:受保护的, ①子类可访问 ②同包可访问
public:公共的,都可以访问
1.8 继承关系的初始化顺序
继承关系内存图
1.9 方法的重写
当子类从父类继承过来的方法不能满足自身需要时,子类可以根据自身情况进行方法重写(overwrite/override)
方法重写建立在继承的基础上,没有继承,就没有重写!
子类根据自身情况,可以选择部分重写和完全重写。
部分重写
public void showInfo(){ super.showInfo(); System.out.println("我是一只"+this.getStrain()); } |
完全重写
public void showInfo(){ System.out.println("--"+super.getName()+"--"); System.out.println("健康值:"+super.getHealth()); System.out.println("亲密度:"+super.getLove()); System.out.println("品种:"+this.getStrain()); } |
重写的规则
[1]方法名称相同
[2]参数列表相同
[3]子类的访问权限一定 >= 父类访问权限
[4]返回值和父类相同或者是其子类
public Pet create(){ Pet pet = new Pet(); return pet; } |
public Dog create(){ Dog dog = new Dog(); return dog; } |
1.10 何时使用继承
[1] 符合 is – a 关系
学生 is a 人;
老师 is a 人;
[2] 继承实现代码重用
当多个子类拥有共同的属性和行为时,人为把共同的属性和方法提取到父类中,子类继承父类实现代码重用。
包、继承、Super、方法重写的更多相关文章
- Java继承之方法重写
目录 Java继承之方法重写 代码体现 概念 注意事项 "两同两小一大" 其他注意点 重写与重载 @Override注解 Java继承之方法重写 在Java继承中,子类可以获得父类 ...
- PHP中类的继承与方法重写
php中类的继承与方法重写,欢迎大神补充指点! <?php namespace _1009; class Demo5 { //实例属性 public $product; public $pric ...
- day 24 二十四、组合、继承、方法重写和重用、super()
一.组合 1.定义:自定义类的对象作为类的属性 A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B类组合到一起 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能 2. ...
- Java面向对象之继承,方法重写,super关键字,员工类系列继承题
在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...
- 04 Python的继承、方法重写、super()类、父类私密属性的调用
继承 A类继承B类,A即可获得B类的全部公共属性和方法(包括内置属性和方法).格式如:class A(B): class Animal: def sleep(self): print("zZ ...
- Python继承、方法重写
继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...
- Python_类的继承与方法重写
1.新建子类时,括号内要传入继承的父类名 2.super()方法:自动寻找当前类的父类,并调用父类的构造函数,初始化属性值 class Cup: #构造函数,初始化属性值 def __init__(s ...
- 22.1 Extends 继承的 方法重写、@Override的使用、
/* * 继承中成员方法的特点 * 子类中没有这个方法,调用父类的 * 子类中重写了这个方法,调用子类的 * 方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类 ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
- java继承 、方法重写、重写toString方法
1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...
随机推荐
- SQL SERVER 查看SQL语句IO,时间,索引消耗
1.查看SQL语句IO消耗 set statistics io on select * from dbo.jx_order where order_time>'2011-04-12 12 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- Number Sequence(hdu4390)
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 【12】外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化.然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作“ ...
- POJ2236(KB5-A)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28617 Accepted: 118 ...
- MySQL常用操作汇编
熟悉 我熟悉xxx,其实很多原来熟悉到能背的,如果长时间不用了几乎也就忘了.此时再说自己熟悉XXX就被认为是在吹牛B了,感觉不是很好.所谓温故而知新,对于天资不聪颖的,就是要在一遍一遍的复习实践中慢慢 ...
- javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException PK
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...
- ionic安卓tab栏跑到顶部
安卓下的ionic的tab会在顶部显示,而不是在底部 解决办法如下: 在app.js文件中的.config代码块里中添加以下代码: 注意依赖注入$ionicConfigProvider $ionicC ...
- go语言练习:go实现md5
package main import ( "crypto/md5" "fmt" ) func main() { md5_ob := md5.New() md5 ...
- Linux磁盘及分区之wwid和uuid
背景描述,在Linux系统中,如果添加了新的SCSI磁盘或者映射SAN存储LUN操作,重启操作系统之后会出现磁盘标识符(sd*)错乱的情况. 例如之前添加的SAN存储LUN的磁盘标识符为/dev/sd ...