zoukankan      html  css  js  c++  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关键字,系统会自动调用父类的无参构造器

    父类

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

    子类

    public class Chinese extends People {
    
        public Chinese(String name) {
            super(name);
        }
    }
    View Code

    子类

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

    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");
        }
    }
    View Code

    shape draw constructor
    shape constructor
    circle draw constructor
    circle constructor
    View Code

    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");
        }
    }
    View Code
    shape constructor
    circle constructor
    shape
    this is circle
    shape
    View Code

    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);
        }
    }
    View Code
    People p = new Stu();
    System.out.println(p.age);    
    View Code
    zi lei age=0
    zi lei age=3
    2
    View Code
  • 相关阅读:
    Js注释和对象
    卸载Oracle
    数据库设计三大范式
    Oracle用户管理
    Oracle权限管理详解
    Linux 性能监控之CPU&内存&I/O监控Shell脚本2
    Linux 性能监控之CPU&内存&I/O监控Shell脚本1
    Windows Win7建立wifi热点,手机共享WIFI上网
    Mariadb MySQL逻辑条件判断相关语句、函数使用举例介绍
    Mariadb MySQL、Mariadb中GROUP_CONCAT函数使用介绍
  • 原文地址:https://www.cnblogs.com/amei0/p/4448123.html
Copyright © 2011-2022 走看看