java中类和对象

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的学习中,这节内容相当重要,还是要不断地练习使用,总的来说,学编程就是要不断地练习和总结,把知识要变成自己的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值