java继承

* 继承(extends)
* java是一种树形结构(联结类的层次模型),单继承(父类),多实现(接口+内部类)
* 子类和父类之间是is-a关系
* 在子类中使用super关键字,访问父类的成员,super必须出现在子类。本类中方法中this调用本类的成员(属性和方法,区别于局部变量),在构造方法中调用(替代)其他构造方法
* 继承规则:①不能继承private成员
*                 ②子类和父类不在同包时,不能继承default默认修饰符成员
*                 ③不能继承(覆盖)父类构造方法(但,在子类构造方法中,使用super可以调用,必须构造方法的第一行)
* 方法重写(覆盖){继承多态}:重写方法和被重写方法,必须有相同的方法名,参数列表,返回值,并且重写方法的访问修饰符权限大于等于被重写方法
* 1:成员方法被覆盖,静态方法不能覆盖
* 2:成员属性(对象)、静态成员属性(类)、静态块(类)被继承了,但不会被覆盖
* 3:用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生;final修饰的类不可以被继承
* 4:子类构造方法中第一行没有显示使用super调用父类构造方法或this调用本类其他构造方法,则系统默认调用父类的无参构造方法,这种情况,super可以不写(代码规范应该写)
* 5:类在new关键字初始化时,会递归调用高一级的构造方法,结束于Object类的无参构造方法
* 6:abstract(抽象)修饰方法,声明方法而不去实现。此时类为抽象类,不能实例化,必须继承使用,可以作为引用类型。
* 7:抽象(或非抽象)父类:将子类中的共性最大限度的抽取出来,放在父类中,提高程序的简洁性。例如:狗(子类)是一种哺乳动物(父类),is - a

* 8:方法:abstract必须继承才能使用,static不能被覆盖,final不能被覆盖,所有不能同时作为修饰符

* 9:局部变量和成员变量,在同一个类中,不能有重名的成员变量,在同一方法中不能有重名的局部变量,但同一个类中多个不同方法,成员变量和局部变量可以重名(冲突)。

局部变量,要先赋值,在进行计算。而成员变量new出来就已经赋有初值值。

实现代码:

父类:

package ca.bx.staticextends;

public class APClass {
	private String p1;
	private int p2;
	//有参构造方法
	public APClass(String x,int y){
		this.p1 = x;
		this.p2 = y;
	}
	//默认构造方法
	public APClass(){
		super();
	}
	//成员变量(属于对象)
	private int a = 1;
	int b = 2;
	protected int c = 3;
	public int d = 4;
	public int f = 444;
	public static final int h = 555;
	//静态变量,类变量(属于类)
	public static int sa = 5;
	public static int sc;
	public static int sd;
	public static int sf;
	//静态块,初始化静态成员变量
	static{
		sc = 6;
		sd = 7;
		sf = 8;
	}
	//成员方法(属于对象)
	public int add(int x,int y){
		return x + y;
	}
	//静态方法,类方法(属于类)
	public static int multiply(int x,int y){
		return x * y;
	}
	//final修饰方法
	public final int minus(int x,int y){
		return x - y;
	}
	//省略对私有属性,访问接口,getter和setter方法
}

子类继承父类:

package ca.bx.staticextends;

public class SClass extends APClass{
	private boolean p3;
	private String p4;
	//调用构造方法,	//this和super不能同时使用
	public SClass(boolean b,String s){
		this();//相当于本类的public SClass()构造方法,也可以this(false,"ss");必须第一行
		this.p3 = b;
		this.p4 = s;
	}
	//默认构造方法
	public SClass(){
		super("ss", 1);//调用父类的public APClass(String x,int y)构造方法;必须第一行
	}
	//成员变量(属于对象)
	private int a = 11;
	int b = 22;
	protected int c = 33;
	public int d = 44;
	//静态变量,类变量(属于类)
	public static int sa = 55;
	public static int sc;
	public static int sd;
	//静态块,初始化静态成员变量
	static{
		sc = 66;
		sd = 77;
	}
	//成员方法(属于对象)
	public int add(int x,int y){
		return x + y+8;
	}
	//静态方法,类方法(属于类)
	public static int multiply(int x,int y){
		return x * y *2;
	}
	//Error:不能覆盖final方法,故报错
//	public final int minus(int x,int y){
//		return x - y;
//	}
	//super调用父类的成员
	public void apcPrint(){
		System.out.println("父类b属性:"+super.b+",父类add方法:"+super.add(4, 9));
	}
	//this局部变量和成员变量,优先级前者高
	public void scPrint(){
		int b = 200;
		System.out.println("变量(局部)b:"+b+",成员变量b:"+this.b);
	}
}

测试类:

package ca.bx.staticextends;

public class TestX {

	public static void main(String[] args) {
		SClass sc = new SClass();
		APClass apc = new SClass();
		int x = 2;
		int y = 3;
		System.out.println("调用方法:");
		System.out.println(apc.add(x, y));//2 + 3 + 8  //成员方法被覆盖,多态
		System.out.println(apc.multiply(x, y));//2 * 3 //静态方法未被覆盖(静态),无多态   *APClass.multiply(x, y)
		//用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生
		System.out.println(sc.minus(x, y));
		System.out.println(apc.minus(x, y));
		sc.apcPrint();
		sc.scPrint();
		System.out.println("子类对象调用属性1:");
		//父类访问修饰符对子类可见,子类才可以继承(*方法也类似*)
		//a属性,为private,本来可见,子类不可见,不继承
		//b属性不在同包下,不可见,不继承
		System.out.println(sc.b);
		System.out.println(sc.c);
		System.out.println(sc.d);
		System.out.println(sc.f);
		System.out.println(sc.sa);
		System.out.println(sc.sc);
		System.out.println(sc.sd);
		System.out.println(sc.sf);
		System.out.println(sc.h);
		System.out.println("父类对象调用属性1:");
		System.out.println(apc.b);
		System.out.println(apc.c);
		System.out.println(apc.d);
		System.out.println(apc.f);
		System.out.println(apc.sa);
		System.out.println(apc.sc);
		System.out.println(apc.sd);
		System.out.println(apc.sf);
		System.out.println(apc.h);
		//***可见类的成员变量,可继承,但不可被子类覆盖
	}
}

