宅家自学·day4

107 阅读15分钟

一、学习内容

1.面向对象

 1.1 什么是对象
     万物皆对象,客观存在的事物都是对象,大到名胜古迹,小到剪刀、钟表、信封等
 1.2 什么是类
    类是对现实生活中一类具有**共同属性**和**行为**的事物的抽象
    类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
    简单理解:类就是对现实事物的一种描述
  
    手机---=>抽象的概念 分类  类的概念 抽象
    手机 品牌名称 品牌价格 品牌规格
    
    类的特点:
        1.类是对象的数据类型;
        2.类是具有相同属性和行为的一组对象的集合;

image.png

1.3
    什么是对象行为
    ->行为 对象能够执行的操作(打电话,吃饭,这都是操作)
    
1.4
   类和对象的关系
   类:类是对现实生活中一类具有共同属性和行为的事物的抽象
    对象:是能够看得到摸的着的真实存在的实体
    简单理解:类是对事物的一种描述,对象则为具体存在的事物
    类是对象的抽象,对象是类的实体。
    手机类{----抽象的概念   小米手机 华为手机 oppo手机等。
      属性:品牌的名称
      属性:品牌的价格
      属性:品牌的规格
      行为:拨打电话
      行为:发送短信
1.5
    类的定义
     1.类的重要性:类是java程序的基本组成单位
    类是什么:是对现实生活中一类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为
    2.类的组成:(属性和行为)
    属性 在类中通过成员变量来体现(类中方法外的变量)
    行为 在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)

1.6  
    类的定义步骤:
     1.定义类---手机 小米 华为 等
       2.定义成员变量 手机属于什么品牌、价格... 参数
        3.定义成员方法 手机发送短信、手机拨打电话 行为
1.7
    1.创建对象
    格式:类名 对象名 = new 类名();
    范例:Phone phone1 =new Phone();
    
    2.使用对象
    #2.1使用成员变量
    格式: 对象名称.变量
    范例:    phone1 .brand="xiaomi";
    
    #2.2使用成员方法 
    格式: 对象名称.方法名
    范例:phone1.call();

    **学生 ----类  抽象的概念**
    **名称 年龄---- 类中 成员属性**

image.png

1.8
    this关键字
this修饰的变量用于指代成员变量
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

什么时候用this? 解决局部变量隐藏成员变量
this:代表所在的类对象的引用 
方法被哪个对象调用,this就代表哪个对象

    this.使用细节
    1.this关键字可以用来访问本类的属性、方法、构造器
    2.this用于区分当前类的属性和局部变量
    3.访问成员方法的语法:this.方法名(参数列表)
    3.访问构造器语法:this(参数列表);注意只能在构造器使用(即只能在构造器中访问另外一个构造器) 
    必须放在第一条语句
    4.this不能在类定义的外部使用,只能在类定义的方法中使用

1.9
    什么是封装
    面向对象的三个基本特征(oop)之一:(封装、继承、多态 )
    封装,也就是把客观事物封装成抽象的类,
    并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    封装的规则:
    1.将类的某些信息隐藏在类的内部,不允许外部的程序直接访问;
    2.通过该类提供的方法来实现对隐藏信息的操作和访问;

    封装的实现:
    1.修改属性私有(设为private)
    2.创建getter/setter方法(设为public用于属性的读写)
    3.在getter/setter方法中加入属性控制语句(对属性的合法性进行判断)
    
2.0
    什么是继承
    继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义、追加属性和方法

    继承的格式:
    public class 子类名 extends 父类名{}

    父类:也被称为基类、超类
    子类:也被称为派生类
    范例:public  class Student extends Parent{

    }

image.png

2.1
    继承的优点
    1.好处:
    提高了代码的复用性(多个类相同的成员属性和方法可以放到一个类当中)
    提高了代码的维护性(如果方法的代码需要修改,只需修改一处即可)
    2.弊端:
    继承让类与类之间产生了关系,类的耦合性也增加了,当父类发生变化时候,子类也不得不跟着变化,
    削弱了子类的独立性。

    什么是使用继承?
        假设法:我有两个类AB,如果满足AB的一种,或者BA的一种,就说明他们存在继承关系,
        这个时候就可以考虑使用继承,否则不能滥用继承。
        苹果和水果/ 猫和动物  狗和狮子   

image.png

2.2
    继承中构造方法的访问特点
    1.子类中所有的构造方法默认都会访问父类中的无参的构造方法
    2.因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,需要对父类进行初始化。
    3.每个子类构造方法的第一句默认都是:super()

    如果父类中没有无参构造方法,只有带参构造方法,怎么办?
    1.通过super关键字显示调用父类的有参构造方法
    2.父类中自己单独定义一个无参构造方法
