java继承类有哪些_java基础 类 & 继承

在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称

在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化:

1)对于  char、short、byte、int、long、float、double等基本数据类型的变量来说会默认初始化为0(boolean变量默认会被初始化为false);

2)对于引用类型的变量,会默认初始化为null。

如果没有显示地定义构造器,则编译器会自动创建一个无参构造器,但是要记住一点,如果显示地定义了构造器,编译器就不会自动添加构造器。注意,所有的构造器默认为static的

类的加载&初始化

类初始化顺序:父类初始化 > 静态属性顺序 > 静态代码块 > 非静态属性 > 构造函数

当程序执行时,需要生成某个类的对象,Java执行引擎会先检查是否初始化了这个类,如果没有,则先执行类的初始化再生成对象,如果已经初始化,则直接生成对象

在Java中,类是按需初始化,只有当需要用到这个类的时候,才会初始化这个类,并且只会初始化一次

什么时候类会被初始化:

1)当使用new关键字实例化对象时,当读取或者设置一个类的静态字段(被final修饰的除外)时,以及当调用一个类的静态方法时(比如构造方法就是静态方法),如果类未初始化,则需先初始化

2)通过反射机制对类进行调用时,如果类未初始化,则需先初始化

3)当初始化一个类时,如果其父类未初始化,先初始化父类

4)用户指定的执行主类(含main方法的那个类)在虚拟机启动时会先被初始化

继承

在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承

1.子类继承父类的成员变量

1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;

2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用

2.子类继承父类的方法

1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;

2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为重写,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用

注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的

重写(基于以上继承方法的规则):

1)重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载

2)重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)

3)重写的方法的返回值必须和被重写的方法的返回一致

4)重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类

重载的规则:

1)在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样)

2)不能通过访问权限、返回类型、抛出的异常进行重载

3)方法的异常类型和数目不会对重载造成影响

3.构造器

子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器

父类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classPeople {privateString name;publicPeople(String name) {this.name =name;

}

}

View Code

子类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public class Chinese extendsPeople {publicChinese(String name) {super(name);

}

}

View Code

子类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

class Janpa extendsPeople {staticString name;publicJanpa() {super(name);

}

}

View Code

4.super

super主要有两种用法:

1)super.成员变量/super.成员方法 :在子类中调用父类的同名成员变量或者方法

2)super(parameter1,parameter2....) :在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句

继承笔试题

1.下面这段代码的输出结果是什么?

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classTest {public static voidmain(String[] args) {newCircle();

}

}classDraw {publicDraw(String type) {

System.out.println(type+" draw constructor");

}

}classShape {private Draw draw = new Draw("shape");publicShape(){

System.out.println("shape constructor");

}

}class Circle extendsShape {private Draw draw = new Draw("circle");publicCircle() {

System.out.println("circle constructor");

}

}

View Code

8f900a89c6347c561fdf2122f13be562.pngView Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

shape draw constructor

shape constructor

circle draw constructor

circle constructor

View Code

2.下面这段代码的输出结果是什么?

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classTest {public static voidmain(String[] args) {

Shape shape= newCircle();

System.out.println(shape.name);

shape.printType();

shape.printName();

}

}classShape {public String name = "shape";publicShape(){

System.out.println("shape constructor");

}public voidprintType() {

System.out.println("this is shape");

}public static voidprintName() {

System.out.println("shape");

}

}class Circle extendsShape {public String name = "circle";publicCircle() {

System.out.println("circle constructor");

}public voidprintType() {

System.out.println("this is circle");

}public static voidprintName() {

System.out.println("circle");

}

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

shape constructor

circle constructor

shapethisis circle

shape

View Code

3.下面这段代码的输出结果是什么?

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classPeople {int age = 1;publicPeople() {this.showAge();

age= 2;

}public voidshowAge() {

System.out.println("fu lei age=" +age);

}

}class Stu extendsPeople {int age = 3;publicStu() {this.showAge();

age= 4;

}public voidshowAge() {

System.out.println("zi lei age=" +age);

}

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

People p = newStu();

System.out.println(p.age);

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

zi lei age=0zi lei age=3

2

View Code

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值