class Fu{
int num = 5;
}
class Zi extends Fu{
int num = 20;
public void show() {
int num = 30;
System.out.println("num:"+num);
//当局部变量和成员变量重名的时候用this来区分
System.out.println("this num:"+this.num);
//当子类和父类出现了同名变量,用super来区分
System.out.println("father num:"+super.num);
}
}
总结:在一个类中如果方法中的局部变量和方法外的成员变量重名,那么如果在方法内输出这变量,就是方法自己的变量里的值,想要区分要用this,加上this.就是输出成员变量的值
在子父类中如果出现成员变量重名的时候,在子类输出会输出自己的变量里的值,想要区分要用super,加上super.就是输出父类里变量的值
this和super的区分:
**this代表本类对象的引用
super本类对象父类的引用。
**this可以用于区分局部变量和成员变量同名的情况。
super可以用于区分子类和父类成员变量同名的情况。
**一般,子类中不会出现和父类同名的成员变量。面试可能问到。
(2)成员方法
class Fu {
public void show() {
System.out.println("fu show");
}
public void method() {}
}
class Zi extends Fu{
public void show(){
System.out.println("zi show");
}
}
子类中存在和父类成员方法同名的这种现象,叫做重写,复写,覆盖。
重写(override)和重载(overload)的区别:
重载的特点:
**在同一类中。
**方法名相同,参数列表不同。
重写的特点:
**要有继承关系。在子父类中
**方法的声明相同。(方法名和参数列表都相同)
***覆盖时,子类方法权限一定要大于等于父类方法权限
父类的权限不能是私有的
***静态只能覆盖静态。
class Fu{
Fu(){}
Fu(int age){
System.out.println("father age:"+age);
}
}
class Zi extends Fu{
Zi(){
this(40);
System.out.println("son");
}
Zi(int age){
super();
System.out.println("son age:"+age);
}
}
Zi z = new Zi();
Zi z = new Zi(30);
总结:子类中所有的构造方法默认都会访问父类中空参数的构造方法。
**因为每一个构造方法的第一行都有一条默认的语句super();
当父类中没有空参数的构造方法时,子类的构造函数必须通过this
或者super语句指定要访问的构造方法。或者手动提供无参构造方法。
this(...):调用本类中的构造方法
super(...):调用父类中的构造方法
构造方法用于创建对象,并进行初始化.建议如果你写了有参的构造函数,也要把空参的构造函数再手动加上
否则你定义了有参的构造函数,空参的系统就不会再给了
你这样创建对象的时候就会报错Person p = new Person();//这句话是会去找空参的构造函数
class Person{
Person(){}
Person(int age){
this.age = age;
}
Person(int age,String name){
this(age);
//this.age = age;
this.name = name;
}
}
//Person p =new Person(); //系统默认给出无参构造
//当你手动给出构造方法后,系统就不会再给出默认的空的构造方法。
手动无参数,如果你想给属性赋值或者做一些初始化,无参你别删不就行了吗。
class Demo{
private String name;
Demo(){}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
常量的命名规范:要求大写。
final double PI = 3.14;
final修饰的变量可以在声明的时候直接赋值,还可以在构造方法可以给final修饰的变量赋值。
(3)多态中成员的特点:(我们只研究特殊的,就是说名字一样的东西) Fu f = new Zi(); A:成员变量:编译和运行都看Fu。 B:非静态方法:编译看Fu,运行看Zi。 C:静态方法:编译和运行都看Fu。
举例: 动物的例子: 向上转型 Animal a = new Cat(); a.eat(); //a.catchMouse();
向下转型
Cat c = (Cat)a;
c.eat();
c.catchMouse();
//向上转型
Animal a = new Dog();
//向下转型 转换异常
//Cat c = (Cat)a;
Dog d = (Dog)a;
总结:无论是向上转型还是向下转型,变化的都是子类对象,绝对不能把父类对象强转为子类类型