Java 类和对象(2)
构造函数
什么是构造函数?
就是给类的实例变量进行初始化的函数
class A{
public int a;//实例变量
A (int b) {//自己定义的构造函数//也称为构造函数的重载
int i; //局部变量
a=b;//初始化a
}
}
构造函数形式与C++相同:
类名 (形参表)
{
函数体;//构造函数无返回值,不用在类名前面写返回值类型
}
默认的构造函数
只要创建对象,就会调用构造函数。
如果你没有定义自己的构造函数,系统会调用默认的,
默认构造函数自动地将所有的实例变量初始化为零。
一旦你定义了自己的构造函数,系统默认的构造函数将不再实行。
重载
学过C++的都知道,但是这里再说一遍
就是同名函数,形参有区别,但是函数功能相近,允许同名;
简单举例就是:
int add (int a,int b)
int add (int a, int b,int c)
函数重载与函数返回值类型无关,即使是
int add (int a,int b)
float add (int a, int b)
也不叫函数重载。
重载(overload)简单地说,就是允许多个同名但形参个数、类型或顺序不同的函数方法存在于一个类里面,当被调用时,由形参来决定调用具体方法。
在Java中,同一个类中的两个或两个以上的方法可以有同一个名字,只要它们的参数声明不同即可。在这种情况下,该方法就被称为重载(overloaded)。
类的继承
Java中不允许多重继承,只支持单重继承,即一个子类只能有一个直接父类。
Java中,extends是继承的关键字
格式:
修饰符 class 子类名 extends 父类名{
//子类成员;
}
简单举例就是员工和经理的例子
class employee {
//类成员
public void fun {
}
}
class manager extends employee{
//子类成员
public void fun {
//方法覆盖 子类父类中都有fun函数,
因为子类也可以访问父类的函数,
所以在子类中使用fun会覆盖父类的fun
}
}
申明的话 直接在静态主函数 public static void main {String [] arg}函数中
用子类名 子类对象名 = new 子类名();
此处就是 manager m= new manger();
继承后的子类可以访问父类中public 和protected成员
访问权限会在后续展开说。
有兴趣可以自己验证下
package test;
class father{
int x=1;//x为友元 具体以后再说
protected int a=1;
public int b=2;
public void fun() {
System.out.println("a的值为"+a);
System.out.println("b的值为"+b);
}
private void fun1() {
System.out.println("a的值为"+a);
System.out.println("b的值为"+b);
}
}
public class son extends father {
private int a1=3;
public int b1=4;
public void fun() {
System.out.println("a的值为"+a);
System.out.println("b的值为"+b);
}
private void fun2() {
System.out.println("a1的值为"+a1);
System.out.println("b1的值为"+b1);
}
public static void main(String[] args) {
son s =new son();
s.fun();
s.fun2();
// TODO Auto-generated method stub
}
}
得出的结果是
a的值为1
b的值为2
a1的值为3
b1的值为4
子类只能访问父类中友元,public,protected成员,不能访问private成员;
在Java中类内缺省修饰符的函数/数据成员就是友元,友元可以被同一包内所有类访问。
需要强调的是,在子类中可以增加变量,增加方法或者覆盖方法,但是绝对不会删除继承的任何变量和方法。
也就是说,上面虽然覆盖了原来的方法,只是调用时调用的新方法,原来继承过来的旧方法还是有的。
下一节介绍Java访问权限
from nuister kjr