面向对象编程--中级---JAVA

IntelliJ IDEA

IDEA某些设置

1.使用细节,在创建新项目的时候,在文件夹的后面加上\和项目名字,便于查找代码。
文件夹src中存放着源码,out中存放着编译后的class文件。
2.字体设置
在这里插入图片描述
点击file ,然后点击settings
在这里插入图片描述
点击Editor中的Front,然后就可以设置字体了。
3.字符编码设置
点击file----在点击Settings------在点击Editor-----点击file Encodings
在这里插入图片描述

IDEA常用快捷键

1.删除当前行,默认是ctrl+ y,自己配置为ctrl+d;
2.复制当前行,自己配置为ctrl+alt+向下光标;
3.补全代码 alt+/
4.添加注释和取消注释 ctrl+/,第一次是添加注释,第二次是取消注释。
5.导入该行需要的类,先配置auto import,然后使用alt+enter即可。
6.快速格式化代码ctrl+alt+c.
7.快速运行程序alt+r.
8.生成构造器alt+insert,选择的时候按上ctrl.
9.查看类的层次关系 ctrl+h,学习继承后很有用。
10.将光标放在方法上,输入ctrl+b,可以定位到方法。
11.自动的分配变量名,通过在后面加.var
IEAD模板:
file-----Settings-------editor---------Live templates
可以查看JAVA模板。

包的基本介绍

包的作用:
1.区分相同名字的类
2.当类很多时,可以更好的管理类。
3.控制访问范围。
包的基本语法:
package com.hspedu;
package 关键字,表示打包
com.hspedu 表示包名
包的本质:就是创建不同的文件夹/目录来保存类文件。

包的命名规则

只能包含数字,字母,小圆点,下滑线,但不能用数字开头,不能是关键字或者保留字。
命名规范:
一般是com.公司名.项目名.业务模块名

常用的包

java.lang //lang包是基本包,默认引入,不需要再引入
java.util //util包是系统提供的工具包,工具类,Scanner
java.net //网络包,网络开发
java.awt //是做java的界面开发,GUI

包的使用

package com.txl.pakge;


import java.util.Arrays;

//import java.util.Scanner;//表示只会引入java.util包中的Scanner
//import java.util.*;//表示将引入java.util包中的所有类
public class import01 {
    public static void main(String[] args) {
        int[] arr = {-1, 23, 34, 12, 45};
        //利用系统提供的Arrays进行数组排序
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }

    }
}

注意细节:
1.package作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一个package。
2.import指令放在package下面,在类定义前面,可以有多条且没有顺序之分。

访问修饰符

在这里插入图片描述
使用的注意事项:
1.修饰符可以用来修饰类中的属性,成员方法以及类。
2.只有默认和public才能修饰类,并且遵守上面的访问权限。
关于默认修饰符,如果子类在同一个包中,那么亦可以进行访问,如果子类不在同一个包中,则不能进行访问。

封装

封装的简介

封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。

封装的实现步骤

1.将属性进行私有化(private)—不能直接修改属性
2.提供一个公共的(public) set方法,用于对属性进行判断并赋值。

public void Setxxx(类型  参数名){///xxx表示某个属性
	//加入数据验证的业务逻辑
	属性=参数名;
}

3.提供一个公共的get(public)方法,用于获取属性的值

public 数据类型  Getxxx(){//权限判断,xxx某个属性
	return xxx;
}

关于public 构造器,如果想对通过构造器设置属性也有控制,可以在构造器中调用设置属性的方法。

继承

继承的基本介绍

继承可以解决代码复用,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要定义这些属性和方法,只需要通过extends关键字来声明继承父类即可。
继承的基本语法:
class 子类 extends 父类{

}
父类又叫超类,基类
子类又叫派生类

继承的细节

1.子类继承了所有的属性和方法,非私有的属性和方法可以在子类中直接访问,但是私有的属性和方法则不行,需要父类提供的公共的方法进行访问。
2.子类必须调用父类的构造器,完成父类的初始化。
3.当创建子类对象时,不管使用子类的哪个构造器,默认情况总会调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的每个构造器中用super指明使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
4.如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)
5.super在使用时,必须放在构造器第一行(super只能在构造器中使用)
6.super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器。
7.java所有类都是Object类的子类。
8.父类构造器的调用不限于直接父类,将一直往上追溯直到Object类(顶级父类).
9.子类最多只能继承一个父类(直接继承)。即JAVA中是单继承机制。
10.不能滥用继承,子类和父类之间必须满足is-a的逻辑关系,即子类is
a 父类。

继承的本质

在这里插入图片描述

package com.text.entends_;

public class entends_exercise {
    public static void main(String[] args) {
        son son = new son();
        System.out.println(son.name);
        //此时按照查找关系来返回信息
        // (1)首先看子类是否有该属性
        //(2)如果子类有该属性,并且可以访问,则返回信息
        //(3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,则返回信息
        //(4)如果父类没有就按照(3)的规则继续向上访问,继续找上级父类,直到Object...

    }
}

