java语言入门 (三)继承与多态 (2)

1.0 继承

1.1 继承的代码实现

	继承就是子类继承父类,并且拥有父类的非私有的公共属性或者方法 


package a;
//下面这个是父类
public class Hello {
		public  static int a = 5;
		public Hello(int a){
			this.a =a;
		}
		
		public String toString(){
			return this.a+" = a";
		}

		public static void main(String[] args) {
			Hello hello = new Hello(10);
		
			System.out.println(hello.toString());
		}
}


//下面这个是子类
public class ExtendsHello extends Hello {

	public ExtendsHello(int a) {
		super(a);
		
	}
	
	public static void main(String[] args) {
		ExtendsHello extendsHello  = new ExtendsHello(110);
		System.out.println(extendsHello.toString());
	}

}

结果:

110 = a

上面类 ExtendsHello通过extends关键字继承了类 Hello 成为了他的子类。
就可以调用上述类的非private方法

super表示当前对象的直接父类对象引用,除了可以调用父类的构造方法外,还可以调用父类的属性和方法

这里注意因为父类有带参数的构造函数,所以子类必修也要有带参的构造函数,


1.2 构造方法在类继承中的作用

构造方法不能被继承,由于子类需要初始化父类成员,一次子类除了调用子类的构造函数外,还需要构造父类的构造函数

  1. 子类可以在自己的构造方法中使用super关键字调用父类的构造方法,并且super必须是子类构造方法的第一个执行语句
  2. 如果不用super 指定,则系统会自动调用父类的无参构造方法,然后才是子类的构造方法

由此我们可以强烈建议在一个类如果有带参的构造函数,我们最好加上一个无参的构造函数

2.0 多态

1.0 方法的重载,也叫参数多态
如下图
java语言入门 (三)继承与多态 (2)_第1张图片

也就是说 方法名相同,参数的类型 个数 等的不同,系统会自动调用相应的方法

方法匹配的原则是 先精确匹配 也就是找实参和形参的类型完全一样的去匹配,如果没有,那么就按自动类型转换匹配去匹配

例如上面的函数增加

public void test(Object a ){
		System.out.println("test 1 int a *********test 1 ");
	}
//主函数增加
hell.test(1.1);

这时候因为text没有double类型的参数 也就是public void test(double a ) 但是double 可以转换为Object 所以就会匹配上面新增的这个方法

2.0 方法的覆盖也叫继承多态

就是子类重写了父类方法 但是不能改父类方法的名字,参数个数啥的,必须完全一样,改的就是方法体

例如改变上面的ExtendsHello 方法

package a;

public class ExtendsHello extends Hello {

	public ExtendsHello(int a) {
		super(a);
		
	}
	//重写父类的方法
	public String toString(){
		return this.a+" = a  这是子类重写父类的方法";
	}

	
	public static void main(String[] args) {
		ExtendsHello extendsHello  = new ExtendsHello(110);
		System.out.println(extendsHello.toString());
	}

}

这时候用子类的对象调用toString() 方法就是子类重写的了 不会调用父类的这个方法 这就是方法的覆盖

子类对象的引用 可以调用父类的可继承方法,但是父类的对象不能调用子类的方法
这个很好理解 因为父类会被多个子类去实现 每个实现的方法都不一样 所以最终是父类的对象引用不知道具体该实例化哪个子类对象 也就无法调用子类的方法了

如果子类定义了和父类相同的属性,则子类在调用这个属性的时候,会优先调用自己累中的属性 这叫就近优先原则

子类对可以赋值给父类的引用变量

Hello  h = new ExtendsHello ();

这是后 h如果调用子类和父类的同名属性值,则会调用父类的属性,如果调用方法,则会调用子类的同名方法

原因是执行方法是有这个对象类型决定的,访问属性是由这个引用变量的类型决定的。静态成员的访问时也是基于引用类型的。


3.0 几个特殊类

1.0 Object 类所有的类都集成这个类,都直接或者间接继承他,你不写extends 关键字,系统帮你继承他,你写了 你的父类也是继承他

这个类的几个方法

equal(Object a) 这个方法比较两个对象的值是否相等 == 这个只要两个引用指向的是同一个对象 就返回true

getClass() 判断这个对象属于哪一类

一个对象如果没有任何引用执行他,则jvm会回收他

2.0 Class 类 用于反射机制 不想讲 自己搜吧 查查api之类的

4.0 final修饰符

4.1 final 修饰类

这个类不允许被继承

4.2 final 修饰方法

这个方法不允许被子类修改,所有final类,里面的方法都是final的  

4.3 final 修饰变量

那么这个变量就会变成常量了,只允许被赋值一次。再也不允许被更改
final int asada = 100000000;

//这样所有出现asada 的地方都会被替换成100000000

欢迎留言 评论 我会第一时间回复

你可能感兴趣的:(final,继承,多态)