java类和对象
面向对象
- java是一项面向对象的编程语言。
- 对象是现实 word中的物体,比如:人,狗,汽车,电脑等。(对象是真实世界中物体在人脑中的映像, 包括实体对象和逻辑对象 )
- 对象的基本结构:属性(属性是描述对象特征的特征,就是类中的变量)
- 对象的基本行为:方法(方法是描述对象行为的特征, 就是类中的方法[表示类具体化后可以做什么])
- 对象的基本特征:属性和方法(重中之重)
- 对象是现实 word中的物体,比如:人,狗,汽车,电脑等。(对象是真实世界中物体在人脑中的映像, 包括实体对象和逻辑对象 )
进行对象抽象
抽象:就是说在思想上把对象或现象之间的共同本质取出来而舍去别的个别非样本属性的思维方法。
- 也就是说吧一系列相同或类似的实体对象的特点抽取出来,采用一个统一的表达方式来表示。
- 举个例子:
- 现在的对象是学生。
- 找出学生这一对象的属性:
- 举个例子:
类
- 把抽象出来的对象使用Java表示出来,那就是类class。
- java中的对象是在java中一个类的实例化。
通俗的讲:类是一系列具有相同行为和特征的对象的集合。
对象是类的具体化,是类的实例化。
类是对象的模板。
类的定义:
举个例子:
- 如果我们要研究的实体是学生这个群体,那么就可以创建一个类来表示学生这个群体。
- 那什么是类的实例化那?:我们创建学生这个类的目的就是为了更高效的表示一个学生,通过类来表示实体中的一个对象这就是类的实例化。
学生类的定义:
- 类的定义需要定义类的属性和方法。
- 属性:学生的属性,如:姓名,年龄,性别,学号等。
- 方法:学生的行为,例如:吃饭,睡觉,学习,运动等。
- 这两个可以说成静态属性和动态属性。静态属性:姓名,年龄,性别,学号等。动态属性:吃饭,睡觉,学习,运动等。
学生类的定义:
public class Student{
// 属性:
姓名;
年龄;
性别;
学号;
// 方法:
吃饭;
睡觉;
学习;
运动;
}
方法的定义
方法:方法就是一个代码块,用来执行特定的操作。在代码中当方法被调用时(可以理解成:当调用时,就是把方法中的代码放到了被调用处),方法就会执行,通常方法都会有返回值意思是方法执行之后的结果,可以没有返回值。
方法的定义:
修饰符 返回值类型 方法名(参数列表){
// 方法体
return 返回值;
}
若没有返回值,则返回值为void,表示没有返回值.
为了执行类的特定的行为,需要给类添加方法。因为有些属性是无法赋值,而是需要通过方法来表示。
属性的定义
属性:属性是描述对象特征的特征,就是类中的变量。
属性的定义:
修饰符 数据类型 属性名;
构造方法
构造方法:
类有一个特殊的成员方法叫做构造方法,它的作用是创建对象并初始化成员变量.
- 构造方法定义规则
java中的构造方法必须与该类具有相同的名字,并且没有方法返回值(包括没有void)。
另外,构造方法一般都应用public修饰符,这样才能在程序任意位置创建类的实例.
构造方法的定义:
修饰符 返回值类型 构造方法名(参数列表){
// 方法体
return 返回值;
}
注意: 每个类至少要有一个构造方法,如果不写一个构造方法,java语言将提供一个默认的该构造方法没有参数,而且方法体为空.
注意:如果一个类中已经定义了结构方法则系统不在提供默认的构造方法。
代码示例:通过学生这个实例。
// 创建一个学生类
public class Student {
// 属性:
// 定义属性
String name;
int age;
String sex;
String id;
// 方法:
// 定义方法
public void study() {
System.out.println("学习!");
}
public void eat() {
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
public void play() {
System.out.println("运动!");
}
public static void main(String[] args) {
// 创建两个对象
Student s1 = new Student();
Student s2 = new Student();
System.out.println("第一个学生对象:");
s1.name = "张三";
s1.age = 18;
s1.sex = "男";
s1.id = "2019001";
System.out.println("姓名:" + s1.name + ",年龄:" + s1.age + ",性别:" + s1.sex + ",学号:" + s1.id);
System.out.println("第二个学生对象:");
s2.name = "李四";
s2.age = 19;
s2.sex = "女";
s2.id = "2019002";
System.out.println("姓名:" + s2.name + ",年龄:" + s2.age + ",性别:" + s2.sex + ",学号:" + s2.id);
// 调用方法
s1.study();
s1.eat();
s1.sleep();
s1.play();
}
}
上面是类的定义,就是繁殖学生的模板
该类中存在一个无返回值的构造方法,用来初始化学生
下面就是具体的学生, 即实例化,就是创建对象.
- 创建对象其本质就是创建一个XXX类型的变量,然后调用构造方法,初始化对象.
- 基本的语法格式:
Student s = new Student();
-
通过new关键字创建对象,然后调用构造方法,初始化对象.
-
创建完对象之后,就可以进行一下操作来给类的属性赋值:
当然例子中的方法也是可以的。
s.setName("张三");
s.setAge(18);
s.setGender("男");
例子加上构造方法
public class Student{
String name;
int age;
String sex;
int id;
// 无参数的构造方法
public Student() {
// 这里可以初始化属性
// 例如:this.name = "张三";
}
// 有参数的构造方法
public Student(String name, int age, String sex, int id) {
this.name = name;
this.age = age;
this.sex = sex;
this.id = id;
// 这里的初始化属性的初始值是null0
}
// 上面的两个构造方法就是对对象的初始化,
// 也就是创建对象的时候,需要传递的参数
public void study(){
System.out.println("学习");
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void play(){
System.out.println("运动");
}
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.name + s1.age);
}
}
代码中this
关键子是引用当前对象,所以this.name
就是引用当前对象的name属性。
- 什么是当前对象那:在执行代码的对象实例。
- 引用:引用就是把一个对象赋值给另一个对象。
如果用构造方法来给类初始化成:姓名:张三,年龄:18,性别:男,学号:2019001,那么构造方法可以写成:
public class Student{
String name;
int age;
String sex;
int id;
// 构造方法
// 给属性只一个初始值
public Student (){
this.name = "张三";
this.age = 18;
this.sex = "男";
this.id = 2019001;
}
public void study(){
System.out.println("学习!");
}
public void eat(){
System.out.println("吃饭!");
}
public void sleep(){
System.out.println("睡觉!");
}
public void play(){
System.out.println("运动!");
}
public static void main(String[] args) {
Student s2 = new Student();
System.out.println("姓名:" + s2.name + "年龄:" + s2.age);
System.out.println("性别:" + s2.sex + "学号" + s2.id);
}
}
面向对象三大特点
1.封装
封装:将对象内部的数据与对外部隐藏,对外部提供接口,对外部隐藏内部实现细节。
- 封装是Java面向对象的特点的表现,分装是一种信息隐蔽技术。
- 封装有两个含义:
- 把对象的全部属性和全部服务结合在一起,形成不可分割的独立单位。
- 尽可能隐藏对象的内部结构。
- 简单的说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们的这个东西的内部结构了。
类的封装是一种保护类属性和方法不被为不代码直接访问的机制。
封装的功能:
- 隐藏对象的实现细节
- 迫使用户使用一个界面访问数据
- 使代码更好维护,方便调试
2.继承
继承:如果一个对象A继承自另一个对象B,就把这个A称为“B的子对象”,而把B称为“A的父对象”。继承可以使得子对象有父对象的各种属性和方法,而不需要再次编写相同的代码。在令子对象继承父对象的同时,可以重新定义某些属性,并重写某些方法,即覆盖父对象的原有属性和方法。
3.多态
多态:同一行为的多种不同表达,或者统一行为的多种不同实现。
举一个简单的例子:比如我们说“笔”这个对象,它就有很多不同的表达或实现,比如有钢笔,铅笔,圆珠笔等等。那么我说“请给我一支笔”,你给我钢笔,铅笔或者圆珠笔都可以,这里的“笔”这个对象就具备多态。
就是说一个对象在不同的前提下有不同的表现。
代码中如何提现这些特点那?
类的封装
// 类的封装
public class Student{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
// 验证年龄是否合法
if(age >= 0 && age <= 120){
this.age = age;
}else{
System.out.println("年龄不合法");
}
}
public int getAge(){
return this.age;
}
}
public class Main {
public static void main(String[] args){
Student s = new Student();
s.setName("张三");
s.setAge(18);
System.out.println(s.getName() + " " + s.getAge());
Student s1 = new Student();
s1.setName("李四");
s1.setAge(200);
System.out.println(s1.getName() + " " + s1.getAge());
}
}
类的封装:
priavte
:私有属性,只能在类的内部访问,不能在类的外部直接访问。- 这里的外部是类的外部,即在当前类之外的代码。包括:
- 其他类:任何在当前类之外的类中的代码都被视为外部代码。
- 外部方法:类的实例方法(非静态方法)和静态方法之外的代码。
- 这里的外部是类的外部,即在当前类之外的代码。包括:
set 和 get
:通过set 和 get 方法来设置和获取属性的值。set
:设置属性的值。get
:获取属性的值。
set
和get
方法通常是为了提供对private
属性间接访问:
- Getter方法(通常命名为
get
+属性名)用于获取private
属性的值。 - Setter方法(通常命名为
set
+属性名)用于设置private
属性的值。
类的继承
就是在上面的基础上,再定义一个子类,子类继承父类,子类可以继承父类的属性和方法,子类还可以定义自己的属性和方法。
3. 基本语法:
public class 子类 extends 父类{
//子类可以继承父类的属性和方法
}
- 示例:
public class Student1 extends Student {
public static void main(String[] args) {
Student1 s1 = new Student1();
s1.setName("张三");
s1.setAge(18);
System.out.println(s1.getName() + " " + s1.getAge());
}
}
继承:
在代码中,Student1
类通过extends
关键字继承自Student
类。
- 这意味着Student1
类可以使用Student类中的所有属性和方法,包括name
和age
,setName
和setAge
方法。这就体现了类的继承。
- 注意:在创建继类之前,首先要创建一个具有共性的一般类,即父类,超类,基类。
之后在子类中可以添加自己特有的属性和方法。也可以覆盖父类的方法。(要注意:覆盖方法时,子类方法必须与父类方法一致,包括参数和返回值类型。)
例如:再创建一个Student2
类,继承了Studnet
类,并添加了score
属性和setScore
方法。
public class Student {
private String name;
private int age;
// 构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 获取姓名
public String getName() {
return name;
}
// 获取年龄
public int getAge() {
return age;
}
// 父类方法
public void study() {
System.out.println(name + "正在学习");
}
}
// 子类
public class HighSchoolStudent extends Student {
private int grade;
// 构造方法
public HighSchoolStudent(String name, int age, int grade) {
super(name, age);
this.grade = grade;
}
// 重写父类方法
@Override
public void study() {
System.out.println(getName() + "正在高中学习");
}
// 新方法
public void attendExam() {
System.out.println(getName() + "正在参加高中期末考试");
}
}
// 测试类
public class Main {
public static void main(String[] args) {
HighSchoolStudent highSchoolStudent = new HighSchoolStudent("张三", 16, 11);
// 调用继承自父类的方法
System.out.println(highSchoolStudent.getName());
System.out.println(highSchoolStudent.getAge());
highSchoolStudent.study(); // 调用重写的方法
// 调用子类自己的方法
highSchoolStudent.attendExam();
}
}
类的多态
java中,多态是一种允许对象通过同一个接口调用不同的对线的行为机制。
- 多态主要是通过继承来实现的:多态有两种主要形式:
- 方法重写:子类可以重写父类的方法,已提供与父类不同的行为。这种形式通过在子类中定义与父类相同签名的方法来实现的。当使用父类的引用调用方法时,实际调用的是子类中重写的方法,这是多态最常见的形式。
- 相同签名的方法:方法的名称和参数列表(即参数的数量,类型和顺序)完全相同的方法。子类中的方法与父类中的方法具有形同的签名时,子类可以重写父类中的方法。这样,子类可以提供与父类不同的方法实现,而调用时,实际调用的是子类中的方法。
- 方法重载:虽然这与多态不完全相同,但是方法重载是通过在同一类中定义多个同名参数不同的方法来实现的。这些方法在编译时通过参数列表的不同进行区分。
// 父类
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
// 子类1
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("狗发出汪汪声");
}
}
// 子类2
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("猫发出喵喵声");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog(); // 创建 Dog 对象,但是用 Animal 类型引用它
Animal animal2 = new Cat(); // 创建 Cat 对象,但是用 Animal 类型引用它
animal1.makeSound(); // 调用的是 Dog 类中重写的 makeSound() 方法
animal2.makeSound(); // 调用的是 Cat 类中重写的 makeSound() 方法
}
}
在上面的例子中Animal
是父类,Dog
和Cat
是它的两个子类。makeSound
方法在父类中定义,在子类中被重写。在Main
类的main
方法中,我们创建了一个Dog
对象和一个Cat
对象,并将它们都用Animal
类型的引用来引用。然后调用makeSound
方法,我们可以看到输出了不同的声音,这展示了类的多态。
@Override
:java中的注释,用于告诉编辑器,当前的方法是在子类中重写了父类的方法。
包
包:在java中,包是类,接口或其他包的集合,包主要用来将类组织起来成为组,从而对类进行管理。
- 包能干什么:
- 包允许你将包含类的代码的文件组织起来,易于查找和使用适当的类。
- 包不止是包含类和接口,还能够包含其他包,形成层次的包空间。
- 它有助于避免命名冲突。当使用很多类时,确保类和方法名称的唯一性是非常困难的。包能够形成层次命名空间,缩小了名称冲突的可能性,易于管理名称。
- 为便于管理数目众多的类,Java语言引入了“包”的概念,可以说是对定义的Java类进行“分组”,将多个功能相关的类定义到一个“包”中,以解决命名冲突,引用不方便,安全性等问题。
简而言之:从逻辑上讲,包是一组相关类的集合;从物理上讲,同包即同目录。
JDK中常用的包
java.lang
包:包含一些Java语言的核心类,包含构成Java语言设计基础的类。
- 此包中定义的最重要的一个类是
Object
类,代表类层次的根,Java是一个单根系统,最终的根就是Object
类。 - 此包中比较常用的类:
- Math——封装最常用的数学方法,如正弦,余弦和平方根。
- Strign, StringBuffer——封装常用的字符串操作
- 平时不必导入该包,该Java包通常已经被导入。
java.awt
:包含了构成抽象窗口工具集的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。javax.swing
:完全Java版的图形用户界面(GUI)解决方案,提供了很多完备的组件,可以应对复杂的桌面系统构建。java.net
:包含执行与网络相关的操作的类,如URL,Socket,ServerSocket等。java.util
:包含一些实用工具类,如定义系统特性,使用与日期日历相关的方法。还有重要的集合框架。