java中 类和对象
java是一个面向对象的语言! C++也是 但go不是
OOP语言的三大特征:继承 封装 多态
OOP:Object-Oriented-… 面向对象编程
1.对象的初步认识
面向对象:处理问题规模较大的
面向过程:处理小的问题
2.类的实例化
类:是一个模板 高配的结构体 自定义的类型 抽象的东西
对象:是一个实体
// 创建类
class <class_name>{
field;//成员属性
method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
类中的元素称为:成员属性。类中的函数称为:成员方法。
class 类名 { 属性 : 定义咋类的内部 在方法的外部
类体; 行为:方法。
}
属性(成员变量):
1.实例数据成员 (一个类可以实例化多个对象 new)
2.静态数据成员 类名.静态数据成员
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 Main{
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
person.eat();//成员方法调用需要通过对象的引用调用
person.sleep();
//产生对象 实例化对象
Person person2 = new Person();
Person person3 = new Person();
}
}
输出结果为:
吃饭!
睡觉!
实例化一个对象之后 如何访问对象的数据成员?通过点号
Person per = new Person();
per是Person的引用(地址)
per.数据成员。
per.方法
方法:
1.实例成员方法 (per.数据成员)
2.静态成员方法 (Person.数据成员)
3.类的成员
动态的类的成员放在堆上 静态的放在方法区;
在静态方法内部 不允许访问实例数据成员 不允许调用实例的成员方法.
不依赖对象。
静态的数据成员和方法 只需要通过类名进行访问或者调用。
静态的数据类型和方法不依赖于对象
如果类当中的数据成员,没有初始化的时候 默认值为对应的0值。
如果是引用类型:null 如果是简单类型 那么就是0
char \u0000
boolean false
4.封装
4.1public/private 访问修饰限定符
体现封装性:private 被 private所修饰的属性或者方法 均不能在类外进行访问或调用
直接使用 public
class Person {
public String name = "张三";
public int age = 18;
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println("我叫" + person.name + ", 今年" + person.age + "岁");
}
}
// 执行结果
我叫张三, 今年18岁
- 这样的代码导致类的使用者(main方法的代码)必须要了解 Person 类内部的实现, 才能够使用这个类. 学习成本较高
- 一旦类的实现者修改了代码(例如把 name 改成 myName), 那么类的使用者就需要大规模的修改自己的代码, 维 护成本较高.
范例:使用 private 封装属性, 并提供 public 方法供类的调用者使用
class Person {
private String name = "张三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
// 执行结果
我叫张三, 今年18岁
- 此时字段已经使用 private 来修饰. 类的调用者(main方法中)不能直接使用. 而需要借助 show 方法. 此时类的使
用者就不必了解 Person 类的实现细节. - 同时如果类的实现者修改了字段的名字, 类的调用者不需要做出任何修改(类的调用者根本访问不到 name, age 这样的字段).
4.2 getter和setter方法
当我们使用 private 来修饰字段的时候, 就无法直接使用这个字段了;
此时如果需要获取或者修改这个 private 属性, 就需要使用 getter / setter 方法
代码示例:
class Person {
private String name;//实例成员变量
private int age;
public void setName(String name){
//name = name;//不能这样写
this.name = name;//this引用,表示调用该方法的对象
}
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public static void main(String[] args) {
Person person = new Person();
person.setName("caocao");
String name = person.getName();
System.out.println(name);
person.show();
}
// 运行结果
caocao
name: caocao age: 0
- getName 即为 getter 方法, 表示获取这个成员的值.
- setName 即为 setter 方法, 表示设置这个成员的值.
- 当set方法的形参名字和类中的成员属性的名字一样的时候,如果不使用this, 相当于自赋值. this 表示当前实例 的引用.
- 不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法.
- 在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在VSCode 中可以使用鼠标右键 菜单 -> 源代码操作 中自动生成 setter / getter 方法.
5. 构造方法
提供构造方法
作用:用来产生对象
方法名和类名相同 没有返回值
如果程序没有提供任何的构造方法 那么编译器会默认生成一个不带有参数的构造方法
生成一个对象共有几步?2步
1.给对象分配内存
2.调用合适的构造方法(构造方法不止一个)
默认的不带有参数的构造方法 只有一种情况下才会产生 (什么构造方法都没有)
this.成员变量
this.成员方法
this();//调用构造方法
构造方法可以发生重载 函数名相同 参数不同(类型 个数)返回值不要求
this调用其他方法时 必须放在第一行,只能调用一个构造方法
6.代码块
本地代码块 方法内部 但不常用
实例代码块 //作用:初始化实例的数据成员 优先于构造方法执行
静态代码块 优先于实例代码块 只执行一次
静态的先执行–>实例的后执行–>构造方法最后执行 跟写的顺序没关系
静态代码块 和 静态数据成员 跟写的顺序有关
7.toString方法
class Person {
private String name;
private int age;
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println("name:"+name+" " + "age:"+age);
}
//重写Object的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("caocao",19);
person.show();
System.out.println(person);
}
}
// 执行结果
name:caocao age:19
Person{name='caocao', age=19}
- toString 方法会在 println 的时候被自动调用.
- 将对象转成字符串这样的操作我们称为序列化.
- toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写toString 方法实现我们自己版本的转换字符串方法.
- @Override 在 Java 中称为 “注解”, 此处的 @Override 表示下面实现的 toString方法是重写了父类的方法.
- IDEA快速生成Object的toString方法快捷键:alt+f12(insert)
总结到这里就差不多了,在java的学习中,这节内容相当重要,还是要不断地练习使用,总的来说,学编程就是要不断地练习和总结,把知识要变成自己的。