day08java基础学习笔记

     2022-03-15     681

关键词:

继承extends(也叫扩展)

多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

通过extends关键字可以实现类的继承
    class 子类名 extends 父类名{}

继承的案例

创建一个Person类,定义两个功能吃饭、睡觉,再创建学生类、教师类,继承Person类,再定义两个自己独有的功能
创建Persen类
public class Person {
    public void eat(){
        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}
//创建子类学生类继承Person类
public class Student extends Person {
    public void play(){
        System.out.println("打游戏");
    }
}
//创建Teacher类继承Person类
public class Teacher extends Person {
    public void teach(){
        System.out.println("教书");
    }
}
//创建测试类,对继承进行测试
public class PersonExtends {
    public static void main(String[] args) {
        Student st = new Student();
        st.eat();   //用学生类调用继承方法
        st.play();  //调用自己的方法
        Teacher t =new Teacher();
        t.sleep();
        t.teach();
    }
}

继承的好处

  • 提高了代码的复用性:多个类的相同成员可以放到一个类中

  • 提高了代码的维护性:如果功能的代码需要修改,修改一处即可,继承的类中自动都被修改了

  • 让类与类之间产生了关系,是多态的前提

Java中继承的特点

Java只支持单继承,不支持多继承

即一个类只能有一个直接父类,不可以有多个直接父类

    正确写法:class Sub extends Demo{}
    错误写法:class Sub extends Demo1,Demo2{}
Java支持多层继承
    class A{}
    class B extends A{}
    class C extends B{}
    例
    //
    public class Grandfather {
        public void show(){
            System.out.println("grandfather");
        }
    }
    public class Father extends Grandfather {
        public void method(){
            System.out.println("father");
        }
    }
    public class Son extends Father {
        public void function(){
            System.out.println("son");
        }
    }
    //测试类
    public class GrandfatherTest {
        public static void main(String[] args) {
            Son s = new Son();
            s.function();
            s.method();
            s.show();
        }
    }

Java中继承的注意事项

  1. 子类只能继承父类中所有非私有的成员(成员变量、成员方法)
  2. 子类不能父类的的构造方法,但可以同super关键字去访问父类构造方法
  3. 不要为了部分功能去继承,如果有两个类A,B,只有他们符合A是B的一种或者B是A的一种,就可以考虑使用继承

继承中成员变量的关系

案列演示:
//创建父类定义成员变量
public class Field {
    int num = 10;
    public void method(){
        System.out.println(num);
    }
}
//创建子类继承父类,并定义与父类同名成员变量
public class FieldExtends extends Field {
    int num = 15;
    public void show(){
        System.out.println(num);
    }
    //在子类中定义新的方法,在方法内再定义与父类成员变量同名变量
    public void function(){  
        int num = 5;
        System.out.println(num);
    }
}
//测试类
public class FieldTest {
    public static void main(String[] args) {
        FieldExtends fe = new FieldExtends();
        fe.show();  // 15
        fe.function();   // 5
        fe.method();   //10
    }
}
通过案列可以知道在子类中访问一个变量的顺序
  1. 在子类方法的局部范围找,有就使用
  2. 在子类的成员范围找,有就使用
  3. 在父类成员范围找有就使用
  4. 如果找不到,就报错

super关键字

用法与this关键字类似

  • this 代表对本类对象的引用
  • super 代表父类存储空间的标识(可以理解为对父类对象的引用)

用法

  • 访问成员变量

    this.成员变量
    super.成员变量(访问父类的成员变量,不能访问父类的private变量)
    访问静态成员时,也可以用  父类名.静态成员
    
  • 访问构造方法

    this(...)  super(...)
    
  • 访问成员方法

    this.成员方法()  super.成员方法()
    
案列演示
    //创建父类
    public class FatherSuper {
        int num = 10;
        public FatherSuper(){
            System.out.println("父类构造方法");
        }
        public void show(){
            System.out.println("父类成员方法");
        }
    }
    public class SonSuper extends FatherSuper {
        int num = 15 ;
        public SonSuper(){
            System.out.println("子类构造方法");
        }
        public void method(){
            System.out.println("子类成员方法");
        }
        public void function(){
            int num = 5;                    
            System.out.println(num);        //打印方法内局部变量
            System.out.println(super.num);  //打印父类成员变量
            System.out.println(this.num);   //打印本类成员变量
            super.show();                   //调用父类成员方法
            this.method();                  //调用本类成员方法

        }
    }
    测试类
    public class SuperTest {
        public static void main(String[] args) {
            SonSuper ss = new SonSuper();
            ss.function();
        }
    }

继承中构造方法的关系

