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

 

posted @ 2015-04-22 17:26  情歌z  阅读(236)  评论(0编辑  收藏  举报