面向对象 续

//类的格式声明
//格式
[修饰符] class 类名{
    //属性列表
    //构造器列表
    //get/set方法
    //其他方法
}

如何创建对象

new 类名();    用无参构造

new 类名(参数);   用有参构造

匿名对象和有名对象:

Student stu = new Student(): stu对象名,也可以称为对象的引用

匿名对象: System.out.println(new Student());

对象内存图:

 

 面向对象基本特征

封装

封装的作用:安全  使用方便  对使用者屏蔽实现细节

概念:

        狭义:

                属性的封装

                       (1)属性私有化:private

                       (2)提供公共get/set方法

        广义:方法 类 包  组件  系统 

继承

什么情况下需要继承?继承的好处是什么?

为了代码重用

(1)当有一个父类,如果再声明类时,发现这些类与已经存在的父类有很多相同特征,那么就可以通过继承的方式来简化代码

(2)已经很多类,发现这些类有很多共同的特点,那么我们可以把这些共同的特点抽取到一个父类中,以便简化代码

逻辑角度

  表示is-a的关系

如何继承

语法格式:
[修饰符] class  子类名  extends  父类名{
}

继承后对几个成员的影响

   属性

(1)子类继承父类时,一定会继承父类的所有的属性,包括私有的,但是由于私有的关键字private的原因,在子类中无法直接操作它,但是可以通过get/set方式操作它

(2)当子类的属性与父类的属性重名时,而且父类的属性没有私有化,如果要访问父类的属性那么通过super.属性进行访问,如果子类中没有通过super.属性访问,那这个属性就表示是子类自己的

//面试题
package com.atguigu.review;
public class Test {
    public static void main(String[] args) {
        Student stu = new Student();
        System.out.println(stu.getInfo());//结果?  年龄:10
        System.out.println(stu.getAge());//结果?20   如果子类重写,答案是10
    }
}
class Person{
    int age = 20;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}
class Student extends Person{
    int age = 10;
    /*public int getAge(){
        return age;
    }*/
    public String getInfo(){
        return "年龄:" + age;
    }
}

   方法

(1)子类继承父类时,一定会继承父类的所有的方法,包括私有的,但是由于private,在子类中无法直接操作,但是可以间接操作

(2)当父类的方法实现不适用于子类时,子类可以对父类的方法的进行重写

   构造器

(1)子类继承父类时,不会继承父类的构造器

(2)子类继承父类时,一定会调用父类的构造器 

           如果父类有无参构造,那么子类会默认去调用父类的无参构造
           如果父类没有无参构造,只有有参构造,那么子类必须在子类构造器中手动调用父类的有参构造

          调用父类的无参构造的语句:super();
          调用父类的有参构造的语句:super(实参列表);
          而且这两个语句必须在子类的构造器的首行。

继承的原则:

(1)单继承

         在Java中只支持单继承,也就是说一个类只能有一个直接父类     --》一个唯一的亲生父亲

(2)多层继承

        在Java中父类还可以有父类,而且在子类中会继承父类以及父类的父类的所有的属性与方法 --》代代相传

              子类对象在寻找一个方法、属性时,如果本类中找不到,会去直接父类中查找,如果直接父类中也找不到,在往上找,找到为止,一直追溯到java.lang.Object根父类中

              通过super.属性和方法时,先从直接父类中查找,如果没有,再往上找,直到找到为止,一直可以到java.lang.Object

(3)一个类可以有很多个子类,子类还可以有子类

        子孙满堂      开枝散叶

多态

多态的表现形式

(1)方法的重载:同一个类中,功能多种实现形式
         方法的重写:父子类中,功能的不同实现形式

(2)对象的多态性

        编译时类型与运行时的类型不一致,编译时看“左边”,运行时看“右边”,
        编译时从“父类”中寻找方法,运行时执行的是“子类”重写过的代码

               对象的多态性的前提:
                   (1)继承
                   (2)方法的重写
                   (3)多态引用

                            多态引用

                                 Person p = new Student();

                             本态引用

                                  Person p = new Person();

                                  Student s = new Student();

多态的应用: (1)多态参数  (2)多态数组

类型转换:

      向上转型

          子类的对象赋值给父类的变量   自动完成

      向下转型

          把父类的变量赋值给子类的变量

          强制类型转换

          想要向下转型成功    父类的变量本身指向的就是该子类的对象

          如何避免ClassCastException

//在向下转型之前,加判断
if(变量  instanceof  子类类型){
    子类类型  temp = (子类类型)变量;
}

           什么情况下需要向下转型

                    因为一个对一旦向上转型后,那么就无法访问该子类对象中特有的方法,只能访问父类有的方法

                    如果需要通过该对象,访问子类的特有的方法等,那么就需要向下转型

Overload和Override的区别

Overload:方法的重载
在同一类,方法名称相同,形参列表不同的两个或多个方法称为重载。
Override:方法的重写
在子类继承父类时,如果父类的方法实现不适用于子类,子类就可以对父类的方法进行重写,覆盖。

 

posted @ 2023-02-18 17:28  LuckySnail  阅读(15)  评论(0)    收藏  举报