java基础之类与继承 详解

时间:2022-12-15 18:11:05

类  
在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关键字,系统会自动调用父类的无参构造器

父类

public class People {
private String name; public People(String name) {
this.name = name;
} }

子类

public class Chinese extends People {

    public Chinese(String name) {
super(name);
}
}

子类

class Janpa extends People {
static String name; public Janpa() {
super(name);
}
}

4.super
super主要有两种用法:

1)super.成员变量/super.成员方法 :在子类中调用父类的同名成员变量或者方法
2)super(parameter1,parameter2....) :在子类的构造器中显示地调用父类的构造器,要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句

继承笔试题

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

public class Test {
public static void main(String[] args) {
new Circle();
}
} class Draw { public Draw(String type) {
System.out.println(type+" draw constructor");
}
} class Shape {
private Draw draw = new Draw("shape"); public Shape(){
System.out.println("shape constructor");
}
} class Circle extends Shape {
private Draw draw = new Draw("circle");
public Circle() {
System.out.println("circle constructor");
}
}
shape draw constructor
shape constructor
circle draw constructor
circle constructor

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

public class Test {
public static void main(String[] args) {
Shape shape = new Circle();
System.out.println(shape.name);
shape.printType();
shape.printName();
}
} class Shape {
public String name = "shape"; public Shape(){
System.out.println("shape constructor");
} public void printType() {
System.out.println("this is shape");
} public static void printName() {
System.out.println("shape");
}
} class Circle extends Shape {
public String name = "circle"; public Circle() {
System.out.println("circle constructor");
} public void printType() {
System.out.println("this is circle");
} public static void printName() {
System.out.println("circle");
}
}
shape constructor
circle constructor
shape
this is circle
shape

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

class People {
int age = 1;
public People() {
this.showAge();
age = 2;
}
public void showAge() {
System.out.println("fu lei age=" + age);
}
}
class Stu extends People {
int age = 3;
public Stu() {
this.showAge();
age = 4;
}
public void showAge() {
System.out.println("zi lei age=" + age);
}
}
People p = new Stu();
System.out.println(p.age);
zi lei age=0
zi lei age=3
2

java基础之类与继承 详解的更多相关文章

  1. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  2. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  3. Java基础13:反射详解

    本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...

  4. Java基础(55):Exception类详解(转)

    Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...

  5. Java基础(44):ArrayList使用详解

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:    a.动态的增加和减少元素    b.实现了IColle ...

  6. java基础6 面向对象的详解

    本文知识点(目录): 1.1.万物皆对象    1.2.面向对象的概述    1.3.面向对象(java语言)与面向过程(C语言)对比    1.4.面向过程    1.5.对象    1.6.面向对 ...

  7. 【Java基础】HashMap原理详解

    哈希表(hash table) 也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中Has ...

  8. Java基础之开关语句详解

    switch 语句是单条件多分支的开关语句,它的一般格式定义如下(其中break语句是可选的): switch(表达式) { case 常量值: 若干个语句 break; case  常量值: 若干个 ...

  9. 【Java基础】While循环详解

    循环结构分两大类,一类是当型,一类是直到型. 当型: 当布尔值表达式条件为True时,反复执行某语句,当布尔表达式的值为False时才停止循环,例如:while 与 for循环. 直到型: 先执行某语 ...

随机推荐

  1. CSS选择器(一)

    CSS选择器包括标签选择器.ID选择器.类选择器.伪类和伪对象选择器.子选择器.相邻选择器.属性选择器.通用选择器.包含选择器.分组选择器.指定选择器等选择器,分为标签选择器.ID选择器.类选择器.特 ...

  2. 【leetcode】Maximal Rectangle

    Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...

  3. init: sys_prop: permission denied uid:1003 name:service.bootanim.exit

    /************************************************************************* * init: sys_prop: permiss ...

  4. Even Fibonacci numbers

    --Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting ...

  5. Java基础知识强化之IO流笔记23:计算机是如何识别把两个字节拼接为中文(附加)

    1. 计算机是如何识别什么时候该把两个字节转换为一个中文呢? 在计算机中中文的存储分两个字节: • 第一个字节肯定是负数. • 第二个字节常见的是负数,可能有正数.但是没影响. 2. 代码示例: pa ...

  6. Java之面向对象例子(二)

    定义一个Book类,在定义一个JavaBook类继承他 //book类 package com.hanqi.maya.model; public class Book { public String ...

  7. jsp页面无法使用EL

    解决:http://blog.csdn.net/caixiexin/article/details/6958199 在web.xml中头部引入,2.3版本不支持EL,2.4默认开启,2.5默认关闭需要 ...

  8. CentOS配置SSH无密码

    210-211/212/213的集群中,新增215节点,操作:1.将210的id_rsa.pub拷贝到215中:scp ~/.ssh/id_rsa.pub 192.168.0.215@host:/ho ...

  9. numpy——.npy和.npz文件

    npy文件--Numpy专用的二进制格式np.load()和np.save()是读写磁盘数组数据的两个重要函数.使用时,数组会以未压缩的原始二进制格式保存在扩展名为.npy的文件中. import n ...

  10. springboot整合rabbirmq(3.7.9)中使用mandatory参数获取匹配失败的消息以及存入rabbitmq备份交换器中!

    先说下这个参数的作用: /** * Mandatory为true时,消息通过交换器无法匹配到队列会返回给生产者 * 为false时,匹配不到会直接被丢弃 */在一些特定场景下还是有用处的!接下来说一下 ...