day09java基础学习笔记

     2022-03-15     413

关键词:

抽象 abstract

抽象类和抽象方法必须用abstract关键字修饰
  • 抽象类格式

    abstract class 类名{}
    
  • 抽象方法定义,在返回值钱,或修饰符前加上abstract关键字
  • 方法没有方法体,即:没有{}

    abstract public void eat();
    public abstract void eat();
    
  • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

  • 抽象类完全可以有成员变量和非抽象成员方法

抽象类的子类--使用extends

  • 要么是抽象类,不完全实现其父类的抽象方法
  • 要么重写抽象类中的所有抽象方法,这个子类就是一个完全的实现类了,所以可以用来实例化对象。

抽象类、方法定义时的非法组合

  • private abstract抽象方法依靠子类去实现,但是私有方法在类外就不能访问,也就无法实现
  • final abstractfinal修饰的方法不能被重写,而抽象方法就是需要子类实现,矛盾
  • static abstract抽象方法在本类中是没有方法体的,使用类名调用的时候调用的是没有方法体的方法,无作用

抽象类成员的特点

  1. 成员变量:既可以是变量,也可以是常量
  2. 构造方法:有,用于子类访问抽象类数据的初始化
  3. 成员方法:既可以是抽象的也可是非抽象的
抽象类成员方法的特性
  • 抽象方法 强制要求子类做的事情
  • 非抽象方法 子类继承的事情,提高代码的复用性

抽象类练习

案例:动物-->猫狗

    具体事物:猫,狗
    共性:姓名,年龄,吃
    有共性,所以可以提取出父类,但是由于子类对方法“吃”有不同的实现,所以,将方法“吃”定义为一个抽象方法,所以这个父类也就成了抽象类,这个父类的实现类都需要实现自己的特有的“吃”方法,才是一个可以被实例化的类,否则还是一个抽象类。

    ////定义抽象的动物类
    public abstract class AnimalDemo {
        //私有成员变量
        private String name;   
        private int age;
        public abstract void eat(); //抽象方法
        //公有的get/set方法
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name=name;
        }
        public int getAge(){
            return age;
        }
        public void setAge(int age){
            this.age=age;
        }
        //空参构造方法
        public AnimalDemo(){}
        //有参构造方法
        public AnimalDemo(String name,int age){
            this.age=age;
            this.name=name;
        }
    }
    //继承父类    并实现父类抽象方法
    public  class DogDemo extends AnimalDemo {
        //空参构造方法
        public DogDemo(){}
        //两个参数的构造方法
        public DogDemo(String name,int age){
            //调用父类有参构造方法,并传参
            super(name,age);
        }
        //重写父类抽象方法
        public void eat(){
            System.out.println("Dog eat");
        }

    }
    //继承父类    并实现父类抽象方法
    public class CatDemo extends AnimalDemo {
        public CatDemo(){}
        public CatDemo(String name, int age){
            super(name,age);
        }
        public void eat(){
            System.out.println("cat eat");
        }
    }
    测试类
    public class DemoTest {
        public static void main(String[] args) {
            AnimalDemo ad = new DogDemo("tom",2);//采用多态  父类引用指向子类对象
            ad.eat();
            System.out.println("name:"+ad.getName()+" "+"age:"+ad.getAge());
            AnimalDemo aadd = new CatDemo("jack",3);
            aadd.eat();
            System.out.println("name:"+aadd.getName()+" "+"age:"+aadd.getAge());
        }
    }

接口interface的引入

抽象类是从多个类中抽出来的模板,如果将这种抽象进行的更彻底,则可以提炼出来一种更加特殊的“抽象类”--接口,接口里不能包含普通的方法接口里的所有方法都是抽象方法,其中的成员变量全部是常量。

接口特点

  • 接口用关键字interface表示

    格式:interface 接口名 {} //不能使用class关键字
    类实现结构用 implements关键字
    
  • 格式:class 类名 implements 接口名{}

    接口没有构造方法,即:接口不能实例化
    
  • 按照多态的方式,有具体的子类实例化,其实这也是多态的一种,接口多态

接口的子类

  • 可以是抽象类,用implements关键字
  • 或者还是一个接口 ,用extends关键字
  • 是一个实现类,实现接口中所有抽象方法,用implements关键字

小结

只有接口和接口之间使用的是extends关键字,抽象类和接口之间,实现类和接口之间都是用的implements关键字。

接口成员的特点

  • 成员变量

  • 只能是常量

  • 默认的修饰符public , static ,final ,其中任何一个都可以省略,也可以全省略

  • 构造方法

没有,因为接口主要是扩展功能的,而没有具体存在

  • 成员方法
  • 只能是抽象方法
  • 默认的修饰符 public, abstract,可以省略其一也可以全部省略

类与类,类与接口,接口与接口的关系

  • 普通类与普通类--extends

    继承关系只能单继承,但是可以多层继承

  • 普通类和抽象类--extends

    继承关系,只能单继承,但是可以多层继承

  • 普通类与接口,抽象类与接口--implements

    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时是想多个接口,此时应该注意extends要写在前,implements写在后

  • 接口与接口--extends

    继承关系,可以单继承,也可以多继承