  1. 子类中所有的构造方法默认都会访问父类中空参数的构造方法,除非显示使用super/this调用了父类或者本类的其他构造方法。
  2. 在类中对本类或者父类构造方法的调用,只能在构造方法中,不能在实例方法总中调用构造方法(更不能在类方法中调用构造方法)
注意构造方法不能递归调用
    class A {
        public A(int i){
            this(1 ,2);
        }
        public A(int a ,int b){
            this(2);
        }
    }

案例演示

    //创建父类
    public class A {
        public A(){
            System.out.println("父类空参构造");
        }
        public A(String name){
            System.out.println("父类有参构造");
        }
    }
    //创建子类继承父类  
    public class B extends A {
        public B(){           //这一步默认执行了  super();调用了父类空参
            System.out.println("子类空参构造");
        }
        public B(String name){
            super(name);  //调用父类有参构造方法
            System.out.println("子类有参构造");
        }
    }
    测试类
    public class C {
        public static void main(String[] args) {
            B b = new B();
            B b1 = new B("tom");
        } 
    }   
如果父类没有空参构造,子类的构造方法中就必须显式调用父类带参构造super(...);
super(…)或者this(…)必须出现在构造方法第一条语句上否则,就会有父类数据的多次初始化

方法重写

子类中出现和父类中一摸一样的方法声明,称为方法覆盖(Override)或重写(OverWrite)

使用特点

  • 如果方法名不同就调用对应的方法
  • 如果方法名相同最终使用的是自己的(使用子类的引用的时候,在多态情况下,使用父类的引用,则有可能调用的是父类静态方法)

方法重写的应用

  • 当子类需要父类功能时,而功能主体子类有自己的特有的内容时,可以重写父类的方法,这样即沿袭了父类的功能,又定义了特有的内容。
  • 方法重写是多态实现的条件

    //首先创建 一个手机父类
    public class PhoneF {
        public void call(String name){   //定义一个方法
            System.out.println("给"+name+"打电话");
        }
    }
    //在创建一个手机子类继承父类
    public class PhoneS extends PhoneF {
        public void call(String name){   //同名同修饰词   对父类中的方法进行重写
            super.call(name);
            System.out.println("听天气预报");  //在继承父类之后在身再加的打印语句
        }
    }
    //创建测试类
    public class PhoneTest {
        public static void main(String[] args) {
            PhoneS ps = new PhoneS();
            ps.call("Tom");
        }
    }
    

方法重写的注意事项

  • 父类中私有的方法不能被重写,编译报错;
  • 子类重写父类方法时,访问权限不能更低,编译报错;
  • 子类重写父类方法时,返回值类型可以相同,也可以是父类返回值的子类型;
  • 父类的实例方法(非静态方法),子类不能重新定义为静态方法
  • 子类中的重写父类方法,按照重写的原则(访问权限不能变小,返回值类型同类或者为子类,方法名相同,形参列表相同);
  • 子类想重写父类的方法,最好是让方法的签名一模一样;

final关键字

final关键字是最终的意思,可以修饰类,成员变量,成员方法 - 修饰类,类不能被继承(不能放在extends后面) - 修饰变量,变量将变成常量只能被赋值一次,不论是在子类还是本类中,都不能被修改(常量一般是大写字母表示 final int ONE = 1) - 修饰方法,方法不能被重写(子类只用使用权,没有修改权)

final修饰局部变量
  • 在方法内部,该变量不可以被改变
  • 在方法声明上,基本类型是这个参数的值不能被改变,引用类型,是这个参数只想的地址值不能被改变

总结

类中非static的final变量(实例final变量)可以在生命的时候赋值,如果声明的时候没有赋值的话,就必须在以下两个地方赋值,一个是构造代码块一个是构造方法中,如果这两个地方没有赋值,编译报错。

如果是static修饰的final变量的话,则只能在两个地方赋值,声明的时候,或者在静态代码块中。

多态(polymorphism)

某一个事物,在不同时刻表现出来的不同状态

在Java中,对一个事物的引用可以分成两种类型,一种是编译时的类型,一种是运行时的类型。 编译时的类型指的是声明这个变量时指定的类型;运行时类型指的是实际赋给这个变量的对象的类型。

    若Student类继承自Person类,则下面的写法是正确的
    Person p = new Student();
注意

父类引用不能调用子类特有的方法,因为使用了父类的引用,就代表站在父类角度来看待当前子类对象,只能看到从父类继承而来的特性,或者是子类重写的父类的方法。成员变量没有多态性,只能看到父类的成员变量。

多态中的成员访问特点

  • 成员变量 编译看左边,运行看右边;
  • 构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
  • 成员方法 便宜看左边,运行看右边
  • 静态方法 编译看左边,运行看右边

多态的前提条件

