黑马程序员_毕向东_Java基础****学习笔记(十八)
程序员文章站
2022-07-07 23:15:02
...
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!----------------------
package day04;
/*
*将学生和工人的共性内容提取出来,单独进行描述
*只要让学生和工人与单独描述的这个类有关系就可以了
*
* 继承:
* 1.提高代码的复用性
* 2、继承让类之间产生了关系。有了这个关系,才有了多态的特性
*
* 注意:千万不要为了获取其他类的功能简化代码而继承
* 必须是类与类之间有所属关系才可以继承。所属关系 is a。
*
* 在java语言中:java只支持单继承,不支持多继承。
*
* 因为多继承容易带来安全隐患。当多个父类中定义了相同的功能,当功能内容不同时,子类对象不确定运行哪一个
*
* 但是java保留这种机制,并用另一种体现形式来完成表示。多实现。
*
* java支持多层继承。也就是一个继承体系
*
* 如何使用一个继承体系中的功能呢?
*
* 想要使用体系,先查阅体系父类的描述,因为父类中定义的事体系中的共性内容
* 通过了解共性内容,就可以知道该体系的基本功能
* 那么这个体系已经可以基本使用了
*
* 那么在具体使用时,要穿件子类的对象,为什么呢?
* 一是因为有可能父类不能创建对象
* 二是创建子类对象可以使用更多的功能,包括基本的,也包括特有的。
*
*
* 简单一句话:查阅父类功能,创建子类对象使用功能。
*
*
*
* 聚集:has a
*
* 聚合:
*
* 组合:按照事物间联系的紧密程度划分的,就比如说手是人身体的一部分
*
*
*
*/
class Person{
String name;
int age;
}
class Student extends Person{
// String name;
// int age;
void study(){
System.out.println("good study");
}
}
class Worker extends Person{
// String name;
// int age;
void work(){
System.out.println("good work");
}
}
public class ExtendsDemo {
public static void main(String [] args){
}
}
package day04;
/*
* 子父类出现后,类成员的特点
* 类中成员:
* 1、变量
* 2、函数
* 3、构造函数
*
* 1、变量:
* 如果子类中出现非私有的同名变量时
* 子类要访问本类中的变量,用this
* 子类要访问父类中的同名变量,用super
*
* super的使用和this几乎一致
* this代表的事本类对象的引用
* super代表的是父类对象的引用
*
* 2、子父类中的方法:
*
* 当子类出现和父类一模一样的函数时
* 但子类对象调用该函数,会运行子类的函数的内容
* 这种情况是函数的另一个特性:重写(覆盖)
*
*
* 当子类继承了父类,沿袭了父类的功能到子类中
* 但是子类虽具备该功能,但是功能却和父类不一致
* 这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。
* 这种方式有利于功能扩展。
*
*
* 覆盖:
* 1、子类覆盖父类,必须要保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
*
* 2、静态只能覆盖静态
*
* 3、记住:
* 重载:只看同名函数的参数列表
* 重写:子父类方法一模一样。
*
* 3、构造函数:
* 在对子类对象进行初始化时,父类的构造函数也会运行
* 那是因为子类的构造函数默认第一行有一句隐士语句 super();
* super():会访问父类中空参数的构造函数,而且再累中所有的构造函数默认第一行都是super()
*
* 为什么子类一定要访问父类中的构造函数?
* 因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的
* 所以子类在访问对象初始化时,要先访问以下父类中的构造函数
* 如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定
*
* 注意:super语句一定定义在子类构造函数的第一行
*
* 子类的实例化过程;
* 结论:
* 子类中所有的构造函数,默认都会访问父类中空参数的构造函数
*
* 因为子类每一个构造函数的第一行都有默认的super();
*
* 当父类中没有空参数的构造函数时,在子类中要手动通过super(...)语句的形式指定要访问父类中的构造函数
*
* 当然:子类的构造函数第一行也可以东东指定this语句来访问本类中的构造函数。
* 子类中至少会有一个构造函数会访问父类中的构造函数。
*/
class Person11{
static String name;
Person11(String name){
this.name=name;
}
void show(){
System.out.println("show()........");
}
}
class Student1 extends Person11{
Student1(){
super(name);
}
void method(){
super.show();
}
}
class Tel{
void show(){
System.out.println("show number......");
}
}
class NewTel extends Tel{
//子类复写父类的方法,用于功能的扩展
void show(){
//System.out.println("show number");
super.show();
System.out.println("show name");
System.out.println("show pic");
}
}
class Fu{
int num=4;
Fu(){
System.out.println("父类的构造函数");
}
Fu(int x){
System.out.println("父类的有参构造函数"+x);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
void show(){
System.out.println("父类中和子类相同的方法");
}
void speak(){
System.out.println("fu speak");
}
}
class Zi extends Fu{
int num=5;
//super(); // 子类中有这么一条语句
Zi(){
System.out.println("子类的构造函数");
}
Zi(int x){
//super();
super(10);
System.out.println("zi......"+x);
}
void show(){
System.out.println(this.num);
System.out.println(super.num);
}
void speak(){
System.out.println("zi speak");
}
}
public class ExtendsDemo2 {
public static void main(String [] args){
Zi z=new Zi(4);
//System.out.println(z.num);
//z.show();
//z.speak();
}
}
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!----------------------