标签:将不 rgs 继承 调用 ons 最好 def animal ror
1)第一种用法:super 关键字是父类对象的引用
	
package com.example;
public class Person{ // 父类
	public String name="张三";
	public int age = 20;
	
	public void speak(){
		System.out.println("Person: speak()");
	}
	public void cry(){
		System.out.println("Person: cry()");
	}
}
	
	
package com.example;
public class Man extends Person{ // 子类
	public void speak(){
		System.out.println("Man: speak()");
		
		super.speak(); // 调用父类的 speak
		cry(); // 调用父类的 cry
		
		System.out.println("name: " + name); // 调用父类的 name
		System.out.println("age: " + super.age); // 调用父类的 age
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		Man m = new Man();
		m.speak();
	}
}
	
运行结果: Man: speak() Person: speak() Person: cry() name: 张三 age: 20
2)第二种用法:super() 或者 super(参数列表) 是父类的构造器
例1:
	
package com.example;
public class Person{ // 父类
	public Person(){
		System.out.println("Person()");
	}
}
	
	
package com.example;
public class Man extends Person{ // 子类
	public Man(){
		super(); // 父类构造器
		System.out.println("Man()");
		// super(); //error
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		new Man();
	}
}
	
运行结果: Person() Man()
例2:
	
package com.example;
public class Person{ // 父类
	public Person(int i){
		System.out.println("Person" + "(" + i + ")");
	}
	public Person(String str){
		System.out.println("Person" + "(" + str + ")");
	}
}
	
	
package com.example;
public class Man extends Person{ // 子类
	public Man(){
		super(1); // 调用父类构造器
		System.out.println("Man()");
	}
	public Man(int i){
		super("张三"); // 调用父类构造器
		System.out.println("Man" + "(" + i + ")");
	}
	public Man(String str){
		super(2); // 调用父类构造器
		System.out.println("Man" + "(" + str + ")");
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		new Man();
	}
}
	
运行结果: Person(1) Man()
1)Java 的访问控制权限有 public,protected,<default>,private 其中如果没有涉及继承关系时,protected 和 <default> 都只能在包内访问
	
package net.example;
public class S{
	public int i = 10;
	protected double d = 51.2;
	String str1 = "张三"; // <default>
	private String str2 = "李四"; 
}
	
	
package com.example;
public class T{
	public int i = 10;
	protected double d = 51.2;
	String str1 = "张三"; // <default>
	private String str2 = "李四";
}
	
	
package com.example;
import net.example.S; // 导入 S 类
public class Test{
	public static void main(String[] args){
		S s1 = new S();
		System.out.println("S: " + s1.i);
		//System.out.println("S: " + s1.d); // error
		//System.out.println("S: " + s1.str1); // error
		//System.out.println("S: " + s1.str2); // error
		
		T t1 = new T();
		System.out.println("T: " + t1.i);
		System.out.println("T: " + t1.d);
		System.out.println("T: " + t1.str1);
		//System.out.println("T: " + t1.str2); // error
	}
}
	
运行结果: S: 10 T: 10 T: 51.2 T: 张三
2)子类可以访问父类中用 protected 限制的属性和方法,即使子类和父类不在同一个包内
	
package net.example;
public class Animals{ // 父类
	protected int age = 2;
	String name = "旺财"; // <default>
	
	protected void bark(){
		System.out.println("汪汪");
	}
}
	
	
package com.example;
import net.example.Animals; // 导入 Animals 类
public class Dogs extends Animals{ // 子类
	public Dogs(){
		System.out.println(age);
		//System.out.println(name); // error
		bark();
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		new Dogs();
	}
}
运行结果: 2 汪汪
	
