1.面向对象—封装
1.1
类和对象
1.1.1类和对象理解
对象:世间万物
类:类是对现实生活中一类具有共同属性和行为的事物的抽象
类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
简单理解:类就是对现实事物的一种描述
类的组成
属性:事物的特征
行为:事物能执行的操作
类和对象的关系:类是对事物的一种描述,对象则为具体存在的事物。
1.1.2类的定义:
类的组成是由属性和行为组成。
类的定义步骤:
①定义类
②编写类的成员变量
③编写类的成员方法
public class 类名 {
// 成员变量
变量1的数据类型 变量1;
变量2的数据类型 变量2;
…
// 成员方法
方法1;
方法2;
}
示例代码
/*
手机类:
类名:
手机(Phone)
成员变量:
品牌(brand)
价格(price)
成员方法:
打电话(call)
发短信(sendMessage)
*/
public class Phone {
//成员变量
String brand;
int price;
//成员方法
public void
call() {
System.out.println("打电话");
}
public void
sendMessage() {
System.out.println(“发短信”);
}
}
1.1.3对象的使用
创建对象的格式:
类名 对象名=new 类名();
调用成员的格式:
对象名.成员变量
对象名.成员方法()
1.2
对象内存图
凡是new出来的东西都在堆内存
自己所定义的成员变量都是栈内存
1.3
成员变量和局部变量区别
(%5B%E5%A4%96%E9%93%BE%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E5%A4%B1%E8%B4%A5,%E6%BA%90%E7%AB%99%E5%8F%AF%E8%83%BD%E6%9C%89%E9%98%B2%E7%9B%97%E9%93%BE%E6%9C%BA%E5%88%B6,%E5%BB%BA%E8%AE%AE%E5%B0%86%E5%9B%BE%E7%89%87%E4%BF%9D%E5%AD%98%E4%B8%8B%E6%9D%A5%E7%9B%B4%E6%8E%A5%E4%B8%8A%E4%BC%A0%28img-6uNPmoXU-1572090409967%29%28https://blog.csdn.net/HXNLYW/article/details/94550158%29%5D)
1.4
封装和构造方法
1.4.1
private
private是一个修饰符,可以用来修饰成员(成员变量,成员方法)
被修饰成员,只能本类访问。如需被他类使用,需有对应操作。
1.4.2
this
this修饰的变量用于指代成员变量,主要作用(区分局部变量和成员变量的重名问题)
方法的形参与成员变量相同,不带this修饰的变量指的是形参
this使用时间:解决局部变量隐藏成员变量
this:代表所在类的对象引用。(方法被哪个对象调用,this就代表哪个对象)
方法的形参与成员变量不同,不带this修饰的变量指的是成员变量
this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象
1.4.3
封装思想
封装概述
是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法
封装好处
通过方法来控制成员变量的操作,提高了代码的安全性把代码用方法进行封装,提高了代码的复用性。
1.4.4构造方法
构造方法是一种特殊的方法
作用:创建对象 Student stu = new Student();
格式:
public class 类名{
修饰符 类名( 参数 ) {
}
}
功能:主要是完成对象数据的初始化
构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法 如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的重载
如自定义带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
推荐的使用方式
无论是否使用,都手工书写无参数构造方法
重要功能!
可以使用带参构造,为成员变量进行初始化
面向对象—继承
2.1继承定义、利弊、super、访问特点
2.1.1定义
继承的格式
格式:public class 子类名 extend 父类名{}
范例:public class Zi extend
Fu{}
父类:也可被称为基类、超类。
子类:派生类
继承中子类的特点:
①子类可以有父类的内容
②子类还可以自己的特有的内容
2.1.2继承的利弊
利:提高代码复用性和维护性
弊:提高了类之间的耦合性,父类变化子类也需要跟着变化,削弱了子类的独立性
使用继承的时间:
继承体现关系:is a
假设法:A和B两个类,A是B的一种或B是A的一种,即存在继承关系。
举例:苹果和水果,猫和动物,狗和猫[XG1]
2.1.3继承中变量的访问特点:
在子类方法中访问一个变量
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲[XG2] …)
2.1.4 Super
Super关键字的用法和this关键字类似
2.1.5继承中构造方法的访问特点
默认都访问父类中无参的构造方法
2.1.6继承中成员方法的访问特点
通过子类对象访问一个方法
①子类成员范围找
②父类成员范围找
③如果都没有就报错(不考虑父亲的父亲…)
2.2方法重写和方法重写注意特征
2.2.1方法重写
概述:子类中出现了和父类一模一样的方法声明。
应用:当子类需要父类的功能,而主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
@Override
注解,可以帮助检查重写方法的方法声明的正确性
2.2.2注意事项
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public>默认>私有)
2.3 java中继承的注意事项、package、import
2.3.1
java中继承的注意事项
只支持单继承,不支持多继承
Java中类支持多层继承
2.3.2
package
修饰符
包:其实是文件夹,
作用:对类进行分类管理
定义格式:
格式:package包名; (多级包用;分开)
范例:package com.itheima;(记事本)
2.3.3
import
导包:使用不同包的类,使用时要写包的全路径,写起来太麻烦了,为了简化带包操作,java提供了导包的功能。
格式:import包名;
范例:import cn.com.itcast.Teacher
2.4权限修饰符(private、protected、public)、状态修饰符(final、static)
2.4.1权限修饰符(private、protected、public)
2.4.2状态修饰符(final、static)
final:可以修饰成员方法,成员变量,类
final修饰的特点:
修饰方法:表明该方法最终方法,不能被重写
修饰变量:表明该变量是常量,不能再次被赋值
修饰类:表明该类是最终类,不能被继承
final修饰局部变量:
基本类型:修饰的数据值不能发生改变
引用类型:修饰的地址值不能发生改变,地址里内容可以改变
static:可以修饰成员方法,成员变量
static修饰的特点:
被类的所有对象共享(这也是我们判断是否使用静态关键字的条件)
可以通过类名调用,也可以通过对象名调用,推荐使用类名调用
static访问特点;静态成员方法只能访问静态的成员方法。
面向对象—多态
3.1多态
3.1.1多态
同一对象,在不同时刻表现出来的不同时态
举例:猫
可以说猫是猫:猫cat=new 猫();
也可以说猫是动物:动物 animal=new 猫();
猫在不同时刻表现出来不同的形态,这就是多态。
多态的前提和体现
有继承/实现关系
有方法重写
有父类引用指向子类对象
3.1.2多态中成员访问特点:
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
访问不一样原因:成员方法有重写,而成员变量没有
3.1.3好处和弊端
好处:提高程序扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
弊端:不能使用子类的特有功能
3.1.4转型
①向上转型
从子到父
父类引用指向子类对象
②向下转型
从父到子
父类引用转为子类对象
3.1.5抽象类
Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类特点:
抽象类和抽象方法必须使用abstract关键字修饰
public abstract class类名{}
public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
抽象类的成员特点
成员变量(可以是变量也是常量)
构造方法
有构造方法,但不能实例化
那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化
成员方法
可以有抽象方法:限定子类必须完成某些动作
也可以有非抽象方法:提高代码复用性
3.2接口
3.2.1接口及其特点、成员特点
接口概述:
接口就是一种公共的规范标准,只要符合规范标准,就可以使用
Java中的接口更多的体现在对行为的抽象
接口的特点
接口用关键字interface修饰
public interface 接口名{}
类实现接口用implements表示
public class类名implements接口名{}
接口不能实例化
接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态
多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
接口的实现类
要么重写接口中的所有抽象方法
要么是抽象类
接口的成员特点
成员变量
只能是常量
默认修饰符:public static final
构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在
一个类如果没有父类,默认继承自Object类
成员方法
只能是抽象方法
默认修饰符:public abstract
3.2.2类和接口的关系
类和类的关系
继承关系,只能单继承,单可多层继承
类和接口的关系
实现关系,可单实现,也可多实现,还可以在继承一个类的同时实现多个接口
接口和接口关系
继承关系,可单继承,也可多继承
3.2.3抽象类和接口的区别
抽象类是对事物的抽象,而接口是对行为的抽象
3.2.4类名作为形参和返回值
方法的形参是类名,其实需要的是该类的对象
方法的返回值是类名,其实返回的是该类的对象
3.2.5抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是该抽象类的子类对象
方法的返回值是抽象类名,其实返回符是该抽象类的子类对象
3.2.6接口名作为形参和返回值
方法的形参是接口名,其实需要的是该接口的实现类对象
方法的返回值是接口名,其实返回的是该接口的实现类对象
3.3内部类
3.3.1内部类
内部类:在一个类中定义一个类
内部类的定义格式
格式
public class类名{
修饰符class类名{
}
}
范例:
public class类名{
public
class Inner{
}
}
内部类访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
3.3.2成员内部类
只需记一个,成员内部类创建对象使用格式
格式:外部类名.内部类
对象名=外部类对象.内部类对象
3.3.3局部内部类
局部内部类是在方法中定义的类,故外界无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
3.3.4匿名内部类
前提:存在一个类或者接口,这里的类可以是具体类也可以抽象类
格式:
new 类名或接口名(){
重写方法;
}
范例:
new Inter(){
public void show(){
}
}
本质:是一个继承了该类或者实现了该接口的子类匿名对象
[XG1]这样的关系不应该使用继承
[XG2]出现这种情况会报错