方法参数传递
1.对于基本类型数据的参数(byte,short,int,long,char,float,double,Boolean),形参改变不影响实参的值。
2、对于引用类型数据(类类型,接口类型和数组),形参改变影响实参的值。
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类{
... //成员变量、成员方法
}
class 子类 extends 父类{
... //类体
}
注意:
子类不能选择性继承父类;
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
构造方法不会被子类继承,但可以从子类中调用父类的构造方法。
继承的优点
继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
可以在子类中声明一个在父类中没有的新字段和方法;
可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。
重写和隐藏父类方法
子类继承了父类中的所有成员及方法,但在某种情况下,子类中该方法所表示的行为与其父类中该方法所表示的行为不完全相同,例如,在父类语言中定义了说话这个方法,而在子类中说话的方法是不同的:外国人说英文,中国人说中文,这时我们就需要重写或隐藏父类的该方法。
class A{
public void sayHello() { //输出英文欢迎
System.out.println("Hello,Welcome to Java!!!");
}
public void sayBye() {
System.out.println("GoodBye,everyone");
}
}
class B extends A {
public void sayHello() { //输出中文欢迎
System.out.println("大家好,欢迎学习Java!!!");
}
}
public class myfirst {
public static void main(String[] args) {
B b=new B(); //创建子类B的一个实例对象,使用默认构造方法
b.sayHello(); //调用子类中重写的方法
b.sayBye(); //调用父类中的方法
}
}
大家好,欢迎学习Java!!!
GoodBye,everyone
子类访问父类私有成员
子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的字段呢,我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问相应的字段。例如:
class A{ //父类A
private int value=10; //声明一个私有变量value并赋值为10
public int getvalue() { //声明一个公有成员方法getvalue,返回value
return value;
}
}
class B extends A{ //A的子类B
}
public class myfirst {
public static void main(String[] args) {
B b=new B(); //创建子类B的一个实例对象
System.out.println("子类通过父类提供的公共接口访问A中的私有字段value:"+b.getvalue());
}
}
子类通过父类提供的公共接口访问A中的私有字段value:10
使用super关键字
使用super调用父类中重写的方法、访问父类中被隐藏的字段
子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。例如:
package first;
class A{
public String name="张飞"; //添加成员变量
public void say() { //添加成员方法say
System.out.println("我是父类A成员方法say");
}
}
class B extends A{
public String name="关羽"; //与父类中同名的字段,隐藏父类
public void say(){ //重写方法say
super.say(); //使用super关键字调用父类中的方法
System.out.println("我是子类B成员方法say");
System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
}
}
public class myfirst {
public static void main(String[] args) {
B b=new B(); //创建子类的一个实例对象
b.say(); //调用子类中重写的方法
System.out.println("子类的name名字:"+b.name); //调用子类中的name
}
}
我是父类A成员方法say
我是子类B成员方法say
父类的name名字:张飞
子类的name名字:关羽
使用super调用父类的无参数构造方法/有参数构造方法
子类不继承其父类的构造方法。
- 当使用无参数的super()时,父类的无参数构造方法就会被调用;
- 当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。
class SuperClass { //创建父类SuperClass
private int n; //声明一个私有变量n
SuperClass(){ //父类无参数构造方法
System.out.println("这是父类SuperClass无参数构造方法");
}
SuperClass(int n) { //父类有参数构造方法
System.out.println("这是父类SuperClass有参数构造方法");
this.n = n;
}
}
class SubClass extends SuperClass{ // SubClass类继承SuperClass类
private int n; //声明一个私有变量n
SubClass(){ // 自动调用父类的无参数构造器
System.out.println("这是子类无参数构造方法");
}
public SubClass(int n){ //子类有参数构造方法
super(300); //调用父类中带有参数的构造器
System.out.println("这是子类有参数构造方法"+n);
this.n = n;
}
}
public class myfirst {
public static void main(String[] args) {
SubClass sc1 = new SubClass(); //创建子类SubClass实例对象,调用其无参数构造方法
SubClass sc2 = new SubClass(100); //创建子类SubClass实例对象,调用其有参数构造方法
}
}
这是父类SuperClass无参数构造方法
这是子类无参数构造方法
这是父类SuperClass有参数构造方法
这是子类有参数构造方法100