包_继承

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. SQL SERVER 查看SQL语句IO,时间,索引消耗

    1.查看SQL语句IO消耗 set statistics io on     select * from dbo.jx_order where order_time>'2011-04-12 12 ...

  2. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  3. Number Sequence(hdu4390)

    Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. 【12】外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化.然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作“ ...

  5. POJ2236(KB5-A)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28617   Accepted: 118 ...

  6. MySQL常用操作汇编

    熟悉 我熟悉xxx,其实很多原来熟悉到能背的,如果长时间不用了几乎也就忘了.此时再说自己熟悉XXX就被认为是在吹牛B了,感觉不是很好.所谓温故而知新,对于天资不聪颖的,就是要在一遍一遍的复习实践中慢慢 ...

  7. javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException PK

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...

  8. ionic安卓tab栏跑到顶部

    安卓下的ionic的tab会在顶部显示,而不是在底部 解决办法如下: 在app.js文件中的.config代码块里中添加以下代码: 注意依赖注入$ionicConfigProvider $ionicC ...

  9. go语言练习:go实现md5

    package main import ( "crypto/md5" "fmt" ) func main() { md5_ob := md5.New() md5 ...

  10. Linux磁盘及分区之wwid和uuid

    背景描述,在Linux系统中,如果添加了新的SCSI磁盘或者映射SAN存储LUN操作,重启操作系统之后会出现磁盘标识符(sd*)错乱的情况. 例如之前添加的SAN存储LUN的磁盘标识符为/dev/sd ...