04Java面向对象_回顾----构造器、封装继承多态、instanceof、this、Super、接口、内部类等

面向对象编程概述

面向对象编程(Object-Oriented Programming,OOP)

面向对象编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据

抽象

三大特性:

  • 封装是指属性私有化
    • 根据需要提供setter和getter方法来访问属性
    • 隐藏具体属性和实现细节,仅对外开放接口
    • 控制程序中属性的访问级别
  • 继承是指将多个相同的属性和方法提取出来,新建一个父类
    • Java中一个类只能继承一个父类,且只能继承访问权限非private属性和方法
    • 子类可以重写父类中的方法,命名与父类中同名的属性
  • 多态可以分为两种:设计时多态、运行时多态
    • 设计(编译)时多态:即重载(Overload),是指java允许方法名相同而参数不同(返回值可以相同也可以不同),同一个类中允许存在一个或多个以上的同名函数,只要参数类型或参数个数不同即可
    • 运行时多态:即重写(Override)必须是在继承体系中,子类重写父类方法,JVM运行时根据调用该方法的类型决定调用那个方法

类的方法

  • 静态方法 static 可以直接类名调用
    • 注意点:静态方法中不能用非静态方法,原因是static和类一起加载,而非静态方法是对象创建才存在的。
  • 非静态方法 需要实例化一个对象来调用

引用传递

对象引用传递的本质还是值传递

Person p=new Person();
p.chage(p);//修改名字
//输出之后名字被修改了 ,因为是new
int a=1;
change(a);
//输出之后没有修改

创建和初始化对象

  • 使用new关键字创建对象
  • 构造器也成为构造方法,在创建对象的时候调用
    • 它必须和类的名字相同
    • 没有返回类型不能写void

构造器

  • 一个类如果什么都不写,自带一个无参构造器
  • 一旦定义了有参构造,无参就必须显式定义否则无效
  • IDEA 中alt+Insert 健自动生成构造函数
public class Student{
    int age;
    String name;
    public Student(){
        this.name="Nihao";
        this.age=21;
    }
    public Student(String name,int age){ //有参构造 
        this.name=name;
        this.age=age;
    }
    public String getName(){
        String name="QQ"
        return this.name; //this表示当前类的属性,两个name不一样
    }
}

创建对象内存分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUzXmQFC-1616631734547)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210322202708586.png)]

方法区在堆里,static方法和类一起加载,非static在创建对象之后才能加载。

this

public class Student{
    int age;
    String name;
    
    public String getName(){
        String name="QQ"
        return this.name; //this表示当前类的属性,两个name不一样
    }
}

封装

  • 高内聚,低耦合。高内聚就是类的内部数据细节自己完成,不允许外部干涉;低耦合,仅暴露少了方法给外部使用
  • 属性私有get/set

好处:

  1. 提高程序的安全性,保护数据
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 系统可维护增加了
public class Student{
    private int age; //增加private
    private String name;
	public void setAge(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    public String getName(){
        String name="QQ"
        return this.name; //this表示当前类的属性,两个name不一样
    }
}

继承

使用关键字 extends

可以继承父类的全部public方法和属性

不能继承父类private的方法和属性

一般属性都是private,方法是public 的

final 标注类之后 不能被继承

在Java中所有类默认继承Object类。 IDEA 快捷键 ctrl+h 查看所有结构

Super

Super指强调 调用父类的属性或者方法 ,注意不能调用私有的父类方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgKDk8rk-1616631734549)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323090227886.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QUXoB89V-1616631734550)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323090352748.png)]

调用父类的构造器必须在子类构造器的第一行,否则会报错;如果不写会默认调用

super()和this()不能同时出现在构造器中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PchvaYuG-1616631734553)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323090639935.png)]

重写

重写都是方法的重写,和属性无关

  1. 重写方法名必须相同
  2. 参数列表需要相同
  3. 修饰符:范围可以扩大但不能缩小
  4. 抛出的异常:范围可以缩小但不能扩大:Exception()->ClassNotFoundException()

