package,继承,访问修饰符
1.package
包(package),用于管理程序中的类,可用于处理类的同名问题。
1.1定义package的方法
package 包名;
package用于定义包,必须写在源文件有效代码的第一句。
1.2编译带有包的源文件
在控制台编译有包的源文件,javac -d 目的位置 源文件位置。如下
1.3.import导包
同一包中的其他类可以直接使用。
如果要使用不在同一个包中的类,需要用import导入。
import java.util.Scanner;//导入java.util下的Scanner类
1.3.1如果要使用到不同包中,但是名字相同的类要如何处理呢?以导入java.util.Date;和java.sql.Date;为例。
1 java.util.*; //导入java.util下所有的类 2 3 java.sql.Date;//导入java.sql下的Date类
1.3.2静态导入
静态导入,在jdk1.5后开出现的。当类中的属性和方法都是静态的时候可以使用。如下
1 package cn.qd01; 2 public class Calc{ 3 public static float PI = 3.14f; 4 5 public static int add(int a,int b){ 6 return a+b; 7 } 8 }
1 package cn.qd02; 2 3 // import cn.bd.Calc; 4 // 静态导入 5 import static cn.qd.Calc.*; 6 public class Test01{ 7 public static void main(String[] args){ 8 System.out.println(PI); 9 System.out.println(add(1,2)); 10 } 11 }
2.继承
假如有两个类,dog类和cat类。它们都有相同的属性或方法,如String name,int weight等等。这时我们可以用继承,我们创建一个pet类,pet包含dog类和cat类相同的属性和类。让dog类和cat类继承pet类。
那么dog类和cat拥有pet类中的非私有的属性和方法。
这个公共的类称为父类(super class),继承于父类的类称为子类(sub class)。
java继承有两个特性:
1.单根性。在java中,一个类只能有一个直接父类。
2.传递性。C继承于B,B继承于A,C具有A的特性和行为。
2.1super
super关键字表示父类对象,只是一个关键字,里面没有引用。
super关键字用法:
【1】访问父类构造方法
1 public Dog(String name,int weight,int health,String stain){ 2 super(name,weight,health); 3 this.setStrain(strain); 4 }
super调用构造方法时,必须写在构造方法有效代码的第一句。
【2】调用父类非私有属性
1 public class Fruit{ 2 float price; 3 }
1 public class Apple extends Fruit{ 2 3 public void showInfo(){ 4 // 不推荐使用 5 //System.out.println("价格:"+price); 6 //System.out.println("价格:"+this.price); 7 // 当需要访问父类的属性时,优先使用super 8 System.out.println("价格:"+super.price); 9 } 10 11 }
【3】访问父类非私有方法
1 public void print(){ 2 /* 3 System.out.print("我的昵称"+super.getName()); 4 System.out.print(",健康值"+super.getHealth()); 5 System.out.print(",体重"+super.getWeigh()); 6 */ 7 super.showInfo(); 8 System.out.println(",我是一只"+this.getStrain()); 9 }
2.2子类继承父类的资源
以下情况是,父类不能被继承的成员
1.private成员
2.构造方法
3.子类和父类不在同一个包下,使用默认修饰符的成员
3.访问修饰符
访问修饰符共有4种,private,默认,protect,public.
修饰符 |
本类✘ |
同包子类 |
同包其他类 |
不同包子类 |
不同包其他类 |
private |
✔ |
✘ |
✘ |
✘ |
✘ |
默认 |
✔ |
✔ |
✔ |
✘ |
✘ |
protected |
✔ |
✔ |
✔ |
✔ |
✘ |
public |
✔ |
✔ |
✔ |
✔ |
✔ |
1.private:私有的,只能在本类可以访问。
2.friendly/default:默认的,同包可访问,也称包访问权限。
3.proteck:受保护的, ①子类可访问 ②同包可访问
4.pulic:公共的,都可以访问
4.继承关系的初始化顺序
继承关系内存图
5.方法的重写
当子类从父类继承过来的方法不能满足自身需要时,子类可以根据自身情况进行方法重写(overwrite/override)
方法重写建立在继承的基础上,没有继承,就没有重写!
方法重写,分为部分重写和全部重写,可视个人情况不同选择。
部分重写
1 public void showInfo(){ 2 super.showInfo(); 3 System.out.println("我是一只"+this.getStrain()); 4 }
全部重写
1 public void showInfo(){ 2 System.out.println("--"+super.getName()+"--"); 3 System.out.println("健康值:"+super.getHealth()); 4 System.out.println("体重:"+super.getWeight()); 5 System.out.println("品种:"+this.getStrain()); 6 }
重写的规则
[1]方法名称相同
[2]参数列表相同
[3]子类的访问权限一定 >= 父类访问权限
[4]返回值和父类相同或者是其子类,如下。
1 public Pet create(){ 2 Pet pet = new Pet(); 3 return pet; 4 }
1 public Dog create(){ 2 Dog dog = new Dog(); 3 return dog; 4 }