2.3
    方法的重写概述:
    子类中出现了和父类一模一样的方法
    当子类需要父类的功能,而功能主体中,子类有自己独特的内容,就可以通过重写父类中的方法,
    这样即延续了父类的功能,又定义了自己的特有内容

    @Override
    是一个注解(注解后面会学习到)
    可以帮我们检查重写方法声明的正确性
    ----------------------
    因为父类的方法不能完全实现想要的功能,它只能实现部分我们需要的功能,
    所以重写的方法是扩展了父类方法的功能。
    如果父类方法能完全实现我们想用的功能,就不需重写该方法;
    如果父类方法所实现的功能跟我们所需的功能完全不同,就要全部重写;
    如果父类方法只是部分实现了我们所需的功能,就要在重写方法时调用父类方法,并在其上扩展功能。 q
2.4
    Java有四种访问权限,
    其中三种有访问权限修饰符,分别为privatepublicprotecteddefault
    还有一种不带任何修饰符:
    1.private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。
    被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
    2.default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
    3.protect: 介于publicprivate 之间的一种访问修饰符,一般称之为“保护形”。
    被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
    4.public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。
    被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

image.png

2.5
    状态修饰符
    1.final(最终态) 
    修饰我们的成员方法、成员变量、类 
    (1)特点:
    修饰变量:该变量的值,不能被修改,必须初始化(手动赋值)被称为常量
    修饰方法:该方法,不能被重写
    修饰类:该类,不能被继承
    final修饰的局部变量
    基本数据类型:final修饰的基本数据类型的值不能够被修改的;
    引用数据类型:final修饰的引用数据类型引用类型地址不能够发生变化的,但是引用类型的
    地址里面的成员属性值是可以发生变化的。
****
    2.static(静态)
    static 翻译中文“静态”的意思,可以修饰成员方法、成员变量。
    static 修饰的特点:被类的所有对象共享访问。
    非静态成员方法
    1.能够访问静态的成员变量;
    2.能够访问非静态的成员变量;
    3.能够访问静态的成员方法;
    4.能够访问非静态的成员方法;
    静态的成员方法
    1.能够访问静态成员变量,但是不能够直接访问非静态成员变量
    2.能够访问静态的成员方法,但是不能够直接访问非静态成员方法

    一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。
    显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,
    只要类被加载了,就可以通过类名去进行访问。
    static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能
2.6
    多态的概述:
    同一个对象,在不同的时刻表现出来的不同形态
    举例子: 狗
    狗就是狗   狗 dog =new 狗();
    我们也可以说 动物 animal =new 狗();
    这里狗在不同的时刻表现出不同的形态,这就是多态。

    多态的前提和体现
    1.有继承/实现关系;
    2.方法重写
    3.有父类引用指向子类对象
        
 (左)       Animal animal =new Dog();    (右)
    成员变量:编译看左边,执行看左边;
    成员方法:编译看左边,执行看右边;

    为什么成员变量和成员方法的访问不一样呢?
    这是因为 成员方法有重写、而成员变量是没有的。
2.7
    多态的优缺点
    多态的好处:提高了程序的扩展性
    具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
    多态的弊端:不能使用子类的特有功能
    
2.8
    多态的转型
    1.向上转型(多态机制)
    从子到父
    父类引用指向子类对象
    Animal animal =new Dog()
    2.向下转型(强转)
    从父到子
    父类引用转为子类对象
  
    Dog animal1 = (Dog) animal;

2.9
    抽象类概述:
    在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
    抽象类和抽象方法用abstract关键字来修饰
    抽象类: abstract class 类名{}
    抽象方法: pubic abstract void eat();//抽象方法中没有方法体

3.0
    抽象方法的特点:
    1.抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
    2.抽象类不能实例化;
    3.抽象类由具体的子类进行实例化;
    4.子类必须对父类(抽象类)中的所有抽象方法进行重写
    5.在抽象类中可以定义非抽象方法
    6.子类如果不重写抽象类中的抽象方法,则该类还是为抽象类
    7.抽象类中可以有构造方法,用于子类访问父类时的数据初始化;

3.1
    abstract关键字不能和哪些关键字共存
    
    private    冲突   abstract的方法必须被子类重写,而private不能被继承
    final      冲突    final修饰的方法,变量都不能修改,而abstract修饰的方法必须被重写
    static     不能共存 无意义   static 是静态的,abstract方法中无方法体,无法调用。

