静态成员、方法访问:
- 类的全限定类名.成员名/方法名
- import static 类的全限定类名.成员(但是不能直接导入类)
继承(extends)
语法
- public class 类名 extends 被继承的类名 {}
protected
- 同包下或者同类下可以访问
- 不同包的子类中,创建子类对象,只有用该子类对象可以访问
- 不同包非子类不能访问
- 不同包的子类中,创建父类对象,用父类对象无法访问。
- 不同包的子类中,创建其他子类对象,这个其他子类对象无法访问。
总结:记住能够访问的例子就行。
子类继承父类,可以使用除private修饰外的变量和方法。不能说没有继承,只是没有访问权限。
public | protected | 默认 | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包其他类 | √ | √ | √ | |
不同包子类 | √ | √ | ||
不同包其他类 | √ |
隐式的子类对象初始化
construct (){
//JVM帮我们做,相当于执行了
super();
//所以隐式初始化默认调用父类的无参构造,所以最好提供无参构造方法
}
显式的子类初始化(explicit)
在子类的构造方法的第一句中,使用super关键词调用父类的有参构造。
构造方法中,this和super调用构造方法只能用一个。
this不受访问权限控制,super受访问权限控制。(废话)
子类的属性隐藏
子类中存在与父类中的同名变量,由于某种机制,父类中的变量就被隐藏了。编译器的检查机制。对象名.属性
子类中存在与父类中相同的方法,父类中的方法就被覆盖了,只能调到子类中的方法。
要使用父类中被覆盖或隐藏的东西,使用super。
@Override,放在子类中被重写的方法上,静态方法不能被重写。
a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)
通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息
b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)
通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息
c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)
通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息
d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,
要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式
来初始化子类对象。)
package com.jiang.work.Day8.workone;
/**
* ============================
* 一定要注意命名规则
* 一定要注意命名规则
* 一定要注意命名规则
* ============================
* TODO
*
* @version 1.0
* @Description: 测试类
* @author: https://github.com/cqpsjsl
* @date: 2021/1/8 19:18
*/
public class WorkOneTest {
public static void main(String[] args) {
Student student = new Student("张三", "男", 18, 2006);
Teacher teacher = new Teacher("李四", "男", 56, "数学");
//输出学生信息
student.display();
System.out.println("-----------------");
//输出教师信息
teacher.display();
}
}
package com.jiang.work.Day8.workone;
/**
* ============================
* 一定要注意命名规则
* 一定要注意命名规则
* 一定要注意命名规则
* ============================
* TODO
*
* @version 1.0
* @Description: 学生类
* @author: https://github.com/cqpsjsl
* @date: 2021/1/8 19:00
*/
public class Student extends Person {
private int id;
public Student() {
}
public Student(String name, String gender, int age, int id) {
super(name, gender, age);
this.id = id;
}
@Override
protected void display() {
super.display();
System.out.println("学号是:" + id);
}
}
package com.jiang.work.Day8.workone;
/**
* ============================
* 一定要注意命名规则
* 一定要注意命名规则
* 一定要注意命名规则
* ============================
* TODO
*
* @version 1.0
* @Description: 老师类
* @author: https://github.com/cqpsjsl
* @date: 2021/1/8 19:14
*/
public class Teacher extends Person{
private String course;
public Teacher() {
}
public Teacher(String name, String gender, int age, String course) {
super(name, gender, age);
this.course = course;
}
@Override
protected void display() {
super.display();
System.out.println("教学课程是:"+course);
}
}
运行结果:
姓名: 张三 性别男 年龄18
学号是:2006
-----------------
姓名: 李四 性别男 年龄56
教学课程是:数学
package com.cskaoyan.javase.oop;
/**
* @description: 试题
* @author: wuguidong@cskaoyan.onaliyun.com
**/
public class Test {
public static void main(String[] args) {
Sub sub = new Sub();
}
}
class Base{
static {
System.out.println("base 静态代码块");
}
{
System.out.println("base 构造代码块");
}
public Base(){
//super();
System.out.println("base无参构造");
}
}
class Sub extends Base{
static {
System.out.println("sub 静态代码块");
}
{
System.out.println("sub 构造代码块");
}
public Sub(){
//super();
System.out.println("sub 无参构造");
}
}
分析结果:
Sub sub--->加载Sub.class--->发现extends,加载Base.class--->加载Base中静态代码块--->加载Sub中静态代码块----> new Sub()----Sub()--->super-->Base()【进入object】
-->Base构造代码块--->Base构造方法--->Sub构造代码块--->Sub构造方法
1.base 静态代码块
2.sub 静态代码块
3.base 构造代码块
4.base无参构造
5.sub 构造代码块
6.sub 无参构造
package com.cskaoyan.javase.oop;
import java.nio.channels.Pipe;
/**
* @description: test
* @author: wuguidong@cskaoyan.onaliyun.com
**/
public class Obj3 extends Obj1 {
Obj2 ob2 = new Obj2();
public Obj3(){
System.out.println("obj3");
}
public static void main(String[] args) {
Obj3 obj3 = new Obj3();
}
}
class Obj1 {
Obj2 ob2 = new Obj2();
public Obj1() {
System.out.println("Obj1");
}
}
class Obj2 {
public Obj2() {
System.out.println("obj2");
}
}
看题目说结果:
1.Obj2
2.obj1
3.obj2
4.obj3
总结:
Obj2 ob2 = new Obj2();比构造方法先执行。构造方法最后执行