package com.example;
public class Person{ // 父类
	public void p1(){
		System.out.println("Person: p1");
	}
	protected void p2(){
		System.out.println("Person: p2");
	}
	void p3(){
		System.out.println("Person: p3");
	}
	private void p4(){
		System.out.println("Person: p4");
	}
}
	
	
package com.example;
public class Man extends Person{ // 子类
	public void p1(){
		System.out.println("Man: p1");
	}
	
	
	
/* 	public void p2(){
		System.out.println("Man: p2");
	} */
	protected void p2(){
		System.out.println("Man: p2");
	}
/* 	void p2(){ // error, protected 的访问控制权限比 <default> 的高
		System.out.println("Man: p2");
	} */  
	
	
	
/* 	public void p3(){
		System.out.println("Man: p3");
	}
	protected void p3(){
		System.out.println("Man: p3");
	} */
	void p3(){
		System.out.println("Man: p3");
	}
	
	
	
/* 	public void p4(){
		System.out.println("Man: p4");
	}
	protected void p4(){
		System.out.println("Man: p4");
	}
	void p4(){
		System.out.println("Man: p4");
	} */
	private void p4(){
		System.out.println("Man: p4");
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		Man m = new Man();
		m.p1();
		m.p2();
		m.p3();
		//m.p4(); // error
	}
}
	
运行结果: Man: p1 Man: p2 Man: p3
1)初始化顺序:父类静态属性 -> 子类静态属性 -> 父类非静态属性 -> 父类构造器调用 -> 子类非静态属性 -> 子类构造器调用
package com.example;
public class T{
	public T(int i){
		System.out.println("T" + "(" + i + ")");
	}
}
	
	
package com.example;
public class Person{ // 父类
	public static T t1 = new T(1); // 静态属性
	public T t2 = new T(2); // 非静态属性
	
	public Person(){
		System.out.println("Person()");
	}
	
	public static T t3 = new T(3); // 静态属性
}
	
	
package com.example;
public class Man extends Person{ // 子类
	public static T t4 = new T(4); // 静态属性
	public T t5 = new T(5); // 非静态属性
	
	public Man(){
		System.out.println("Man()");
	}
	
	public static T t6 = new T(6); // 静态属性
}	
	
package com.example;
public class Test{
	public static void main(String[] args){
		new Man();
	}
}
	
运行结果: T(1) T(3) T(4) T(6) T(2) Person() T(5) Man()
1)Java 为了保证方法重写时不会出现误写成方法重载的情况,所以引入了 @Override
	
package com.example;
public class Person{ // 父类
	public void speak(int i){
		System.out.println("Person: speak" + "(" + i + ")");
	}
}
	
	
package com.example;
public class Man extends Person{ // 子类
	
	
	/* @Override
	public void speak(String str){
		System.out.println("Man: speak" + "(" + str + ")");
	} */ // error,用了 @Override ,那么 @Override 下面的方法必须是方法重写,否则编译时会出错
	
	@Override
	public void speak(int i){
		System.out.println("Man: speak" + "(" + i + ")");
	}
}
	
	
package com.example;
public class Test{
	public static void main(String[] args){
		Man m = new Man();
		m.speak(10);
	}
}
	
运行结果: Man: speak(10)
1)继承抽象类时,如果父类中有抽象方法,那么子类必须全部重写父类中的抽象方法
	
package com.example;
public abstract class Person{
	
	public abstract void p1(); // 抽象方法
	public abstract void p2();
	
	
	public void p3(){
		System.out.println("Person: p3()");
	}
	public void p4(){
		System.out.println("Person: p4()");
	}
}
	
		
	
package com.example;
public class Man extends Person{
	@Override
	public void p1(){
	}
	
	@Override
	public void p2(){
	}
}
	
				
					1)由 final 关键字修饰的类不能被继承,例如:public final class Person{} 
					2)在继承关系中,如果父类的方法由 final 关键字修饰,那么该方法将不能被子类重写
				
参考资料:
				
《Java 编程思想》第4版
			
标签:将不 rgs 继承 调用 ons 最好 def animal ror
原文地址:https://www.cnblogs.com/huangzenglie/p/8837979.html