面向对象1

面向对象

一、什么是面向对象

1、本质

以类的方式组织代码,以对象来组织封装数据

2、对象

1.概念

所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。

2.特点

  • 对象具有属性和行为。
  • 对象具有变化的状态。
  • 对象具有唯一性。
  • 对象都是某个类别的实例。
  • 一切皆为对象,真实世界中的所有事物都可以视为对象。

例如,在真实世界的学校里,会有学生和老师等实体,学生有学号、姓名、所在班级等属性(数据),学生还有学习、提问、吃饭和走路等操作。学生只是抽象的描述,这个抽象的描述称为“类”。在学校里活动的是学生个体,即张同学、李同学等,这些具体的个体称为“对象”,“对象”也称为“实例”。

3.类与对象关系

  • 从认识论角度考虑,先有对象后有类。对象是具体的事物。类是抽象的,对对象的抽象
  • 从代码运行角度考虑,先有类后有对象。对象是类的实例。

3、构造器

1.什么是构造器

  • 和类名相同
  • 没有返回值

2.作用

  • new本质在调用构造方法
  • 初始化对象的值

注:定义了有参构造,如果使用无参构造,必须定义一个无参构造,否则报错。

4、内存分析

1.堆

  • 存放new的对象和数组
  • 可以被所有的线程共享,不会存放别的对象引用

2.栈

  • 存放基本变量类型
  • 引用变量类型

3.方法区

  • 可以被所有的线程共享
  • 包含了所有的class和static变量

image

二、三大特性

1、封装

1.特点

  • 只能通过规定的方法访问数据。
  • 隐藏类的实例细节,方便修改和实现。

2.实现步骤

  1. 修改属性的可见性来限制对属性的访问,一般设为 private。
  2. 为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
  3. 在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
public class Person {
    private String name;
    private int age;

    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 class Demo08_封装 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("小王");//设置数据
        person.setAge(3);
        System.out.println(person.getName());//获取数据
        System.out.println(person.getAge());
    }
}

2、继承

3、多态

三、内部类

1、分类

  • 成员内部类(实例内部类、静态内部类)
  • 局部内部类

2、实例内部类

1.概念:实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。

public class Outer {
    class Inner {
        // 实例内部类
    }
}

2.特点:

1)在外部类的静态方法外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。

public class Outer {
    //内部类
    class Inner1 {
    }

    Inner1 i = new Inner1(); // 不需要创建外部类实例

    public void method1() {
        Inner1 i = new Inner1(); // 不需要创建外部类实例
    }

    public static void method2() {
        Inner1 i = new Outer().new inner1(); // 需要创建外部类实例
    }

    class Inner2 {
        Inner1 i = new Inner1(); // 不需要创建外部类实例
    }
}

class OtherClass {
    Outer.Inner i = new Outer().new Inner(); // 需要创建外部类实例
}

2)在实例内部类中,可以访问外部类的所有成员

public class Outer {
    public int a = 100;
    static int b = 100;
    final int c = 100;
    private int d = 100;

    public String method1() {
        return "实例方法1";
    }

    public static String method2() {
        return "静态方法2";
    }

    class Inner {
        int a2 = a + 1; // 访问public的a
        int b2 = b + 1; // 访问static的b
        int c2 = c + 1; // 访问final的c
        int d2 = d + 1; // 访问private的d
        String str1 = method1(); // 访问实例方法method1
        String str2 = method2(); // 访问静态方法method2
    }

    public static void main(String[] args) {
        Inner i = new Outer().new Inner(); // 创建内部类实例
        System.out.println(i.a2); // 输出101
        System.out.println(i.b2); // 输出101
        System.out.println(i.c2); // 输出101
        System.out.println(i.d2); // 输出101
        System.out.println(i.str1); // 输出实例方法1
        System.out.println(i.str2); // 输出静态方法2
    }
}

3、静态内部类

1.概念:静态内部类是指使用 static 修饰的内部类

public class Outer {
    static class Inner {
        // 静态内部类
    }
}

2.特点:

1)在创建静态内部类的实例时,不需要创建外部类的实例。

public class Outer {
    static class Inner {

    }
}
class OtherClass {
    Outer.Inner oi = new Outer.Inner();
}

2)静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。

public class Outer {
    static class Inner {
        int a = 0;    // 实例变量a
        static int b = 0;    // 静态变量 b
    }
}
class OtherClass {
    Outer.Inner oi = new Outer.Inner();
    int a2 = oi.a;    // 访问实例成员
    int b2 = Outer.Inner.b;    // 访问静态成员
}

3)静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。

public class Outer {
    int a = 0;    // 实例变量
    static int b = 0;    // 静态变量
    static class Inner {
        Outer o = new Outer;
        int a2 = o.a;    // 访问实例变量
        int b2 = b;    // 访问静态变量
    }
}

4、局部内部类

1.概念:局部内部类是指在一个方法中定义的内部类

public class Test {
    public void method() {
        class Inner {
            // 局部内部类
        }
    }
}

2.特点:

1)局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。

2)局部内部类只在当前方法中有效。

public class Test {
    Inner i = new Inner();    // 编译出错
    Test.Inner ti = new Test.Inner();    // 编译出错
    Test.Inner ti2 = new Test().new Inner();    // 编译出错
    public void method() {
        class Inner{
        
        }
        Inner i = new Inner();
    }
}

3)局部内部类中不能定义 static 成员。

4)局部内部类中还可以包含内部类,但是这些内部类也不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。

5)在局部内部类中可以访问外部类的所有成员。

6)在局部内部类中只可以访问当前方法中 final 类型的参数与变量。

public class Test {
    int a = 0;
    int d = 0;
    public void method() {
        int b = 0;
        final int c = 0;
        final int d = 10;
        class Inner {
            int a2 = a;    // 访问外部类中的成员
            // int b2 = b;    // 编译出错
            int c2 = c;    // 访问方法中的成员
            int d2 = d;    // 访问方法中的成员
            int d3 = Test.this.d;    //访问外部类中的成员
        }
        Inner i = new Inner();
        System.out.println(i.d2);    // 输出10
        System.out.println(i.d3);    // 输出0
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.method();
    }
}

5、匿名类

1.概念:匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。

new <类或接口>() {
    // 类的主体
};

2.特点:

1)匿名类和局部内部类一样,可以访问外部类的所有成员。如果匿名类位于一个方法中,则匿名类只能访问方法中 final 类型的局部变量和参数。

public static void main(String[] args) {
    int a = 10;
    final int b = 10;
    Out anonyInter = new Out() {
        void show() {
            // System.out.println("调用了匿名类的 show() 方法"+a);    // 编译出错
            System.out.println("调用了匿名类的 show() 方法"+b);    // 编译通过
        }
    };
    anonyInter.show();
}

2)匿名类中允许使用非静态代码块进行成员初始化操作。

Out anonyInter = new Out() {
    int i; {    // 非静态代码块
        i = 10;    //成员初始化
    }
    public void show() {
        System.out.println("调用了匿名类的 show() 方法"+i);
    }
};

3)匿名类的非静态代码块会在父类的构造方法之后被执行。

posted @ 2021-05-06 18:42  HXB_Blog  阅读(80)  评论(0)    收藏  举报