class GrandPa {
    String name = "大头爷爷";
    String hoppy = "旅游";
}

class Father extends GrandPa {
    String name = "大头爸爸";
    int age = 39;
}

class son extends Father {
    String name = "大头儿子";
}

多态

简单介绍

方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。
方法的多态体现在重写和重载上。
对象的多态:
一个对象的编译类型和运行类型可能不一致
编译类型在定义对象时就确定了,不能改变
运行类型是可以变化的
编译类型看的是定义时 = 的左边,运行类型看的是 = 的右边

Animal animal = new Cat();
animal在编译时是Animal类型,运行类型是Cat类型

向上转型

本质:父类的引用指向了子类的对象
语法: 父类类型 引用名 = new 子类类型();
调用规则:
(1)可以调用父类中的所有成员,但必须遵守访问权限,但不能调用子类中特有的成员,因为在编译阶段,能够调用哪些成员是由编译类型决定的。
(2)最终运行效果看子类(运行类型)的具体实现,即调用方法时,按照从子类(运行类型)开始查找方法,然后调用.

多态向下转型

语法:子类类型 引用名 = (子类类型) 父类引用名;
只能强转父类的引用名,不能强转父类的对象,只是改变了它的编译类型和引用名。
要求父类的引用名字指向的必须是当前类型的对象。
当向下转型后,可以调用子类类型中所有的成员。

多态的一些注意事项

(1)属性没有重写之说,属性的值看编译类型。
(2)instanceof比较操作符,用于判断对象的运行类型是否为XX类型或者XX类型的子类型,如果是,则返回true,否则返回false。

JAVA的动态绑定机制

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。

多态数组

数组的定义类型为父类类型,里面保存的实际数据类型为子类类型。

Person[] person = new Person[3];
person[0] = new Student("jack",18,100.0);
person[0] = new Student("tom",22,99.0);
person[0] = new Teacher("hsp",45,40000);

多态参数

方法定义的形参类型为父类类型,实参类型允许为子类类型。

Super

基本介绍:代表父类的引用,用于访问父类的属性,方法,构造器。
基本语法:
1.访问父类的属性,但不能访问父类的private属性
用法super.属性名
2.访问父类的方法,但不能访问父类的private方法
用法super.方法名(参数列表)
3.访问父类的构造器
super(参数列表) 只能放在构造器的第一句,只能出现一句
使用super的好处
1.父类的属性由父类初始化,子类的属性由子类初始化。
2.当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须使用super,如果没有重名,使用super,this直接访问是一样的效果。
在这里插入图片描述

override(方法重写/覆盖)

简要概述:方法覆盖就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样,那么我们就说子类的这个方法覆盖了父类的方法。
细节:
1.子类方法的参数,方法名称和父类方法的参数,方法名称完全一样。
2.子类方法的返回类型和父类方法的返回类型一样,或者是父类方法返回类型的子类,例如:父类方法的返回类型是Object 子类方法的返回类型是String
3.子类方法不能缩小父类方法的访问权限。
在这里插入图片描述

Object类详解

equals方法

==和equals比较
==是一个比较运算符,既可以判断基本类型,也可以判断引用类型。
如果判断的是基本类型,判断的是值是否相等。
如果判断的是引用类型,判断的是地址是否相等,即是否是同一个对象。
equals是Object类中的方法,只能判断引用类型。
equals默认判断的是地址是否相等,但是子类往往重写该方法,导致它判断内容是否相等,例如判断String类时,判断的是字符串内容是否相等,判断的不再是地址了。

hashCode方法

1.提高具有哈希结构的容器的效率。
2.两个引用,如果指向的是同一个对象,则哈希值肯定是一样的。
3.两个引用,如果指向的是不同对象,则哈希值是不一样的。
4.哈希值主要根据地址号来的,不能完全将哈希值等价于地址。

toString方法

基本介绍:默认返回 :全类名(包名+类名)+@+哈希值的十六进制
Object类中的toString源码:

public String toString(){
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

子类往往重写toString方法,用于返回对象的属性信息。
编译器提供的有重写的结构,可以通过快捷键快速使用。
另外当直接输出一个对象时,toString方法会被默认的调用。

finalize方法

1.当对象被回收时,系统会自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。如果程序员不重写该操作,就会默认处理,没有任何的提示。
2.什么时候被回收:当某个对象没有任何引用时,则jvm就会认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁对象,在销毁对象前,会先调用finalize方法。
3.垃圾回收机制的调用,是由系统来决定(即有自己的gc算法),也可以通过System.gc()主动地触发垃圾回收机制。

断点调试

简单介绍

在断点调试过程中,是运行状态,是以对象的运行状态决定的。
断点调试介绍:
1.断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中你可以看到各个变量当前的值,出错的话,调错到出错的代码行即显示错误,停下。进行分析从而找到这个bug。

常用快捷键

F7 跳入方法内
F8 逐行执行代码
shift+F8 跳出方法
F9:resume,执行到下一个断点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值