java面向对象学习相关简要笔记(2)
继承:
类的继承,指在一个现有的类的基础上去构建一个新的类,构建出来的新类被称为子类,现有的类被称为父类,子类会拥有父类所有可继承的属性和方法。
class Animal{
String name;
void shout(){
System.out.println("动物发出叫声");
}
}
class Dog extends Animal{
public void printName(){
System.out.println("name="+name);
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
dog.name="泰迪";
dog.printName();
dog.shout();
}
}
子类Dog虽然没有定义name属性和shout(),但是却能访问这两个成员,这就说明子类在继承父类的时候,会自动拥有父类所有的成员。
关于类的继承,需要注意的一些问题:
1、类只能单继承,不允许多重继承。
class A{}
class B{}
class C extends A,B{} //C类不可以同时继承A类和B类
2、多个类可以继承一个父类
class A{}
class B extends A{} //这种情况是允许的
class C extends A{} //这种情况是允许的
3、多层继承是允许的
class A{}
class B extends A{}
class C extends B{} //类C继承B类,类C是类B的子类,同时也是类A的子类。
重写父类方法:
在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
class Animal{
void shout(){
System.out.println("动物发出叫声");
}
}
class Dog extends Animal{
void shout(){
System.out.println("旺旺....");
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
dog.shout();
}
}
super关键字
1、使用super关键字调用父类的成员变量和成员方法
格式:
super.成员变量
super.成员方法([参数1,参数2…])
class Animal{
String name="动物";
void shout(){
System.out.println("动物发出叫声");
}
}
class Dog extends Animal{
String name="犬类";
//重写父类的shout()方法
void shout(){
super.shout();
}
void printname(){
System.out.println("name="+super.name); //访问父类的成员变量
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
dog.shout();
dog.printname();
}
}
从运行结果上看,子类通过super关键字可以成功地访问父类成员变量和成员方法。
2、使用super关键字调用父类的构造方法
格式:super([参数1,参数2…])
class Animal{
//定义Animal类有参的构造方法
public Animal(String name){
System.out.println("我是一只"+name);
}
}
class Dog extends Animal{
public Dog(){
super("小泰迪"); //调用父类有参的构造方法
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
}
}
从运行结果上看,Dog类的构造方法被调用时父类的构造方法也被调用了。需要注意的是,通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
3、将上面代码换成下面(将Dog类的构造方法变为空的代码块)
class Animal{
//定义Animal类有参的构造方法
public Animal(String name){
System.out.println("我是一只"+name);
}
}
class Dog extends Animal{
public Dog(){
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
}
}
发现会报错:
这是因为在子类的构造方法中一定会调用父类的某个构造方法,可以用super关键字来指明调用哪一个构造方法,如果没有用super关键字指明,那么在实例化子类对象时,会自动调用父类无参的构造方法,所以为了解决上面的错误,可以在子类中显式地调用父类中已有的构造方法;也可以在父类(Animal)中定义一个无参的构造方法
例如:
class Animal{
//定义Animal类有参的构造方法
public Animal(){
}
public Animal(String name){
System.out.println("我是一只"+name);
}
}
class Dog extends Animal{
public Dog(){
}
}
public class example2{
public static void main(String[] args){
Dog dog=new Dog();
}
}
所以说,如果没有特殊需求,尽量在类中定义一个无参的构造方法,避免被继承时出现错误。
final关键字:
final修饰的类不能被继承
final修饰的方法不能被子类重写
final修饰的变量时常量,只能赋值一次