输出结果:

调用方法:
13
6
-1
-1
父类b属性:2,父类add方法:13
变量(局部)b:200,成员变量b:22
子类对象调用属性1:
22
33
44
444
55
66
77
8
555
父类对象调用属性1:
2
3
4
444
5
6
7
8
555

时间: 2024-11-17 01:41:29

java继承的相关文章

android java 继承父类里的子类问题!!!!!!!

问题描述 android java 继承父类里的子类问题!!!!!!! 请问各位,java可以继承父类的方法和全部属性,那父类里的子类可以继承使用么? android 可以继承父类的Handler.广播么??

java继承-java关于子类继承的问题

问题描述 java关于子类继承的问题 在java中子类可以继承父类的对象吗 子类都可以继承父类的哪些功能 解决方案 令人费解的java继承问题java笔试问题(继承)java 中 集合类相关问题 解决方案二: 继承父类对象是什么意思?子类继承父类所有的属性和方法. 解决方案三: 子类当然可以继承父类,继承,顾名思义,就是子类拥有父类的所有方法和属性,此外,在子类中还可以定义一些父类中没有的方法,.当子类继承父类后, 可以直接调用父类的方法.不用再去创建,定义.这样,大大增加了代码的重用率,提高了

java继承-关于Java继承的问题,方法的调用

问题描述 关于Java继承的问题,方法的调用 在下面这个程序中, class Person{ private void print(){ System.out.println("Person>void print"); } public void fun(){ this.print(); } }; class Student extends Person{ void print(){ System.out.println(" Student >void print

关于java继承问题,求大神讲解

问题描述 关于java继承问题,求大神讲解 父类引用子类对象,父类变量可以使用子类的普通函数吗?为什么?? 解决方案 不能,因为对父类类型来说它只能访问自己有的方法,而子类类型却可以除了自己定义的方法,还有继承自父类的方法.这跟自然界的继承一样,子类有自己的特性,也有继承来的特性.而父类却只有自己的特性,不会有子类的特征. 解决方案二: 不可以的,子类继承父类后只能使用父类权限为public的方法或成员变量.父类不能调用子类的成员变量和方法.当子类继承父类后, 便继承了父类的某些特性,但父类却无

java继承 在子类中声明同名变量的问题???

问题描述 java继承 在子类中声明同名变量的问题??? 如下代码: class Person { String name; int age; public void introduce(){ System.out.println("姓名是" + name + ",年龄是" + age); } } public class Students extends Person{ // String name; public static void main(String[

java 继承-一个java继承中碰到的菜鸟问题

问题描述 一个java继承中碰到的菜鸟问题 public class Parent { public String a; public String b; public Parent getA(){ System.out.println("PPPPPPPPP"); return this; } public void Test(){ System.out.println(getA().a); System.out.println(getA().b); } } public class

请问 java 继承的作用和意义是什么? 如果不用继承实现这个程序的话是否可以呢?

问题描述 请问 java 继承的作用和意义是什么? 如果不用继承实现这个程序的话是否可以呢? 请问 java 继承的作用和意义是什么? 如果不用继承实现这个程序的话是否可以呢? 解决方案 继承的用处在于,你可以在派生类中通过重写某些方法,实现对现有代码的自定义. 如果没有继承,你想利用现有的代码,你只有两个办法: - 直接在原有的代码上修改,那么你不知道你的修改会不会对使用这个类的别的代码造成什么影响 - 把原有代码拷贝一份,并且修改,这样原来的代码的作者想修正一个bug,你的代码没办法被更新,

java继承中的构造方法实例解析_java

本文实例讲述了java继承中的构造方法.分享给大家供大家参考.具体如下: 继承中的构造方法: 1.子类的构造过程中必须调用其基类的构造方法. 2.子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法.   2.1.使用this(argument_list)调用本类的另外构造方法.   2.2.如果调用super,必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造方法. 4.如果子类构造方法中既没

java继承多态-java继承问题,菜鸟求助

问题描述 java继承问题,菜鸟求助 1.定义一个类,包含两个以上的私有成员,两个以上的方法以及一个构造函数 从该超类继承得到至少三个子类,这三个子类分别要在超类的基础上增加至少一个成员,至少一个方法以及同时重写超类中的同一个方法. 3.编写程序,用子类的对象去访问超类的方法和自己的方法 编写一个方法,用超类作为形式参数. 分别用三个子类对象作为实际参数调用该方法,并在方法中实现多态. 要求满足上面的条件,求大神附上代码,谢谢 解决方案 菜鸟不可怕,可怕的是不学的菜鸟.少年,java语法都学会了

java继承中的super调用

问题描述 java继承中的super调用 最近看到了下面一段代码,都是覆盖父类的方法,为什么onCreate方法就需要调用super.onCreate(..),而onActivityResult(..)方法就不需要调用super.onActivityResult(..)呢?求哪位解释一下 thanks! public class MainActivity extends Activity { ....... @Override protected void onCreate(Bundle sav