重点: 重写静态方法和重写非静态方法不同

  1. 重写静态方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QobnHSSB-1616631734555)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323091624108.png)]

  1. 重写非静态方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T0FES3Zt-1616631734557)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323092057541.png)]

为什么会这样呢?因为静态方法是类的方法,而不是对象的方法,有static时,b调用B类的方法,因为b时用B类定义的,没有static时,b调用的时对象的方法,而b是用A类new的,因此调用A的方法。

为什么要重写?

  1. 父类的功能,子类不一定需要,或者不一定满足

多态

多态:即同一方法可以根据发送对象的不同而采用多种不同的行为方式

一个对象的实际类型是确定,但可以指向对象的引用的类型有很多

Student s1=new Student();
Person s2= new Student();
//其中s1能调用的方法都是自己的或者继承父类的 方法
//其中s2能指向并执行子类重写的方法,但是不能调用子类独有的方法
我们可以通过类型转换来调用 
    如//(Student)s2 

多态注意事项

  1. 多态是方法的多态,属性没有多态
  2. 存在关系:有继承关系,方法需要重写,父类引用指向子类对象
    1. static方法 属于类,它不属实例,不能算是重写
    2. final常量 重写不了
    3. private方法 也重写不了
  3. 一般是重写和多态挂钩

instanceof

instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2PwbBfQ-1616631734557)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210324085546101.png)]

Static

static 的静态变量,被所有该类创建的实例共享!即只有一个!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iy1ykIhP-1616631734558)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210324090809820.png)]

静态代码块是最早执行的 ,和类一起加载并执行一次,其次才是匿名代码块

我们在创建一个实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61ocbDRh-1616631734560)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210324090940704.png)]

可以看见静态代码块没了,说明他只执行一次

我们也可以通过匿名代码块来赋初始值,就和构造器一样。

静态导入包

我们都知道 Math这个类里面有random()函数,那么直接执行以下代码是错误的import java.lang.Math.random,发现会在random这里标红

但是我们可以静态导入包即 import static java.Math.random 这样就可以直接使用random了 System.out.println(random())

Abstract 类

public abstract class Action{

}

public abstract void teset();

在子类继承的时候 要实现父类的abstract方法

抽象的方法不能new。

抽象类中可以写普通方法

抽象类也存在构造器

接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sAeO52Jx-1616631734561)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210324174218288.png)]

类可以实现多接口

public interface UserService{
    public static final int age=99; //所有的属性都是默认 public static final 的常量
    void run();//其中的方法不能在接口中实现
    public abstract void run(); 
    //他们本身就是默认public abstract的    
}
public interface Time{
    void time();
}
public class UserServiceImp implements UserService,Time{
    public void run();
}

结构不能被是咯话,接口中没有构造方法

内部类

public class Outer {
    private int id;
    public void out(){
        System.out.println("这是外部类");
    }
    public class Inner//成员内部类 +加一个static就变成静态内部类
        public  void in(){
            System.out.println("这是内部类");
        }
        public  void getId(){
            System.out.println(id); //可以获得外部类的私有属性
        }
    }
    public void method(){
        class Inner2{ //局部内部类
            public void in(){
                
            }
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        Inner inner = outer.new Inner();
 		new Outer().method();;//匿名内部类
        //正常情况下是不能实例化interface ,这里是匿名内部类
        Userservice userservice = new Userservice() {
            @Override
            public void hello() {

            }
        };
    }
}

interface Userservice{
    void hello();
}

IDEA 技巧

  • 增加一个目录 如out文件 File-Project Structure- Modules–Source-add Content Root

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLWSDzTl-1616631734562)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210322201116387.png)]

  • IDEA 中alt+Insert 健自动生成构造函数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQsXwhbB-1616631734563)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210322202113268.png)]

  • 在某一个类中按下 CTRL+H可以打开这个类的继承结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-247DUBIu-1616631734564)(D:\ADeskTop\大三下学期\JAVA\Java入门环境搭建及基础知识\04Java面向对象.assets\image-20210323085742003.png)]

  • alt+insert 后可以选择override达到快捷自定义重写

Tips

  • 一个java文件里只能有一个public 类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值