抽象类和接口的区别

定义时用的关键字

  • 抽象类 abstract
  • 接口 interface

成员区别

  • 抽象类:变量常量都可以有;抽象方法,非抽象方法都可以有;也可以有构造方法
  • 接口:只有常量;只有抽象方法;没有构造方法

关系区别

  • 类与类 :集成,单继承,多层继承
  • 普通类与接口:实现单实现或多实现implements
  • 抽象类和接口:实现,单实现,多实现abstract class a implements IA,IB
  • 普通类和抽象类:继承,并实现全部抽象方法extends
  • 接口与接口:继承 ,单继承,多继承extends
在接口的各种关系中,只有接口与接口是继承关系,其余的和接口之间全部都是实现关系

接口练习

    /*
        猫狗案例,加入跳高的额外功能
        分析:从具体到抽象
            猫:
                姓名,年龄
                吃饭,睡觉
            狗:
                姓名,年龄
                吃饭,睡觉
            由于有共性功能,所以,我们抽取出一个父类:
            动物:
                姓名,年龄
                吃饭();
                睡觉(){}
            猫:继承自动物
            狗:继承自动物
            跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口
            接口:跳高
            部分猫:实现跳高
            部分狗:实现跳高
        实现;
            从抽象到具体
        使用:
            使用具体类
    */
    //定义跳高接口
    public interface Jump {
        public abstract void jump();
    }
    public class Dog extends Animal {
        public void eat(){
            System.out.println("狗啃骨头");
        }
        public Dog(){}
        public Dog(String name,int age){
            super(name,age);
        }

    }

    public class Cat extends Animal {
        public void eat(){
            System.out.println("猫捉老鼠");
        }
        public Cat(){}
        public Cat(String name,int age){
            super(name,age);
        }
    }

    public class JumpDog extends Dog implements Jump{
        public JumpDog(){}
        public JumpDog(String name,int age){
            super(name,age);
        }
        public void jump(){
            System.out.println("狗可以跳");
        }
    }

    public class JumpCat extends Cat implements Jump {
        public JumpCat(){}
        public JumpCat(String name,int age){
            super(name,age);
        }
        public void jump(){
            System.out.println("猫可以跳了");
        }
    }
    //测试类
    public class JumpTest {
        public static void main(String[] args) {
            Animal a =  new Cat("tom",2);
            System.out.println("name:"+a.getName()+" "+"age:"+a.getAge());
            a.eat();
            a.sleep();
            System.out.println("----------------");
            JumpCat jc = new JumpCat("加菲",2);
            System.out.println("name:"+jc.getName()+" "+"age:"+jc.getAge());
            jc.eat();
            jc.jump();
            jc.sleep();
            System.out.println("----------------");
            System.out.println("name:"+a.getName()+" "+"age:"+a.getAge());
            a= new Dog("jerry",2);
            a.eat();
            a.sleep();
            System.out.println("----------------");
            JumpDog jg = new JumpDog("机械狗",2);
            System.out.println("name:"+jg.getName()+" "+"age:"+jg.getAge());
            jg.eat();
            jg.jump();
            jg.sleep();
        }

    }

day12java基础学习笔记

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

day02java基础学习笔记

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

day11java基础学习笔记

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

day08java基础学习笔记

继承extends(也叫扩展)多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。通过extends关键字可以实现类的继承class子类名extends父类名{}继承的案... 查看详情

java学习笔记day09

break和continue的区别:break是结束本层循环或用于switch语句中,结束当前case;continue结束这一次循环for(inti=0;i<9;i++){System.out.println(i+"---------"); break;}第一次循环就结束了;for(inti=0;i<9;i++){if(i=5){ continue; } System.out.pri 查看详情

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 查看详情

毕向东java视频学习笔记day09继承+接口+抽象类

Java_Day09继承+接口+抽象类构造函数子父类中的构造函数特点。在子类构造对象时,发现访问子类构造函数时,父类也运行了。为什么呢?因为:在子类的构造函数中第一行有一个默认的隐式语句super()子类的实例化过程:子... 查看详情

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

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

从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循环... 查看详情

python100天学习笔记day16python基础重要知识点(代码片段)

Python语言进阶重要知识点生成式(推导式)的用法prices='AAPL':191.88,'GOOG':1186.96,'IBM':149.24,'ORCL':48.44,'ACN':166.89,'FB':208.09,'SYMC':21.29#用股票价格大于100元的股票构造一个新的字典pric... 查看详情

python100天学习笔记day16python基础重要知识点(代码片段)

Python语言进阶重要知识点生成式(推导式)的用法prices='AAPL':191.88,'GOOG':1186.96,'IBM':149.24,'ORCL':48.44,'ACN':166.89,'FB':208.09,'SYMC':21.29#用股票价格大于100元的股票构造一个新的字典pric... 查看详情

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

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

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

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