面向对象的总结和关键字的使用

面向对象的三大特征:

封装、继承、多态

关键字的使用:

关键字有哪些?

this关键字

super关键字

static关键字

final关键字

abstract关键字

package关键字和import关键字

return关键字

一、封装(隐藏):

面向对象的三大特征:

封装、继承、多态

一、封装(隐藏):

一、 问题的引入

  1. 当我们创建一个类的对象以后,我们可以通过"对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到 属性的数据类型和储存范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值 加入额外的限制条件。这个条件就不能在属性声明时体现。我们只能通过方法进行限制条件的增加。(比如:setlegs()) 同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private) -->此时,针对于属性就体现了封装性。
    二、封装性的体现
    1.我们将类的属性Xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
    拓展:封装性的体现:① 私有化属性如上 ② 不对外暴露私有的方法 ③单例模式…
    三、封装性的体现,需要权限修饰符来配合。
    1. Java规定的四种权限:(从小到大排列):private、缺省(default)、protected、public
    1. 4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
    2. 具体的,4中权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
    3. 修饰类的话,只能使用:缺省、public
    4. 总结封装性:Java提供4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。

二、继承性:

一、继承可以让子类具有父类的特性,提高了代码的重用性。

从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法。

继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。

如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。

例如:

     猫可以:喵喵叫、吃、喝、拉、撒

     狗可以:汪汪叫、吃、喝、拉、撒

吃、喝、拉、撒是猫和狗都具有的功能,如果分开写猫和狗的类中编写了两次。
如果使用继承的思想,如下实现:

动物:吃、喝、拉、撒

猫:喵喵叫(猫继承动物的功能)
狗:汪汪叫(狗继承动物的功能)
二、继承性的格式:class A extends B{} 注释:extends关键字

A:子类、派生类 英文说法:subclass

B:父类、超类、基类 英文说法:superclass

2.1 体现:一旦子类A中继承父类B以后,子类A就获取了父类B中声明的所有的属性和方法。

特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。

只是因为封装性的影响,使得子类不能直接调用父类的结构而已。

2.2 子类继承父类以后,还可以定义声明自己特有的属性或方法:实现功能的扩展。

子类和父类的关系,不同于子集和集合的关系。

三、Java中关于继承性的规定:

1.一个类可以被多个子类继承。

 2.Java中类的单继承:一个类只能有一个父类

 3.子父类是相对的概念。

 4.子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类

 5.子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法

四、1.如果我们没有显式的声明一个类的父类的话,则此类继承于Java.lang.Object类

2.所有java类(除Java.lang.Object类之外)都直接或间接的继承于Java.lang.Object类

3.意味着,所有的java类具有java.lang.Object类声明的功能

三、多态性:

  1. 多态是指同一个方法调用由于对象不同可能会产生不同的行为。父类的同一种动作或者行为,在不同的子类上有不同的实现。
    现实生活中,我们有很多例子。
    比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休息是玩游戏,程序员是敲代码。
    同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

  2. 关于多态要注意以下 2 点:
    2.1 多态是方法的多态,属性没有多态。
    2.2 多态的存在有 2 个必要条件:类的继承关系、方法的重写。
    优点:
    增加程序灵活性。增加程序可扩展性。

    注意:有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
    例子:

    public class AnimalTest {

    public static void main(String[] args) {
        AnimalTest test = new AnimalTest();
        test.func(new Dog());
    }
    
    public void func(Animal animal){//AnimalTest animal = new Dog();
        animal.eat();
        animal.shout();
    }
    
    //    public void func(Dog dog){//多态性的好处可以不用再写重载代码,避免重载冗余
    //        dog.eat();
    //        dog.shout();
    //    }
    //    public void func(Cat cat){
    //        cat.eat();
    //        cat.shout();
    //    }
    }
    
    class Animal{
    
    public void eat(){
        System.out.println("动物进食");
    }
    public void shout(){
        System.out.println("动物:叫");
    }
    
    }
    
    class Dog extends Animal{
    
    public void eat(){
        System.out.println("狗吃骨头");
    }
    public void shout(){
        System.out.println("汪!汪!汪!");
    }
    
    }
    class Cat extends Animal{
    
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void shout(){
        System.out.println("喵!喵!喵!");
    }
    
    }
    

关键字的使用:

关键字有哪些?

this关键字

一、this关键字的使用

