设为首页 加入收藏

TOP

java基础(六):面向对象(一)
2023-07-26 08:16:26 】 浏览:107
Tags:java 基础 向对象

面向对象

面向对象:以类的方式组织代码,以对象组织数据

特性:

  1. 封装
  2. 继承
  3. 多态

类:抽象概念

对象:具体事物

  • 面向对象是java学习的重中之重,毕竟java就是一个面向对象的语言~
  • 类 = 属性+方法
  • 面向对象的概念适合复杂系统、多人协作
  • 从宏观上来说,java是面向对象的,但在微观上是面向过程的

创建

对象的创建

使用new实例化一个对象,如

Student student = new Student();//实例化对象

new时:

  • 内存空间的分配
  • 属性的初始化
  • 构造器的调用
  • 返回一个对象的引用(指针)

构造器

构造器在实例化时首先被自动调用,用于初始化参数。

new的本质是调用了构造器,返回一个对象

  • 名字和类名相同

  • 没有返回类型(不能写!)

  • 可以传参

  • this是一个指针,指向这个对象本身

    public class Person {
        String name;
        public Person(){
            //构造器
            this.name = "小明";
        }
    
    }
    

封装--访问控制

“高耦合,低内聚”,内部数据操作细节自己完成,不由外部干涉, 暴露少部分方法给外部使用。

封装:禁止访问对象的实际表示,而应该通过接口来访问。

修饰词:

  • public:可以由外部调用,公开使用
  • private:不可由外部调用
  • protected:由本包内或不同包的子类调用

继承

使用extend关键字,表示子类是父类的扩展

public class Student extends Person{
    Student(String name){
        this.name = name;
    }
}

  • 子类拥有父类的全部public/protected方法和属性
  • 且子类可以对所有方法和属性重写
  • private属性无法被继承
  • java中所有类都是object类的子类

构造器

使用super可以访问到父类,构造器中super.generator()可以调用父类的构造器。

public class Person {
    String name;

    public Person(String name){
        //构造器
        this.name = name;
    }

}
public class Student extends Person{
    Student(String name){
        super(name);
    }
}
public class Demo2 {

    public static void main(String[] args){
        Student s = new Student("小明");
        System.out.println(s.name);
    }
}

输出“小明”。

如果在子类中不指定调用super,会自动调用

public class Person {
    String name;
    public Person() {
        //构造器
        System.out.println("父类Person无参数构造器执行");
    }
}
public class Student extends Person{
    Student(){
        System.out.println("子类Student无参数构造器执行");
    }
}

在new Student时输出:

若将子类构造器改为有参,仍然会首先调用父类的无参构造器

大致逻辑如下:

注:

  • 调用构造器时,需要将父类构造器调用语句放在子类构造器的第一句
  • 父类没写无参,默认有一个空的构造器函数
  • 如果写了一个有参构造器,那么父类就没有无参构造器了,子类不能自动调用构造器,即子类中必须显式调用有参构造器了。

方法重写

  1. Person类:
public static void test(){
        System.out.println("Person Test");
    }

Student类:

public static void test(){
        System.out.println("Student Test");
    }

调用:

public static void main(String[] args){
        Student s = new Student("小明");
        s.test();
    }

结果:

  1. 但是,如果修改main
public static void main(String[] args){
        Person s = new Student("小明");
        s.test();
    }

会导致输出:

这可以说明

  • 调用的方法根据声明的类型确定
  1. 以上结论来自于静态方法

    如果全部改为非静态,即将test改为无static修饰

     @Override
        public  void test(){
            System.out.println("Student Test");
        }
    

注意点:

  • override 的前提是继承
  • 方法名相同
  • 参数列表相同(不是重载)
  • 修饰符的范围只能扩大不能缩小 public>protected>default>private
  • 异常的范围可以被缩小但不能扩大,如:ClassNotFoundException->Exception

多态

定义

同一方法根据对象的不同采用不同的行为

引用类型

一个对象的实际类型是确定的,但引用类型并不一致

Student s = new Student();
Person s1 = new Student();
Object s2 = new Student();

实际类型都是Student,而引用类型可以是其任意父类

对于这样的对象s1/s2,如果没有static修饰,调用一个方法时

  1. 若子类父类都有该方法,且子类未重写:调用父类的方法

  2. 若都有,但子类重写了:调用子类的方法

  3. 若只有子类有,则无法调用(需要强制类型转换修改引用类型)

    如在Student写一个新的eat方法:

即能调用的方法取决于其引用类型而不是实际类型

方法修饰

  1. static 属于类,不属于对象,不可重写

  2. final 无法修改,不可重写

  3. private 只属于父类,无法重写

instanceof操作符

语法:

obj instanceof class
System.out.println(s instanceof Student);//true
        System.out.println(s1 instanceof Student);//true
        System.out.println(s1 instanceof Object);//true
        System.out.println(s2 instanceof Student);//true
        System.out.println(s2 instanceof Teacher);//false

如果对象的类是class或class的子类,则为True

在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。(需要在同一条继承链上)

在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇《分布式技术原理与算法解析》学.. 下一篇读Java实战(第二版)笔记01_Java..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目