java-继承

面向对象的三大特征之二-继承

在面向对象中,类与类之间可以存在继承关系
 在Java中,Java语言不支持多重继承,是一种典型的单继承编程语言

继承的功能:

被继承的类叫做父类(超类、基类)由继承产生的新的类叫做子类(派生类),一个父类可以通过继承产生多个子类,子类继承父类的成员变量和成员方法,不需要编写重复的代码,大大提高了代码的复用性。
所有的类都是直接或者间接的继承java.lang.Object类来的

关于private修饰的属性和方法能否被子类继承

http://t.csdn.cn/1pjtY

留白待写

子类的创建


1.1子类的创建方法

java语言中类的继承由关键字extends实现,未使用则默认继承java.lang.Object

package homework12day;

class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("调用Person类的无参构造方法");
    }
    public void setNameAge(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void show(){
        System.out.println("姓名:"+name+"年龄"+age);
    }
}
package homework12day;

public class Student extends Person {
	private String teacher;
    public Student(){
        System.out.println("调用Student类的无参构造方法");
    }
    public void setTeacher(String teacher){
        this.teacher=teacher;
        System.out.println("我是"+teacher+"的学生");
    }
}
package homework12day;

public class Text01 {

	public static void main(String[] args){
		Student stu=new Student();
		stu.setNameAge("路人甲",20);
		stu.show();
		stu.setTeacher("m老师");
		}
	
}
//调用Person类的无参构造方法
//调用Student类的无参构造方法
//姓名:路人甲年龄20
//我是m老师的学生

对象的创建流程:
    1、使用java命令将源码(.java)进行编译,生成字节码文件(.class)
    2、javac命令执行字节码文件
    3、将字节码文件加载进虚拟机(JVM),静态方法区开始加载静态资源
    4、JVM从静态方法区读取主函数,并加载进栈(执行栈被创建了出来)
    5、main函数开始执行, 创建对象的代码,如:Son son = new Son();
    6、在堆内存中开辟对象的内存空间,并分配地址
    7、创建成员变量并进行默认初始化
    8、子类构造函数从非静态方法区加载进栈开始执行
    9、第一句先执行父类的构造函数
    10、父类构造函数执行,为子类继承到的成员变量进行初始化(对象内存空间里的父类空间)
    11、父类构造函数弹栈执行完成
    12、子类构造函数继续执行,此时先对成员变量进行显式初始化
    13、再执行子类构造函数的内容,进行针对性初始化
    14、执行完成,子类构造函数弹栈,将对象的内存空间地址赋予相应的引用变量

 java在调用子类的构造函数之前,会先调用父类的构造方法。
构造方法是不能被继承的

类的成员加载(运行)顺序:

属性最先运行,之后是构造函数。static修饰的属性和静态代码块最先运行(这两者之间看代码顺序),之后才开始运行对象属性和构造代码块(这两者之间看代码顺序)最后构造函数开始运行

调用父类中特定的构造方法

子类会先调用父类的无参构造方法,进行初始化操作,但是如果父类中有多个构造函数,那么就需要在子类的构造方法中使用super()来调用父类中特定的构造方法。

package homework12day;

class Person{
	private String name;
    private int age;
    public Person(){
        System.out.println("调用Person类的无参构造方法");
    }
    public Person(String name,int age){
        System.out.println("调用Person类的有参构造方法");
        this.name=name;
        this.age=age;
    }
    public void show(){
        System.out.println("姓名:"+name+"年龄"+age);
    }
}
package homework12day;

public class Student extends Person {
	 private String teacher;
	    public Student(){
	        System.out.println("调用Student类的无参构造方法");
	    }
	    public Student(String name,int age,String teacher){
	        super(name,age);
	        this.teacher=teacher;
	        System.out.println("我是"+teacher+"的学生");
	        System.out.println("调用Student类的有参构造方法");
	    }
}
package homework12day;

public class Text01 {

	public static void main(String[] args){
        Student stu1=new Student();
        Student stu2=new Student("路人甲",20,"m老师");
        stu1.show();
        stu2.show();
		}
}
//调用Person类的无参构造方法
//调用Student类的无参构造方法
//调用Person类的有参构造方法
//我是m老师的学生
//调用Student类的有参构造方法
//姓名:null年龄0
//姓名:路人甲年龄20


如果省略super()则会默认调用父类的无参构造方法。
调用父类构造方法的super()语句必须放在子类构造方法的第一行。

super()可以重载,会根据参数的数量和类型选择调用父类的构造方法。
如果父类中只定义了有参数的构造方法,而子类中没有使用super()来调用父类特定的构造方法,则编译会出现错误。
 


在子类中访问父类成员

在子类中使用super()方法,可以访问父类中的特定的构造方法,还可以访问父类中的成员变量和成员方法。
    super在java中,是一个指针,类似于this关键字
    this关键字指向创建的每一个对象
    super会自动指向父类

super.变量名
super.方法名

方法重写(覆盖):


    重写(OverWrite)
    覆盖(OverRide)

    发生在继承中,指的是子类继承了父类方法后该方法不能满足子类,在子类中,定义名称,参数个数与类型与父类中完全相同的方法,用于实现重写父类中同名方法,已达到满足子类使用。在子类覆盖父类的方法时,可以扩大父类中方法的权限,但是不能缩小父类中方法的访问权限。

    子类中不能覆盖父类中声明为final和static的方法

final


final来修饰变量,则称该变量为最终变量(常量),程序中其他部分,可以访问,但是不可以修改。final修饰成员方法,则该方法不可以被子类覆盖,该方法称为最终方法。
final修饰类,则称该类为最终类,不可以被继承。
定义在类中的final成员变量和定义在方法中的final局部变量,一旦给定就不能被修改,都属于是只读量,只能赋值一次。

如果一个变量同时被final和static修饰(static final),则他的实质是一个常量,且这样的常量只能在定义的时候被赋值。如果一个变量只用final修饰而不用static,则只能被赋值一次,不能缺省。


注解(annotation):


    JDK5.0提供的新特性,利用反射技术,可以很轻松使用标注方法、属性、类等,
    从而扩展功能。

    @Override    // 覆盖
    @Deprecated    // 过时警告

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值