📜个人简介 |
⭐️个人主页:摸鱼の文酱博客主页🙋♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
💛前言:
(文章目录带⭐️为需要重点掌握的)
准备好了吗? 我们要开始了!
面向对象--类和类的成员
)
👓认识面向对象
首先,上正菜🍔 前,先让我们来点开胃小菜🍟:先来认识一下面向对象是什么
上面是比较官方的对二者区别的阐述,但是我相信大家现在都有一种"听君一席话,如听一席话"的感觉.
还是没有理解.没关系.我举一个实际的例子来帮助大家理解上述内容:
一个经典的示例:把大象装进冰箱中
OK,看完上述例子,相信各位聪明的小伙伴已经初步认识了什么是面向对象.😎
我们还要理解一下面向对象的两个要素:类和对象
很多小伙伴在学习java过程中对类和对象的理解不够,导致对后面的学习造成影响.所以我们需要先来关注一下类和对象:
👓理解类和对象
❓那么到底应该怎么理解这两个概念呢?
类的实例化
语法格式
// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
示例:
class Person {
public int age;//属性
public String name;
public String sex;
public void eat() {//方法
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
}
public class 类和对象 {
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
//产生多个对象
Person person2 = new Person();
Person person3 = new Person();
}
}
class Person{}
像这样,其实就已经是一个person类了.但是这个类内部什么都没有,只是一个空壳,没有灵魂
我们要对他进行设计,从而让它有一定作用.
在这五类之中,最为基础,重要的就是:属性(Field 也叫做变量,也有叫字段或域的), (成员)方法(Method).
🌟 1.属性(变量)
💙变量分类:
🌀局部变量
❄️声明格式
❄️特点
示例:
class Person {
public String name;
public void eat() {//方法
int a = 10;
int b;
System.out.println("吃饭!");
}
}
❄️小结
🌀成员变量
声明格式:
根据声明时有无"static"修饰,还可以分为:普通成员变量(不用static修饰)和静态成员变量
接下来会根据普通成员变量(也叫做实例变量)和静态成员变量(也叫做类变量)的相同点和不同点来介绍.
▶️相同点
示例:
class Person {
private static String name;//静态成员变量
public int age;//普通成员变量
}
class Animal{
public String a_name;
}
public class 类和对象 {
public static void main(String[] args) {
Animal animal = new Animal();
animal.age //age是Person类中定义的,只能被Person类的对象调用
}
}
▶️不同点
1️⃣.声明方式不同
2️⃣.调用方式不同
class Person {
public static int age;//静态成员变量
public String name;//普通成员变量
}
public class 类和对象 {
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
System.out.println(person.sex);//对象.实例变量
System.out.println(person.age);//对象.类变量
System.out.println(Person.age);//类.类变量
System.out.println(Person.name);//不能直接类.实例变量
}
}
3️⃣.生命周期不同
4️⃣.与对象关系不同
示例:
class Person {
public static String name;//静态成员变量
public int age;//普通成员变量
public String sex;
}
public class 类和对象 {
public static void main(String[] args) {
Person person1 = new Person();//通过new实例化对象
person1.name = "张三";
person1.age=10;
System.out.println(person1.name);
System.out.println(person1.age);
System.out.println("=========================================");
Person person2 = new Person();
System.out.println(person2.name);
System.out.println(person2.age);
}
}
5️⃣.存储空间不同
💙匿名对象
💙关于对象数组
class Student{
int number;//学号
int state = 1;//年级
int score;//成绩
}
public class 对象数组 {
public static void main(String[] args) {
Student[] stus = new Student[5];
stus[0] = new Student();
System.out.println(stus[0].state);//1
System.out.println(stus[1]);//null
System.out.println(stus[1].number);//报错,此时的stus[1]还未实例化对象,为null
stus[1] = new Student();
System.out.println(stus[1].number);//0
}
}
⭐️成员变量和局部变量的区别
💙小结
🌟 2.方法
💙什么是方法
💙方法的声明格式
根据声明时有无"static"修饰,可以将方法分为普通成员方法(不用static修饰)和静态成员方法
💙方法的分类
无返回值 | 有返回值 | |
---|---|---|
无形参 | void 方法名() {} | 返回值的类型 方法名() {} |
有形参 | void 方法名(形参列表) | 返回值的类型 方法名(形参列表) {} |
💙方法的调用
⭐️方法的重载
🌀重载的概念
🌀重载的特点
示例:
public class OverLoading {
public void max(int a, int b) {
// 含有两个int类型参数的方法
System.out.println(a > b ? a : b);
}
public void max(double a, double b) {
// 含有两个double类型参数的方法
System.out.println(a > b ? a : b);
}
public void max(double a, double b, int c) {
// 含有两个double类型参数和一个int类型参数的方法
double max = (double) (a > b ? a : b);
System.out.println(c > max ? c : max);
}
public static void main(String[] args) {
OverLoading ol = new OverLoading();
System.out.println("1 与 5 比较,较大的是:");
ol.max(1, 5);
System.out.println("5.205 与 5.8 比较,较大的是:");
ol.max(5.205, 5.8);
System.out.println("2.15、0.05、58 中,较大的是:");
ol.max(2.15, 0.05, 58);
}
}
💙可变形参的方法
//JDK 5.0以前: 采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0: 采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String…books);
class TestOverload{
public void test(String[] msg){
System.out.println("含字符串数组参数的test方法 ");
}
public void test1(String ... books){
System.out.println("****形参长度可变的test1方法****");
}
public void test1(String book){
System.out.println("****与可变形参方法构成重载的test1方法****");
}
}
public class 可变个数形参的方法 {
public static void main(String[] args){
TestOverload to = new TestOverload();
to.test(new String[]{"aa"});//将执行第一个test方法
to.test1("aa" , "bb");//下面将执行第一个test1方法
to.test1("a");//下面将执行第二个test1方法
to.test1();//下面将执行第一个test1方法
}
}
⭐️方法参数的值传递机制
⭐️方法的参数传递
public static void main(String[] args) {
int x = 5;
System.out.println("修改之前x = " + x);// 5
change(x);// x是实参
System.out.println("修改之后x = " + x);// 5
}
public static void change(int x) {
System.out.println("change:修改之前x = " + x);
x = 3;
System.out.println("change:修改之后x = " + x);
}
public static void main(String[] args) {
Person obj = new Person();
obj.age = 5;
System.out.println("修改之前age = " + obj.age);// 5
// x是实参
change(obj);
System.out.println("修改之后age = " + obj.age);// 3
}
public static void change(Person obj) {
System.out.println("change:修改之前age = " + obj.age);
obj.age = 3;
System.out.println("change:修改之后age = " + obj.age);
}
class Person{
int age;
}
public static void main(String[] args) {
Person obj = new Person();
obj.age = 5;
System.out.println("修改之前age = " + obj.age);// 5
// x是实参
change(obj);
System.out.println("修改之后age = " + obj.age);// 5
}
public static void change(Person obj) {
obj = new Person();
System.out.println("change:修改之前age = " + obj.age);
obj.age = 3;
System.out.println("change:修改之后age = " + obj.age);
}
class Person{
int age;
}
💙方法的递归
1️⃣.方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执
行无须循环控制。
2️⃣递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死
循环
⭐️方法的重写
🌀定义:
💙小结
🌟 3.构造器
💙 语法格式:
⭐️ 构造器的特征
💙 构造器的作用
💙 构造器重载
public class Person { //构造器重载举例
private String name;
private int age;
private Date birthDate;
public Person(String n, int a, Date d) {
name = n;
age = a;
birthDate = d;
}
public Person(String n, int a) {
name = n;
age = a;
}
public Person(String n, Date d) {
name = n;
birthDate = d;
}
public Person(String n) {
name = n;
age = 30;
}
}
代码示例:
class Person {
private String name;//实例成员变量
private int age;
private String sex;
//默认构造函数 构造对象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//带有3个参数的构造函数
public Person(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main{
public static void main(String[] args) {
Person p1 = new Person();//调用不带参数的构造函数 如果程序没有提供会调用不带参数的构造函数
p1.show();
Person p2 = new Person("zhangfei",80,"男");//调用带有3个参数的构造函数
p2.show();
}
}
💙小结
⛽️属性赋值过程:
截止到目前,我们讲到了很多位置都可以对类的属性赋值。现总结这几个位置,并指明赋值的先后顺序。
🌟 4.代码块
前两种方式前面已经学习过了, 接下来我们介绍第三种方式, 使用代码块初始化
💙什么是代码块
💙 分类
🌀构造块
示例:
class Person{
private String name;//实例成员变量
private int age;
private String sex;
public Person() {
System.out.println("I am Person init()!");
}
//实例代码块
{
this.name = "bit";
this.age = 12;
this.sex = "man";
System.out.println("I am instance init()!");
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.show();
}
}
🌀静态代码块
示例:
class Person{
private String name;//实例成员变量
private int age;
private String sex;
private static int count = 0;//静态成员变量 由类共享数据 方法区
public Person(){
System.out.println("I am Person init()!");
}
//实例代码块
{
this.name = "bit";
this.age = 12;
this.sex = "man";
System.out.println("I am instance init()!");
}
//静态代码块
static {
count = 10;//只能访问静态数据成员
System.out.println("I am static init()!");
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class 类和对象 {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();//静态代码块是否还会被执行?
}
}
🌀非静态代码块
public class 类和对象 {
public static void main(String[] args) {
{ //直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
💙小结
🌟 5.内部类
💙什么是内部类
💙内部类分类
🌀成员内部类
❄️作为类的成员的角色
示例:
class Outer {
private int s;
public class Inner {
public void mb() {
s = 100;
System.out.println("在内部类Inner中s=" + s);
}
}
public void ma() {
Inner i = new Inner();
i.mb();
}
}
public class InnerTest {
public static void main(String args[]) {
Outer o = new Outer();
o.ma();
}
}
❄️作为类的角色
示例:
public class Outer {
private int s = 111;
public class Inner {
private int s = 222;
public void mb(int s) {
System.out.println(s); // 局部变量s
System.out.println(this.s); // 内部类对象的属性s
System.out.println(Outer.this.s); // 外部类对象属性s
}
}
public static void main(String args[]) {
Outer a = new Outer();
Outer.Inner b = a.new Inner();
b.mb(333);
}
}
❗️注意
🌀局部内部类
❄️声明局部内部类
class 外部类{
方法(){
class 局部内部类{
}
}
{
class 局部内部类{
}
}
}
❄️使用局部内部类
❄️局部内部类的特点
🌀匿名内部类
❄️声明匿名内部类
new 父类构造器(实参列表) |实现接口(){
//匿名内部类的类体部分
}
❄️匿名内部类的特点
💙小结
本篇主要介绍类和类的成员,其中有部分会涉及到后面的继承,关键字等的知识,会在后续更新的博客中具体讲解,还请大家继续关注.
如果本篇文章中有错误的地方还请在评论区指出,感谢感谢