文章目录

  • 1、继承
  • 2、方法的覆写
  • 3、方法覆写的限制
  • 4、属性覆盖
  • 5、final关键字


1、继承

在Java之中想要实现继承关系,必须依靠extends关键字来实现:

class 子类 extends 父类 {}

很多情况下会把子类称为派生类,把父类称为超类(SuperClass)。
super():表示的就是子类构造调用父类构造的语句,该语句只允许放在子类构造方法的首行。在默认情况下的实例化处理,子类只会调用父类中的无参构造方法,所以写不写“super()”区别不大,但是如果说你的父类里面没有提供无参构造,这个时候必须利用super()明确调用有参构造。所以在实例化子类对象的同时一定会实例化父类对象,目的是为了所有的属性可以进行空间分配。

继承实现的主要目的是在于子类可以重用父类中的结构,并且也可以实现功能的扩充,同时子类可以定义更多的内容。

  • 1、Java之中不允许多重继承,只允许多层继承;
  • 2、在进行继承关系定义的时候,实际上子类可以继承父类中所有的操作结构。但是对于私有操作属于隐私继承,所有的非私有操作属于显式继承。隐私继承不能直接访问,但是可以通过方法间接访问。
class Person{
	private String name;
	public void setName(String name) {
		this.name = name;
		
	}
	public String getName() {
		return this.name;
	}
}
class Student extends Person{
	public Student(String name) {
		setName(name);//设置name属性内容
	}
	public void fun() {
		//System.out.println(name);//直接访问不可能,因为私有的
		System.out.println(getName());//间接属性
	}
}
public class Hello{
	public static void main(String args[]){
		Student stu = new Student("张三");
		stu.fun();
	}
}

2、方法的覆写

子类与父类一旦产生了继承关系之后,实际上子类会继承父类中的全部定义,但是这里面也有可能出现不合适的场景。如果发现父类中设计不足并且需要保留有父类中的方法或者属性名称的情况下就会发生覆写。

当子类定义了与父类方法名称相同,参数类型及个数完全相同(跟父类方法一模一样)的时候,就称为方法的覆写。

class Channel{
	public void connect() {
		System.out.println("[Channel父类]进行资源的连接。");
	}
}
class DatabaseChannel extends Channel{//要进行数据库连接
	public void connect() {//保留已有的方法名称,而后进行覆写
		System.out.println("[子类]进行数据库资源的连接。");
	}
}
public class Hello{
	public static void main(String args[]) {
		DatabaseChannel channel = new DatabaseChannel();
		channel.connect();
	}
}

由于现在实例化的是子类(DatabaseChannel)对象,所以此时调用的方法一定是被子类所覆写过的方法,如果该方法没有被覆写过,那么将调用父类中提供的方法,覆写的意义是在于:优化父类的功能
在子类进行方法覆写之后如果现在要想继续调用父类中的方法,那么就必须使用super()全场方法。

class Channel{
	public void connect() {
		System.out.println("[Channel父类]进行资源的连接。");
	}
}
class DatabaseChannel extends Channel{//要进行数据库连接
	public void connect() {//保留已有的方法名称,而后进行覆写
		super.connect();
		System.out.println("[子类]进行数据库资源的连接。");
	}
}
public class Hello{
	public static void main(String args[]) {
		DatabaseChannel channel = new DatabaseChannel();
		channel.connect();
	}
}

3、方法覆写的限制

虽然利用方法的覆写可以更好的扩充父类的功能,但是对于覆写也是有其自身要求的:被覆写的方法不能够拥有比父类方法更为严格的访问控制权限。

对于访问控制权限:public > default (不写)> private,private权限是最小的,也就是说如果你此时父类中的方法使用了default权限定义,那么子类定义该方法的时候只能够使用public或default定义,如果父类中的方法使用了public定义,那么子类中的方法只能够使用public定义。

override与overload区别:

overload:重载;方法名称相同,参数的类型及个数不同;没有权限限制;发生在一个类中。
override:覆写;方法名称相同,参数的类型及个数、返回值相同;被覆写的方法没有更严格的控制权限;发生在继承关系类中。

4、属性覆盖

当子类定义了与父类相同名称的成员时候就称为属性覆盖。
案例:

class Channel{
	String info = "www.baidu.com";
}
class DatabaseChannel extends Channel{//要进行数据库连接
	String info = "HelloCSDN"; //名称相同
	public void connect() {
		System.out.println(super.info);
		System.out.println(this.info);
	}
}
public class Hello{
	public static void main(String args[]) {
		DatabaseChannel channel = new DatabaseChannel();
		channel.connect();
	}
}

如果将父类属性封装:

class Channel{
	 private String info = "www.baidu.com";
	 public String getInfo() {
		 return this.info;
	 }
}
class DatabaseChannel extends Channel{//要进行数据库连接
	String info = "HelloCSDN"; //名称相同
	public void connect() {
		System.out.println(super.getInfo());
		System.out.println(this.info);
	}
}
public class Hello{
	public static void main(String args[]) {
		DatabaseChannel channel = new DatabaseChannel();
		channel.connect();
	}
}

super与this的区别?

  • 在程序类中使用this表示先从本类查找所需要的属性或方法,如果本类不存在则查找父类定义,如果使用super则表示不查找子类,直接查找父类;
  • this与super都可以进行构造方法的调用,但是this()调用的是本类构造,而super()是由子类调用父类构造,两个语句必须放在构造方法的首行,所以不能够同时出现;
  • this可以表示当前对象。

5、final关键字

final在程序之中描述的是种终结器的概念,在Java里面使用final关键字可以实现如下的功能:定义不能够被继承的类,定义不能够被覆写的方法、常量。
案例:使用final定义不能被继承类

final class Channel{}//这个类不能够有子类
class DatabaseChannel extends Channel{
}//错误的
public class Hello{
	public static void main(String args[]) {
	}	
}

当子类继承了父类之后实际上是可以进行父类中方法覆写的,但是如果现在不希望某一个方法被子类所覆写就可以使用final来进行定义。
案例:定义不能够被覆写的方法

class Channel{
	 public final void connect() {
		 
	 }
}
class DatabaseChannel extends Channel{
	public void connect() {}//错误的
}

在有一些系统开发之中,可能使用1表示开关打开、使用0表示开关关闭,但是如果说现在要是直接操作0或者是1,则会造成混乱,所以就希望可以通过一些名称来表示0或者是1。在final关键字里面有一个重要的应用技术:可以利用其定义常量,常量的内容一旦定义则不可修改。
案例:使用final定义常量

class Channel{
	private final int ON = 1; //ON就是常量
	private final int OFF = 0;//OFF就是常量
	public final void connect() {
		ON=2;//错误的
	 }
}

实际上常量往往都是公共的定义,所以为了可以体现出共享的概念,往往会使用一种全局常量的形式来定义,使用public static final来定义全局常量。

public static final int ON = 1; //ON就是常量
	public static final int OFF = 0;//OFF就是常量

在定义全局常量的时候每一个字母必须大写表示。
在方法的时候也可以使用final来定义参数,此时也表示一个常量的概念。

public class Hello{
	public static void main(String args[]) {
		final String info = "csdn";
		String strA = "www.csdn.com";
		String strB = "www." + info + ".com";
		System.out.println(strA == strB);
	}	
}