this关键字的使用:
  1.this可以用来修饰、调用:属性、方法、构造器

  2.this修饰属性和方法:
   this理解为:当前对象 或 当前正在创建的对象

   2.1 在类的方法中,我们可以使用"this.属性"或"this.方法“的方式,调用当前对象属性或方法。但是,
   通常情况下,我们都选择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式
   的使用"this.变量"的方式,表明此变量是属性,而非形参。

   2.2 在类的构造器中,我们可以使用"this.属性"或"this.方法“的方式,调用当前正在创建的对象属性或方法。但是,
   通常情况下,我们都选择省略"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式
   的使用"this.变量"的方式,表明此变量是属性,而非形参。

 3.this调用构造器
   ① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
   ② 构造器中不能通过"this(形参列表)"方式调用自己
   ③ 如果一个类中有n个构造器,则最多有n - 1构造器中使用了"this(形参列表)"
   ④ 规定:"this(形参列表)"必须声明在当前构造器的首行
   ⑤ 构造器内部:最多只能声明一个"this(形参列表)",用来调用其他的构造器

super关键字

super关键字的使用
   1.super理解为:父类的
   2.super可以用来调用:属性、方法、构造器

   3.super的使用

3.1 我们可以在子类的方法或构造器中,通过使用“super.属性”或“super.方法”的方式,显式的调用父类中声明的属性和方法。
   但是,通常情况下,我们习惯省略“super.”
3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用“super.属性”
   的方式,表明调用的是父类中声明的属性。
3.3 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用“super.方法”
   的方式,表明调用的是父类中被重写的方法。

   4.super调用构造器

4.1 我们可以在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
4.2 “super(形参列表)”的使用,必须声明在子类构造器的首行!
4.3 我们在类的构造器中,针对于“this(形参列表)”或“super(形参列表)”只能二选一,不能同时出现
4.4 在构造器的首行,没有显式的声明“this(形参列表)”或“super(形参列表)”,则默认调用的是父类中空参的构造器:super()
4.5 在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”,调用父类中的构造器

static关键字

static关键字的使用

  1.static:静态的
  2.static可以用来修饰:属性、方法、代码块、内部类

  3.使用static来修饰属性:静态变量(类变量)

    3.1 属性:按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
     实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
     静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
    3.2 static修饰属性的其他说明:
        ① 静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
        ② 静态变量的加载要早于对象的创建
        ③ 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。

    3.3 静态属性举例:System.out;Math.PI;

  4.使用static来修饰方法:

    ① 随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
    ②       静态方法    非静态方法
        类     yes       no
        对象    yes       yes
    ③ 静态方法中,只能调用静态的方法或属性
      非静态方法中,即可以调用非静态的方法或属性,也可以调用静态的方法或属性

1. static注意点:
   在静态方法内,不能使用this关键字、super关键字

  6.开发中如何确定一个属性是否要声明为static的?

属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
类中的常量也常常声明为static

开发中如何确定一个方法是否要声明为static的?

操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的比如:Math、Arrays、Collections

final关键字

final:最终的(单身贵族类hhh)

1. final可以用来修饰的结构:类、方法、变量

2. final 用来修饰一个类:此类不能被其他类所继承
      比如:String类、StringBuffer类

3. final 用来修饰方法:表明此方法不可以被重写
      比如:Object类中的getClass();

4. final 用来修饰变量:此时的”变量“就称为是一个常量
      4.1 final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化
      4.2 final修饰局部变量:
       尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。
       一旦赋值以后,就只能在方法体内使用形参,但不能进行重新赋值。

 static final 用来修饰属性:全局常量

abstract关键字

 abstract关键字的使用
  1.abstract:抽象的
  2.abstract可以用来修饰的结构:类、方法

  3.abstract修饰类:抽象类

此类不能实例化(实例化也就是造对象的意思)
抽象类中一定有构造器,便于子类实例化调用(涉及:子类对象实例化的全过程)
开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作

  4.abstract修饰方法:抽象方法

抽象方法只有方法的声明,没有方法体
包含抽象方法的类,一定是一个抽象类。反之,抽象类中是可以没有抽象方法的。
若子类重写了父类中的所有的抽象方法后,此子类方可实例化
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰

  abstract使用上的注意点:
  1.abstract不能用来修饰:属性、构造器等构造

  2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类

package关键字和import关键字

     一、package关键字的使用
      1.为了更好的实现项目中类的管理,提供包的概念
      2.使用package声明类或接口所属的包,声明在源文件的首行
      3.包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名之意”
      4.每"."一次,就代表一层文件目录。

      补充:同一个包下,不能命名同名的接口、类
           不同的包下、可以命名同名的接口、类

      二、import关键字的使用
      import:导入
      1.在源文件中显式的使用import结构导入指定包下的类、接口
      2.声明在包的声明和类的声明之间
      3.如果需要导入多个结构,则并列写出即可
      4.可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构
      5.如果使用类或接口是Java.lang包下定义的,则可以省略import结构
      6.如果使用的类或接口是本包下定义的,则可以省略import结构
      7.如果在原文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。com.xxx.xxx.类名
      8.如果使用"xxx.*"方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入

     1. import static:导入指定类或接口中的静态结构:属性或方法

return关键字

return关键字的使用:

1.使用范围:使用在方法体中
2.作用:① 结束方法
        ② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。
3.注意点return关键字后面不可以声明执行语句。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值