类和对象
类和对象的定义方式
认识类之前我们需要知道一些知识,这样就不会让我们只知道学习而不懂用的情况了
- 什么是面向对象?
- 什么是面向过程?
- 什么是类?如何定义一个类
- 有了类之后,如何实例化一个对象?
- 有了对象之后,如何初始化对象,如何访问对象中的成员?
解答:
- 面向对象就是遇到问题时,所面对的对象。
- 面向过程就是解决问题的过程,对象之间相互交互完成的一件事情
- 类就是用来描述对象的,主要描述该对象具有哪些属性,哪些功能……
类的定义格式:
//创建类
class TeatDate{
成员变量(static静态和非静态)
成员方法(静态和非静态)
}
- 类名注意采用大驼峰定义
对象的实例化
什么是实例化?
比如狗(类)是所有狗名字的统称,当我们确定了某种狗(柯基–对象)的品种,就是实例化了对象。
- 有类类型创建对象的过程,称为类的实例化。
- 其中非静态成员变量保存在对象中或者堆中,成员方法保存在方法区中
- 通过一个类类型可以new出多个对象
- 使用 . 来访问对象中的属性和方法
成员变量和成员方法变量
成员变量和局部变量的区别
- 成员变量是在类里面,方法外面
- 局部变量只能在方法里面
- 成员变量不初始化不会发生错误,但是局部变量不初始化,会发生编译错误
this的作用
this其中一个作用是区分局部变量和成员变量
当成员变量名和局部变量名相同时,局部变量名优先,这就会导致被赋值的变量任然表示的还是局部变量
利用this之后:
this指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问的。
只不过所有的操作堆用户是透明的,即用户不需要来传递,编译器自动完成。
添加了也不会报错!
== 总结this的特性==
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在“成员方法”(包括构造方法)中使用
- 在“成员方法”中,this只能引用当前对象,不能再引用其他对象,具有final属性
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。
== 大致this的作用==
1.this.date:调用该对象的成员变量
2.this.fun():调用该对象的成员方法 - this():调用构造方法
对象的初始化
就地初始化
直接对成员变量方法赋值。
默认初始化
对象空间被申请对象,对象中包括的成员已经设置好了初始化
构造方法初始化
- 简单介绍构造方法作用:对对象中的成员进行初始化,并不负责给对象开辟空间,
- 地位:构造方法的完成,标志着成功实例化对象
- 构造方法如何写,有没有快捷键
名字必须与类名相同
没有返回类型,设置void也不行
创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
构造方法可以重载
如果用户没有自己定义构造方法,编译器会生成一份默认的构造方法,生成默认构造方法一定是无参的
一旦用户定义了,编译器便不会再生成构造方法
构造方法中,可以通过this调用其他构造方法来简化代码,切记不能形成环且this调用其他构造方法时,必须是第一条语句
利用快捷键右键->Generate->constructor->选择需要初始化的变量
以下是利用快捷键生成的构造方法:
-
如何调用:当创建new就调用构造方法
Student stu1=new Student();这个括号就是调用构造方法
-
还有this如何调用构造初始化,利用this构造方法的注意事项
注意事项:不能形成环且必须放在第一句
封装
面对对象程序三大特性:封装、继承、多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
访问限定符
java中主要通过类和访问权限来实现封装
public权限:无论在哪里都可以访问
default权限指:对于自己家族中(同一个包中)不是什么密码,对于别人来说就是隐私,什么都不写的默认权限
private权限指:只有自己知道,其他人不知道,可以利用方法来
利用快捷键右键->Generate->Getting and Setting->选择需要初始化的变量
包就相当于文件夹,类就相当于文件,但最好一个文件中只有一个类,但只能有一个public类
static成员
所有静态成员都通过类名来访问
static修饰成员变量
静态成员变量的特性
- 不属于某个具体的对象,是类的属性,是所有对象共享的,不存储在某个对象的空间中
- 既可以通过类名访问,也可以通过对象访问,但最好使用前者
- 静态的类变量存放在方法区中,不能存在对象中
- 生命周期伴随类的一生
static修饰成员方法
静态成员方法方法的特性
- 不属于某个对象,是该类专属的特性
- 最好利用类名访问
- 静态方法中只能访问静态变量或者静态方法,不能访问其他非静态的成员;但非静态方法可访问静态成员
非静态能访问静态;静态不能访问非静态 - 静态方法没有隐藏的this引用参数
- 静态方法无法重写,不能用来实现多态
static成员变量初始化
就地初始化和静态代码块初始化
其中就地初始化就是直接定义时,直接设置变量
静态初始块下面
代码块
优先级:静态代码块>实例代码块>构造方法
普通代码块
定义在方法中的代码块
{//直接使用{}定义
}
构造代码块(实例代码块)
定义在类中,方法外面的代码块(不加修饰符)。构造代码块一般用于初始化实例成员变量。
- 实例代码块只有在创建对象时才会执行
静态代码块
使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量
- 静态代码块不管生成多少个对象,其只会执行一次
内部类
内部类的由来:当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好的使用内部类。
**在java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。**内部类也是一种封装的体现。
实例内部类
1、实例内部类(依赖对象)当中不能定义静态(不依赖成员)的成员变量或者方法,可以这样理解,内部类也相当于外部类的成员类类型;
若如果一定要定义成员变量一定要加上final–>字面常量(相当于#define),就变成了固定值,不能改变
public static final int e=100;
2、如何获取实例内部类的对象
思路:先将外部类对象先创建出来,然后再创建内部类对象
第二种方法更好一些
其中Test是外部类名称,InnerTest是内部类名称
// 第一种方法:
Test.InnerTest date1=new Test().new InnerTest();
//第二种方法:
Test sc=new Test();
Test.InnerTest date2=sc.new InnerTest();
3、重名:当外部类和内部类中具有相同名称成员时,优先访问的是内部类自己。
内—>外访问: 若想再内部类中访问外部类的成员的时候,
必须:外部类的类名.this.同名成员变量
//内部类中
public void print(){
//如果要访问外部类同名成员的时候,必须:外部类名称.this.同名成员名字
System.out.println(“外部类的成员变量”+Test.this.a);
//如果外部类和内部类中具有相同名称成员时,优先访问的是内部类自己
System.out.println(“内部类的成员变量”+a);
System.out.println(b);
System.out.println©;
System.out.println(d);
System.out.println(f);
System.out.println(g);
外—>内访问:外部类中访问内部类的成员,需创建内部类的对象
public class Test {
InnerTest date3=new InnerTest(); public void methodA() { System.out.println(date3.f); }
注意事项
- 外部类中的任何成员都可以被实例内部类方法中直接访问,其中也包括静态成员。
- 普通内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
- 普通内部类对象必须在先有外部类对象前提下才能创建
- 外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象
- 内部类中,要想访问外部类中同名成员变量,必须:外部类类名.this.同名成员变量;若访问非同名成员变量,就直接输入变量名即可。
静态内部类
1、静态内部类中可以定义任何成员。
2、在静态内部类中,只能访问外部类的静态成员
内–>外:若想在静态内部类中,访问外部类的非静态成员,需要在静态内部类中实例化外部列对象
外–>内:若想在外部类中访问内部类中的成员变量,就要在外部类中实例化
3、如何获取静态内部类的对象
创建内部类对象时,不需要创建外部类对象,直接创建内部类对象
Test.InnerClass date=new Test.InnerClass();
其中Test.InnerClass()中是一体的
4、成员内部类,经过编译之后会生成独立的字节码文件,命名格式为:外部类名称$内部类名称
总结
上述就是总结,可以发现静态内部类的语法比实例化内部类少的多,因此,静态内部类使用的次数频率比较高
局部内部类
定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。不加任何修饰符。
public class Test {
int a=10;
public void method(){
int b=10;
//局部内部类:定义在方法体内部
//不能被public、static等访问限定符修饰
class InnerClass{
public void methodInnerClass(){
System.out.println(a);
System.out.println(b);
}
}
//只能在该方法体内部使用,其他位置都不能使用
InnerClass innerClass=new InnerClass();
}
public static void main(String[] args) {
Test.InnerClass innerClass=null;
}
}
== 总结==
- 局部内部类只能在所定义的方法体内部使用
- 不能被public、static等修饰符修饰
- 几乎不使用
匿名内部类
只能用一次,每次使用都要创建对象
== 总结==
对象的打印
右键–>Generate–>toString
简单介绍原理:
printly的函数:
value0f函数:
toString函数:
原理:若类中未产生toString,则编译器默认为对象地址;若类中有toString,则将打印自己对象的信息。
,直接System.out.println(类名),系统就调用写的toString,并接收返回值;