  • 有继承关系
  • 有方法重写
  • 有父类引用指向子类对象

多态中成员访问特点

成员变量和静态方法没有多态性 只有被子类重写的成员方法才有多态性

day09java基础学习笔记

抽象abstract抽象类和抽象方法必须用abstract关键字修饰抽象类格式abstractclass类名{}抽象方法定义,在返回值钱,或修饰符前加上abstract关键字方法没有方法体,即:没有{}abstractpublicvoideat();publicabstractvoideat();抽象类不一定有抽象方... 查看详情

day12java基础学习笔记

集合/集合框架(List)数组和集合的区别数组长度固定的,一旦定义,就无法改变集合长度可变数组中可以粗出基本数据类型,也可以是对象(实际上是对象的引用集合只能存储对象的引用)Java集合体系:分为Collection和Map两种... 查看详情

day02java基础学习笔记

一、数据类型1.java中默认的整数类型就是int型;但一个数值很小在byte、short的取值范围内时,可以通过赋值来改变数据类型,比如:byte=12;short=15;如果数值过大超过了int的取值范围,java不会把它默认成long类型,需要在数据后... 查看详情

day11java基础学习笔记

冒泡排序相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处,第二次比较厚,最大值放在了倒数第二的位置,一直到第二个元素确定了,整个数组的顺序也就确定了publicclassArrayDemo{publicstaticvoidmain(String[]a... 查看详情

day03java基础学习笔记

三元运算符1.格式:(条件表达式)?表达式1:表达式2;2.运算规则:先对条件表达式求值,得出一个逻辑值,如果至为true,则执行表达式1;如果值为false,则执行表达式2。443.典型用法:Stringstr=(5<3)?"5大于3":"5大于3";... 查看详情

零基础入门学习java课堂笔记——day04

Java数组1.数组概述定义:数组是相同类型的有序集合,同一组同一类型的数据可以按照先后次序排列组合在一起,其中一个数据可以称为元素,每个数组元素可以通过一个下表访问它们2.数组声明创建dataType[]arrayRefVar;//firstdataType... 查看详情

day06java基础学习笔记

面向对象当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始改进,能不能把这些步骤和功能再进行封装,封装时根据不同... 查看详情

day02java基础学习笔记

自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型1.各种进制的表现形式和特点二进制,八进制,十进制,十六进制二进... 查看详情

java学习笔记day_01

...以我按照传智播客的视频和Java核心思想来学习,前面的基础部分主要是用于个人的复习使用的。第一段代码:HelloWorldpublicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.prin 查看详情

python全栈100天学习笔记day32linux概述及基础命令(代码片段)

Linux概述Linux是一个通用操作系统。一个操作系统要负责任务调度、内存分配、处理外围设备I/O等操作。操作系统通常由内核(运行其他程序,管理像磁盘、打印机等硬件设备的核心程序)和系统程序(设备驱动、... 查看详情

java零基础小白学习教程之day08_接口&多态(代码片段)

day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关系6.【掌握】单继承多实现7.【理解】接口之间的多继承8.【掌握】接... 查看详情

java零基础小白学习教程之day08_接口&多态(代码片段)

day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关系6.【掌握】单继承多实现7.【理解】接口之间的多继承8.【掌握】接... 查看详情

nsatp-a学习笔记之day3-2注入原理(代码片段)

文章目录注入原理-基础实验实验目的实验环境实验内容实验一:字符型注入实验二:联合注入免责声明注入原理-基础实验实验目的1、掌握SQL注入基本原理;2、掌握万能密码的原理和操作;3、掌握手工注入(... 查看详情

从0开始入门python一个半月的三万字学习笔记汇总!!!(代码片段)

python学习DAY01-DAY04基础操作DAY05-DAY09基本模块常用pip源(1)阿里云http://mirrors.aliyun.com/pypi/simple/(2)豆瓣http://pypi.douban.com/simple/(3)清华大学https://pypi.tuna.tsinghua.e 查看详情

python学习笔记day1基础介绍

Alex博客:http://www.cnblogs.com/alex3714/articles/5465198.html一、本节主要内容Python介绍发展史Python2or3?安装HelloWorld程序变量用户输入模块初识.pyc文件数据类型初识数据运算表达式if...else语句表达式for循环breakandcontinue 表达式while循环... 查看详情

22年最新java笔记:day02-java基础注释关键词标识符等(日更)

🍬22年最新Java笔记:Day1-Java基础语法(日更)day02-Java基础语法1.注释​注释是对代码的解释和说明文字。Java中的注释分为三种:单行注释://这是单行注释文字多行注释:/*这是多行注释文字这是多行... 查看详情

python100天学习笔记day8面向对象编程基础(代码片段)

面向对象编程基础活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法。"把一组数据结构和处理它们的方法组成对... 查看详情

python100天学习笔记day8面向对象编程基础(代码片段)

面向对象编程基础活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法。"把一组数据结构和处理它们的方法组成对... 查看详情