3.2
    什么是接口:
    接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
    Java中的接口更多的体现在对行为的抽象!
    1.接口 用关键字interface 修饰
    public interface 接口名{}

    2.类实现接口用 implements 表示
    public class 类 implements 接口 {}

    3.接口不能够实例化
    接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
    多态的形式:具体类多态,抽象类多态,接口多态。

    4.多态的前提:有继承或者实现关系;有方法重写;有父(类/接口引用)指向(子/实现)类对象

    5.接口的实现类,要么重写接口中所有的抽象方法、要么是抽象类

3.3
    1、成员变量只能是常量;(直接通过接口名称访问即可)
   默认修饰符 public static final
    2、成员方法只能是抽象方法;(JDK8开始 是可以在接口中定义非抽象方法   是需要加上default关键字修饰)
   默认修饰符 public abstract
    3、接口没有构造方法;
     因为接口主要对行为进行抽象,没有具体存在,一个类如果没有父类,默认继承自Object类

3.4
    类和接口的区别
    1.类和类的继承关系 (一个类只能够单继承一个父类 不能够多继承n多个不同的父类 )
    继承关系,只能单继承,但是可以多层继承
    2.类和接口的实现关系(一个类可以实现n多个不同的接口)
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
    3.接口和接口继承的关系(一个接口是可以继承n多个不同的接口的)
    继承关系,可以单继承,也可以多继承

3.5
    抽象类和接口的区别
    1.成员区别
     1.1抽象类 变量.常量;有构造方法;有抽象方法,也有非抽象方法
     1.2接口常量,抽象方法(JDK8 在接口中定义 非抽象方法)
    2.关系区别
     2.1类与类 继承单继承
     2.2类与接口 实现,单实现和多实现
     3.3接口与接口 继承,单继承和多继承
    3.设计区别
     抽象类 对类抽象,包括属性,行为(对事物的抽象)
     接口 对行为抽象,主要是行为(对行为的抽象)

3.6
    抽象类和接口的区别
    抽象类:
    举个列子,现在要定义一个猫类和一个狗类,你可以直接定义两个类
    这样设计完全可以,但是当某一天又要设计一个猪类呢,是不是又要重复以上的代码,这样是不利于代码的重用的,
    我们看到猫类和狗类都有名字和颜色属性,都有吃和叫这两个行为,那么是不是可以抽象出一个公共基类呢,
    这个公共基类和这些动物类的关系明显是is-a(父子继承)关系。
    由于猫和狗叫的方式不同,所以这个类不能是普通的类,只能是抽象类。
    
    很明显这样实现了代码的重用,以后要设计一个猪类,只要继承BaseAnimal类并实现shout方法就可以了,
    而不用写那么多重复的代码,那么能不能把BaseAnimal定义成接口呢,而不是抽象类?肯定是不行的,
    先不说接口中不能定义color和name这两个域,即使这些动物只有行为没有属性,也是不能把BaseAnimal定义成接口的,
    这些动物都有一个共同的行为,就是吃饭,每个实现类都去实现一遍相同的代码是没有意义的。
    如果定义为接口,那么Cat类和Dog类是没办法扩展的,实现类要想扩展只能改变接口,但是接口和抽象类一旦定义好,
    是不会轻易修改的,除非修改的内容对于实现类或者继承这个抽象类的类是有意义的,
    因为接口和抽象类设计出来作为被公共使用的对象,
    你不会知道有多少人在使用这个接口或者抽象类,一旦修改接口或抽象类,势必要惊动使用者,
    而修改的内容,使用者也不一定能用到。抽象类就明显不同了,要想扩展猫类,直接修改猫类就行了,而狗类完全不受影响。

    接口:
    接口是一种约束和规则,一旦实现了某个接口,就必须实现这个接口中所有的方法,且这些方法对于这个类都是有意义的。
    现在定义一个接口,接口中有两个方法,一个方法可以比较,一个方法显示动物的技能。
    当需要设计一个既可以比较又有技能的动物类时,只要实现这个接口,那就必定要实现这两个方法。
    没有接口,你可能设计出来的动物类只有技能,而忘了能比较这个功能。所以说,接口就是一份契约,由类实现契约。
    契约中我编写了某些大的方针与前提,而签了约的类可以具体问题具体分析来实现自己的功能

抽象类和接口的区别原文

image.png

3.7
    内部类:
    成员内部类
    静态内部类
    方法内部类
    匿名内部类

image.png

image.png

image.png

image.png