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();
	}
	
}



java面向对象学习相关简要笔记(2)
子类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();
	}
	
}

java面向对象学习相关简要笔记(2)
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();
	}
	
}



java面向对象学习相关简要笔记(2)
从运行结果上看,子类通过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();
	}
	
}

java面向对象学习相关简要笔记(2)从运行结果上看,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();
	}
	
}

发现会报错:
java面向对象学习相关简要笔记(2)
这是因为在子类的构造方法中一定会调用父类的某个构造方法,可以用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修饰的变量时常量,只能赋值一次