一、语法
关键字 : extends
格式:
public class 子类名 extends 父类名{
}
二、继承的范围
1. 子类以及子类对象 可以调用继承的哪些东西?
4个控制修饰符总结:
- private——仅对本类可见
- public——对外部完全可见
- protected——对本包和所有子类可见
- 缺省——对本包可见(default)
//本包
public class Student{
public String name;
private int id;
protected int age;
int score;
public void exam(){
System.out.println("父类定义的考试方法");
}
}
public class UNStudent extends Student{
public void printInfo(){
/**
* 在同包的子类中
* private不可以调用
* public、protected、缺省的可以调用
*/
System.out.println("name:"+name);
// System.out.println("id:"+id);
System.out.println("age:"+age);
System.out.println("score:"+score);
}
public void exam(){
System.out.println("子类重写的考试方法");
}
}
public class StuManage {
public static void main(String[] args) {
//在同包的非子类中,子类对象可以调用除private的属性
UNStudent unstu1 = new UNStudent();
unstu1.name="hunter0";
unstu1.age=23;
unstu1.score=100;
//不同包的子类 在与父类同包的非子类中可以调用public 和Protectd
MidStudent midstu1 = new MidStudent();
midstu1.name = "hunter1";
midstu1.age= 17;
}
}
//不同包:
public class MidStudent extends Student {
public void printInfo(){
/**
* 在不同的包的子类中
* private和缺省的不可以调用
* public和protected可以调用
*/
System.out.println("name:"+name);
// System.out.println("id:"+id);
System.out.println("age:"+age);
// System.out.println("score:"+score);
}
public static void main(String[] args) {
// 在不同包的子类中 子类对象可以调用public 修饰的属性
UNStudent unstu1= new UNStudent();
unstu1.name="";
// unstu1.age=20;
// unstu1.score=20;
MidStudent midstu1= new MidStudent();
midstu1.name="";
midstu1.age=20;
}
}
public class StuManage {
public static void main(String[] args) {
//在不同包的非子类中,子类对象可以调用public修饰的属性
UNStudent unstu1 = new UNStudent();
unstu1.name="hunter0";
// unstu1.age=20;
// unstu1.score=20;
MidStudent midstu1 = new MidStudent();
midstu1.name = "hunter1";
// midstu1.age= 17;
}
}
三. 方法重写(override)
存在继承关系的前提:
子类中可以写与父类方法一致的方法
一般情况下: 要求子类中的方法除方法体之外皆与父类一致 子类以及子类对象会优先调用重写之后的方法
-- 继承父类,然后扩展父类方法的功能
动物类: 吃食物 老虎: 吃 -> 吃肉 牛: 吃-> 吃草
-- 检查重写是否正确:注解 @Override // 重写检查注解
四.转型
对象:
学生 男性 硕士研究生
对象名: 同一时刻编译只能具备一种类型
// 自动转型,子类对象可以自动转型为父类类型 A a = new B();// B 必须是 A的子类
向上转型: 自动转型 -- 安全 自动转型之后的变量不能调用子类独有的方法属性 向下转型: 强制转型 -- 不安全 注意哪里来的才能回哪里
对象原本的实际类型是什么,不要只看对象名所属的类型
int i = (int)1.2; --- 1.2 --- 1
父类: A
子类:C S
C --> A --强制的 >C
S --> A -- 强制> C 错误的 -- 类型转型异常
保证安全的强制转型:先比较对象是否是这一类型,再向这一类型转型
if (anObject instanceof String) { String anotherString = (String)anObject; } |
五。 子类在创建对象时 调用属性、构造方法以及父类的属性、构造方法
public class User {
String name;
{
System.out.println("父类代码块");
}
static {
System.out.println("父类静态代码块");
}
public User(){
System.out.println("父类构造方法1");
}
public User(String name) {
this.name = name;
System.out.println("父类构造方法2");
}
// 静态方法
public static void getName(){
System.out.println("父类静态方法 ");
}
public void getInfor(){
System.out.println("父类普通方法");
System.out.println(name);
}
}
class Son extends User {
int id;
{
System.out.println("子类代码块");
}
static {
System.out.println("子类静态代码块");
}
public Son() {
System.out.println("子类构造方法1");
}
public Son(String name, int id) {
super(name);
this.id = id;
System.out.println("子类构造方法2");
}
// 静态方法
public static void getName(){
System.out.println("子类静态方法 ");
}
public void getInfo(){
System.out.println("子类普通方法");
System.out.println(name+id);
}
public static void main(String[] args) {
Son son1 = new Son();
System.out.println("****************************");
Son son2 = new Son("hunter",1111111);
System.out.println("****************************");
System.out.println(son2.name);
System.out.println(son2.id);
}
}
output
父类静态代码块
子类静态代码块
父类代码块
父类构造方法1
子类代码块
子类构造方法1
****************************
父类代码块
父类构造方法2
子类代码块
子类构造方法2
****************************
hunter
1111111