目录
2.1、static 静态(共享)不需要创建对象,直接类名调用
2.2、final 常量、最终类(不能被继承,被绝育了)用于修饰类、属性和方法
成员变量一般使用private来声明,保护成员变量不被胡乱的赋值,所以不能随便访问,这时候需要getter setter
setter:主要是给成员变量赋值,做一定的保护,即判断限制的逻辑代码
1、把子类的对象赋值给父类的引用/变量——向上转型 —— Animal ani = new Cat()
2、把父类的对象(变量)转化为子类的变量——向下转型 ——在1的基础上,Cat cat1 = Cat(ani)
3、接口与接口的关系:多继承(一个接口可以同时继承多个接口)
一、类与对象
1、 面向对象和面向过程
面向过程:侧重的是过程
-
优点:简单
-
缺点:代码量大了之后,维护性非常差
面向对象:侧重的是对象
你是上帝视角 你创建一个大象 告诉大象,进冰箱
-
优点:可扩展性非常强,维护成本低
-
缺点:新手上手难
2、 类与对象
1、造车
-
1.画图纸
定义车的属性信息:color speed seat
定义车的动作:跑
-
2.拿着图纸找工厂生产车
2、面向对象的世界里:
- 类:就是图纸
- 属性:这一类事物拥有的共同属性
- 动作:这一类事物共同能执行的功能
- 对象:使用类创建的具体的某一个东西
- 对象能干什么?——完全取决于类是如何定义的
3、写代码:
- 类:使用class定义
- 属性:成员变量来描述,直接写在类中的变量
- 动作:成员方法,不写static就是成员方法
- 创建对象:类 引用(变量) = new 类名(); “=“前后 相当于int a = 10
- 调用成员方法:对象/引用.方法()
- 类型 变量——在面向对象的世界里,变量是没有市场的,这种变量被称为引用
3、方法/函数重载
-
重载规则:方法名一样,参数不一样,与返回值无关 ,返回值必须相同;
-
重载研究的是同类中的方法,唯一一样的就是方法名和返回值
-
1、参数的个数不一样
-
2、参数的类型不一样
-
3、参数个数一样,类型也一样,但是顺序不一样
-
- 普通方法和构造方法都能重载
- 在执行的时候,程序会自动的根据你给的参数去找对应的方法,执行
- 重载作用:可以让我们省去起名字的烦恼
4、构造方法(构造方法的重载)
构造方法:在创建对象时候,自动调用的方法
语法:
public 类名(传参){
}
注意:
1、没有返回值这一项
2、在我们new的时候,自动调用构造方法
作用:在创建对象的时候,给对象设置属性信息
1、无参构造
Java会默认自动的赠送给每一个类一个无参数的构造方法
但是如果自己写了构造方法 java就不再赠送了——即
⚠️如果只写有参构造,不写无参构造,那么java不赠送无参构造,这时候如果有其他地方需要用到无参构造 创建对象...的时候就会报错
⚠️所以一般时候我们这样:要么不写任何构造(这时候有默认赠送的无参构造);要么有参、无参一起写(避免不赠送无参带来的报错)
2、有参构造
一般情况参数和成员变量保持一致;除了创建对象之外,一般情况用来给成员变量赋值
3、构造方法也是方法,也可以进行重载
作用:可以有更多的方式去创建对象 即多个构造方法
但是因为构造方法们可能有重复的东西,那么使用this(......)可以访问当前类中其他的构造方法
5、this关键字
this:指向当前类 表示当前类的对象
this 可以在方法内部获取到对象中的属性信息
this 还可以区分局部变量和成员变量
变量的查找顺序:先找自己方法内的,如果自己没有,就去this里面找
java中允许成员变量和局部变量同名 但是引用变量会有就近原则的问题,那么引入this
作用:
1、用this关键字,可以解决成员变量和局部变量同名的问题
2、this表示当前对象
6、局部变量 成员变量
局部变量和成员变量的区别:
成员变量:方法外部,类内部定义的变量
局部变量:类的方法中的变量,方法的参数中或者里面
成员变量 | 局部变量 | |
---|---|---|
作用域 | 针对整个类有效 | 在方法内部有效 |
生命周期 | 随着对象的创建而存在,随着对象的消失而消失 | 当方法调用完,或者语句结束后,就自动释放 |
初始值 | 有默认初始值 | 没有默认初始值,使用前必须赋值 |
内存中位置 | 成员变量属于对象,进堆内存 | 局部变量属于方法,进栈内存 |
7、修饰符
1、访问修饰符 可以修饰成员变量、成员方法、类
public 、protected 、默认修饰符default、 private——权限逐步降低。
public的访问权限最大,private类型的访问权限最小
-
public 公共的: 所有类都可以访问
-
protected 受保护的:主要是给子类用的;同一个包下都可以访问,不同包下子类访问;
-
default默认的,啥也不写: 包访问权限 在自己包内可以随意访问 默认不写;如果不在一个包内,即使继承关系也是不能访问的。
-
private 私有的 只有类自己能用
- 用的最多的是private和public
2、非访问修饰符 static final
2.1、static 静态(共享)不需要创建对象,直接类名调用
—— 一般和业务没什么关系的 工具类用到static
——static所有对象共享 跟着类走;即一个对象改了static修饰的变量,其他对象的该变量都变了
2.2、final 常量、最终类(不能被继承,被绝育了)用于修饰类、属性和方法
-
被final修饰的类不可以被继承
-
被final修饰的方法不可以被重写
-
被final修饰的变量不可以被改变⚠️又被称为常量
⚠️被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的;
-
final如果修饰基本数据类型,被初始化之后其值不能够再改变;
-
如果修饰的是引用,其引用不可变,但是引用的对象内容可变,就是引用不能够变成其他的引用,但是引用的对象内容可变。
2.3、abstract 抽象
二、面向对象的三大特征
三大特征都是为了少些代码、少修改代码。
一、封装(把代码放入方法)
核心思想是隐藏细节 ——引出get set
意思是将代码通过函数的形式将一些代码细节包装起来,防止外部代码的随机访问,要访问这些数据就必须通过调用函数来完成。
1、好处: 提高了代码的阅读性 提高了代码的可维护性
2、体现:方法、对象、private get/set
成员变量一般使用private来声明,保护成员变量不被胡乱的赋值,所以不能随便访问,这时候需要getter setter
get/set和构造方法都可以对成员变量进行赋值。
setter:主要是给成员变量赋值,做一定的保护,即判断限制的逻辑代码
getter:从成员变量中获取数据
idea生成方式:idea空白位置 -> 右键 -> generate -> getter and setter -> 全选 -> OK
二、继承
生活中的继承:子承父业。
java中继承:当出现X是一种y的时候,x就可以继承y,比如黑熊怪是一种妖怪
java中的继承:两个类之间通过extends关键字来描述父子关系,子类便可拥有父类(爷爷类)的非私有成员。子类可以自动拥有父类中除了私有内容外的其他所有内容
解决问题:
- 提高了代码复用性
- 代码的维护性更高
- 简化代码的开发
- 子类对父类进行了扩展
语法:
public class 父类 {}
public class 子类 extends 父类 {}
注意事项:
1、如果一个类不继承任何类,默认继承Object, Object是java中的祖宗类。
2、Java是单继承(一个类只能继承于一个类),多层继承,一个父类可以有多个子类。
3、创建本类对象之前会先初始化父类对象
4、子类不能继承父类的private成员(属性,方法)子类也可以有自己的东西,即子类对父类进行了扩展
三、多态
多态:同一个对象拥有多种形态 ——比如猫它是一只猫,还是动物
作用:把不同的数据类型进行统一,让程序具有超强的可扩展性——比如猫、狗、大象,都是动物,人去喂动物
好处:扩展性变强了, 方法的参数 用一个变量接收所有的子类对象,解决了代码复用
弊端:不能直接调用子类的特有方法 非要调用可以用强转的方式
分析:猫是一动物,继承动物,可以把猫当成动物来看
Cat extends Animal
Cat c = new Cat()//创建一只猫,把它赋值给猫类型的变量(引用)c
Animal ani = new Cat()//可以把猫当成动物来看,把子类的对象赋值给父类的引用(变量)
//——向上转型,会屏蔽掉子类中特有的方法,比如抓老鼠,站在动物的角度,不能抓老鼠
Cat cat1 = Cat(ani)//向下转型
tips⚠️:
1、把子类的对象赋值给父类的引用/变量——向上转型 —— Animal ani = new Cat()
——缺点:会屏蔽掉子类中特有的方法;
——子类和父类一样的方法,使用子类的方法
2、把父类的对象(变量)转化为子类的变量——向下转型 ——在1的基础上,Cat cat1 = Cat(ani)
向下转型可能会有风险,java要求必须要写强制类型转换:(转换之后的数据类型)变量
引用数据类型的强转 :把父类的对象转换成子类的变量(向下转型) 强转的两者之间要有继承关系
四、重写(在继承 多态中常用)
1、前提条件:继承或者实现
- 重写研究的是类与类之间的关系,也可以是类和接口之间的关系
- 子父类(接口实现)出现了一模一样的方法,升级或者改造父类的方法
2、语法:子类对父类中提供的方法进行重新定义
-
子父类中出现了一模一样的方法。
-
修饰符、返回值、方法名、参数都必须一模一样。
-
子类和父类中的方法的声明完全一致
3、作用:方法升级。父类方法无法满足子类的需求
重写又被称为方法的覆盖
super可以调用父类中被重写了的方法,半盖
三、接口 抽象类
1、抽象类(现实中不存在的东西)
在Java中的抽象:只声明,不实现
1、抽象方法:
被abstract修饰的方法,就是抽象方法;抽象方法没有方法体{},直接;结束
2、抽象类:
类中如果有抽象方法,那么这个类就是抽象类,但抽象类中不一定都是抽象方法,可以有正常方法(非抽象)
3、特点:
1、抽象类不可以创建对象
2、抽象类的子类必须重写父类中的抽象方法,否则子类必须也是抽象类(因为会继承父类中的抽象方法)
4、作用:
通过抽象类可以强制的要求子类中必须有哪些方法,规范子类的动作
5、抽象类是不允许用final修饰的
抽象类的定义目的是类不允许直接实例化,必须被继承重写。
而final修饰符的概念正好相反,final修饰的类是不允许被继承的,只能被new实例化。
因此抽象类和final是矛盾的。
2、接口
1、特点:
- 接口实际上是一种特殊的抽象类
- 接口中所有的方法都是抽象方法,可以参略掉abstract,不可以有正常的方法
- 接口使用interface来声明,不再是类了
- 接口中所有的内容(包括方法)都是公开的,公共的,所以public和abstract都可以省略
- 能继承接口的只能是接口
- 接口和类只能是实现关系 implements
- 接口中所有的变量都是全局,静态常量
- 如果类实现接口,那么类一定要实现(重写)接口中的所有抽象方法,重写成非抽象的
- 除非类是抽象类,那么不用全部实现,因为抽象类中允许有抽象方法的存在!
- 接口只有两部分组成:全局常量、抽象方法
2、接口同样具有多态性
接口可以把很多不相干的内容进行整合(多态),比如熊猫、金子都是值钱的东西,但是它们本身不是一类东西
类只能单继承,一个类只能继承一个父类,实现多个接口
接口支持多实现,一个类可以实现多个接口
3、接口与接口的关系:多继承(一个接口可以同时继承多个接口)
-
类和类的关系:单继承
-
类和接口的关系:多实现
-
接口和接口的关系:多继承
当继承与实现都存在的时候先继承再实现
4、总结:
接口:就是去定义功能
实现类:必须实现接口中的功能
抽象类:搞定接口中的一部分东西
3、对比一下抽象类与接口
4、 举例:
父接口中的抽象方法就是规则,为什么呢?因为规范返回值、参数类型、方法名
public interface Inter {
//抽象方法没有方法体。
public abstract int show(); //规则1
void print(int a); //规则2
}
//类实现接口
public class Imp implements Inter {
public int show() { //遵循了规则1 重写
//...任意代码
}
public void print(int a) { //遵循了规则2 重写
//...任意代码
}
}
抽象类:不能创建对象的类(不能new),与普通类的唯一区别是可以用抽象方法。
子类可以继承抽象类,但必须重写抽象方法。
abstract 定义一个抽象类。
public abstract class BaseCase {
public BaseCase() {}
public abstract void info();
public void getData() {
System.out.println("getData...");
}
}
标签:Java,变量,子类,接口,抽象类,父类,方法,三大
From: https://blog.csdn.net/weixin_40772077/article/details/136736769