Java面向对象-类
1.概念
对象就是现实中的事物,每种事物都有自己的属性和行为。面向对象思想就是在程序设计过程中,参照现实中的事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。
面向对象的三大特征:封装、继承、多态。
封装:保护内部操作不被破坏
继承:在原本的基础上进行扩冲
多态:在一个指定范围内进行概念的转换
类
类:是一组相关属性和行为的集合。表示的是一个共性的产物,类中定义的是属性和行为。
属性:该事物的状态信息。
行为:就是该事物能做什么(方法)
类用来描述现实社会中的一类事物,对象该类具体事物。
例:动物类
属性:体重、年龄、名字。行为:吃饭、睡觉、排泄。
对象——万物皆对象
对象:一类事物的具体体现,表示一个独立的个体。对象就是类一个实例,所以必然具备该类的属性和行为。
例:一只命臭猪的猪
属性:臭猪、3岁、150斤 。行为:进食、酣睡、拉💩
类和对象的关系
简而言之类是对象的模版,对象是类的实例。类只有通过对象才能使用,在开发中先产生类才有对象。
类的组成
类的组成:成员变量 成员方法 构造方法
编写类的标准格式
成员变量
构造方法
成员方法
注意:在构造类时要生成构造方法
构造方法
构造方法的作用:
- 是创建对象的时候初始化成员变量使用的
- 注意:
- 当你生成了有参构造,就一定要生成无参构造
- 但你生成了无参构造,不一定需要生成有参构造
类与对象的定义和使用
类的定义
public Class 类名{
//属性(变量):
//行为(方法):
}
属性的定义
语法:修饰符 数据类型 属性名;
//年龄属性
public int age();
//名字属性
public String name();
//身高属性
public double height;
构造方法
//构造方法: 给对象进行初始化
//格式:
// A:方法名与类名相同
// B:没有返回值,连void都没有
// C:没有具体的返回值
//构造方法他是在创建对象的时候自动调用
//无参数构造
public 类名() {
System.out.println("这是无参构造方法...");
}
//生成有参构造方法
public 类名(String name, int age) {
this.name = name;
this.age = age;
}
行为的定义
行为在Java中被称为方法,c语言和js、python称为函数
语法:修饰符 返回值类型方法的名字(参数){}
public void say(){
}
public void eat(){
}
示例:定义一个person类
//一个java文件中可以写多个类
//但是一个java中文中只能写一个public修饰的类,并且public修饰的类名要和文件名一致.
//规范:只写一个类
//class Person类名
/*只能有一个public类*/
public class Person{
//定义属性
String name;
int age;
//生成无参数构造
public Person() {
System.out.println("这是无参构造方法...");
}
//生成有参构造方法
public person(String name, int age) {
this.name = name;
this.age = age;
}
//定义行为输出姓名和年龄
public void tell(){
System.out.println("姓名"+name+"年龄"+age)
}
}
/*猫咪类*/
class Cat{
}
/*狗勾类*/
class Dog{
}
定义类的时候给出默认值
public class Person {
//属性
//修饰符 数据类型 属性名;
//属性的名字 首字母小写,后面驼峰
//年龄属性
public int age;
//身高属性
public double height=50;
//名字属性
public String name;
//地址属性
public String address="中国";
//性别
public String sex="男";
//行为
}
类定义完成后并不能直接使用,需要实例化对象才能使用。
对象的声名
我们想要运行java代码,入口类,这个入口类必须有一个main方法
类名称 对象名称 = new 类名称();
/*格式二:先声名对象,然后实例化对象:*/
类名称 对象名称 = null;
对象名称 = new 类名称
例:
对象可以有多个
public class TestDemo{
//入口类
public static void main(String[] args){
//实例化对象1
Person p= new Person;
p.name="CC"/*操作属性类容给属性赋值,当
给属性赋值时会覆盖旧的值*/
p.age=20
//调用类中的方法
p.tell()
//实例化对象2
Person p2 = new Person
}
}
我们在编写类的时候没有初始化值,系统会自动给出默认值byte short int long 默认是0,float double 是0.0 boolean是false char 是’ ',引用数据类型默认值是null
一个对象堆内存图
两个对象堆内存图
三个对象堆内存图
方法重载
定义:在一个类中有两个方法,他们具有相同的名字,但有不同的参数列表。
也就是说,方法名可以相同,参数列表不同。
class Number2{
//我们在实现各种整数相加的时候 方法名不一样的
//但是方法的命名要遵循见名知意
//怎么办?
//针对这种情况,方法的功能相同,参数列表不同,为了见名知意
//Java就允许这些相同功能,但是不同参数的方法使用同一个名字 专业名词:方法重载
//在一个类中,方法名相同,参数列表不同(参数的类型或者个数不同) 与返回值没有关系
//1.两个整数相加 返回结果
public int sum(int a,int b) {
return a+b;
}
public long sum(long a,int b) {
return a+b;
}
// public long sum(int a,int b) {
// return a+b;
// }
//错误的,和方法的参数的名字是没有关系的,因为调用方法是靠方法的参数个数和类型来确定一个方法的
// public int sum(int b,int a) {
//
// }
//2.三个整数相加 返回结果
public int sum(int a,int b,int c) {
return a+b+c;
}
}
public class NumberDemo02 {
public static void main(String[] args) {
Number2 number=new Number2();
System.out.println(number.sum(1, 2));
System.out.println(number.sum(1l, 2));
System.out.println(number.sum(1, 2,3));
}
}
构造方法的重载
我们一直在使用构造方法,但是之前我们没有定义构造方法,哪里来的呢?
注意事项:
A:如果我们没有给出构造方法,系统会自动提供一个无参的构造方法
B:如果我们给出了构造方法,系统将不会再自动提供无参的构造方法
注意:这个时候,大家如果写的是有参数的构造函数,就必须自己给出无参的构造函数 建议永远给出无参构造函数