包_继承

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、方法重写的更多相关文章

  1. Java继承之方法重写

    目录 Java继承之方法重写 代码体现 概念 注意事项 "两同两小一大" 其他注意点 重写与重载 @Override注解 Java继承之方法重写 在Java继承中,子类可以获得父类 ...

  2. PHP中类的继承与方法重写

    php中类的继承与方法重写,欢迎大神补充指点! <?php namespace _1009; class Demo5 { //实例属性 public $product; public $pric ...

  3. day 24 二十四、组合、继承、方法重写和重用、super()

    一.组合 1.定义:自定义类的对象作为类的属性 A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B类组合到一起 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能 2. ...

  4. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  5. 04 Python的继承、方法重写、super()类、父类私密属性的调用

    继承 A类继承B类,A即可获得B类的全部公共属性和方法(包括内置属性和方法).格式如:class A(B): class Animal: def sleep(self): print("zZ ...

  6. Python继承、方法重写

    继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...

  7. Python_类的继承与方法重写

    1.新建子类时,括号内要传入继承的父类名 2.super()方法:自动寻找当前类的父类,并调用父类的构造函数,初始化属性值 class Cup: #构造函数,初始化属性值 def __init__(s ...

  8. 22.1 Extends 继承的 方法重写、@Override的使用、

    /* * 继承中成员方法的特点 * 子类中没有这个方法,调用父类的 * 子类中重写了这个方法,调用子类的 * 方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类 ...

  9. Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态

    python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...

  10. java继承 、方法重写、重写toString方法

    1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...

随机推荐

  1. (五)JMM的介绍

    1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...

  2. 畅通工程(hdu1863)并查集

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. Jquery动态设置下拉框selected --(2018 08/12-08/26周总结)

    1.Jquery动态根据内容设置下拉框selected 需求就是根据下拉框的值动态的设置为selected,本以为很简单,网上一大推的方法,挨着尝试了之后却发现没有一个是有用的.网上的做法如下: &l ...

  4. pts/0代表什么意思?

    在linux命令行中经常看到pts/0,这是什么意思呢??妈蛋!! 先说pts/0吧,man里面是这样说的:ptmx and pts - pseudo-terminal master and slav ...

  5. 微信小程序 发现之旅(三)—— 组件之间的参数传递

    一.URL 传参 当使用 navigateTo() 方法跳转页面的时候,可以在 url 后面接 query 参数 然后在 Page 页面的生命周期函数 onLoad 中可以接收到这些参数 这种方式只能 ...

  6. js 事件委托代理

    在优化网页性能的技巧当中,对DOM的优化是必不可少的.这其中就涉及到了javascript对DOM的频繁操作.比如响应用户操作的事件.一般情况下,如果是稍微初级一点的前端程序员,在拿到项目的时候,对待 ...

  7. js之面向对象

    本文的面向对象分为ES6和ES6之前的,重点学习ES6的===============================一.面向对象 1.什么是面向对象 a)什么是对象:万物都可以抽象成对象 时间对象 ...

  8. 语义slam用于高精地图和高精定位的一些想法

    最近一直在考虑语义slam在自动驾驶和辅助驾驶中的用法,研究了一下视觉为主的高精度地图+高精定位的模式,特别是mobileye的REM. 秉承先建图再定位的思路,在服务器端(云端)建图,在车端定位. ...

  9. CountDownTimer 源码分析

    倒计时的功能,比如说:发送短信验证码倒计时. public class CountDownTimerActivity extends Activity { private Button mSend; ...

  10. Android 经典欧美小游戏 guess who

    本来是要做iOS开发的,因为一些世事无常和机缘巧合与测试工作还有安卓系统结下了不解之缘,前不久找到了guess who 源码,又加入了一些自己的元素最终完成了这个简单的小游戏. <?xml ve ...