类和对象的关系
- 类:类是抽象的,是一组相关的属性和行为的集合,一个模板。
对象:对象是具体的,是客观存在的实例,是该类事物的具体体现 - 类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
- 类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的* 静态和动态属性。
- 对象是Java程序的核心,在Java程序中“万事万物皆对象”。
- JDK提供了很多类供编程人员使用,编程人员也可定义自己的类。
(1)类的理解:
1.类是用来描述现实事物的,是Java语言的最基本单位
2.类是抽象的,是由多个对象抽象想象的部分而来
3.类可以理解为一个模板,数属性和行为的集合,可以通过类的模板创建具体的对象
4.Java使用class来描述一个类
5.类的本质用来组织代码(方法归类),封装数据的(理解提高成员变量的安全性)。
(2)对象的理解:
1.对象是客观存在的,万事万物皆是对象
2.对象是在类的基础上创建的
3.对象又称为 实例/引用/变量/对象
类的访问机制:
* 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。
(例外:static方法访问非static,编译不通过。)
在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中
定义的成员。
举例1:编写学生类,输出学生相关信息;编写教员类,输出教员相关信息
public class OOPDemo01 {
public static void main(String[] args) {
Student student =new Student();
student.showstudentInfo();
System.out.println("........................");
Teacher teacher =new Teacher();
teacher.showteacherInfo();
}
}
class Student{
String name;
int age;
String grade;
String hobby;
public void showstudentInfo(){
String name="张浩";
int age=22;
String grade ="尚学堂305";
String hobby ="篮球";
System.out.println(name+"\n"+"年龄:"+age+"\n"+"就读于:"+grade+"\n"+"爱好:"+hobby);
}
}
class Teacher{
String name;
String major;
String course;
String ofSchoolAge;
public void showteacherInfo(){
String name="杨老师";
String major="计算机";
String course ="java基础";
int ofSchoolAge =7;
System.out.println(name+"\n"+"专业方向:"+major+"\n"+"教授课程:"+course+"\n"+"教龄:"+ofSchoolAge);
}
}
举例2:实现思路:
1、定义管理员类Administrator
2、定义其属性和方法
3、定义测试类TestAdministrator
4、创建两个管理员类的对象,并输出他们的信息
public class TestAdministrator {
public static void main(String[] args) {
Administrator Administrator1 = new Administrator();
Administrator1.name="amind1";
Administrator1.code=111111;
System.out.println("姓名:"+Administrator1.name+","+"密码:"+Administrator1.code);
System.out.println("************************");
Administrator Administrator2 = new Administrator();
Administrator2.name="amind2";
Administrator2.code=222222;
System.out.println("姓名:"+Administrator2.name+","+"密码:"+Administrator2.code);
}
}
class Administrator{
String name;
int code;
}
面向过程(POP) 与 面向对象(OOP)
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的
是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对
象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。 - 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如
抽象、分类、继承、聚合、多态等 - 面向过程编程思想只能满足简单的功能的实现,而面向对象可以将复杂的问题简单化,这样大大提高程序的可读性和可维护性。
成员变量和局部变量的区别
1.声明位置不同 类中 方法中
2.作用范围不同: 当前类的方法 当前方法
3.不同的方法中即使有同名的局部变量,没有关系,互不影响,建议相同;当成员变 量和局部变量重名的时候,局部变量优先,就近原则
4.变量的生命周期不一样
* 生命周期: 变量从开始创建到销毁的全过程
* 成员变量: 随着对象的创建而创建,随着垃圾回收器回收对象的时候销毁
* 局部变量: 随着方法的调用而创建,随着方法调用结束而销毁
5.内存存放的位置的:栈内存中 堆内存中
6.成员变量有默认值;局部变量没有默认值
public class OOPDemo {
public static void main(String[] args) {
Person p = new Person();
p.test();
}
}
class Person {
String name = "王五";
int age;
public int add(int a, int b) {
int sum = 0;
sum = a + b;
return sum;
}
int num;
public void test() {
String name = "老刘";
System.out.println(name);
System.out.println(this.name);
}
}
值传递和引用传递
- 基本数据类型作为形式参数,形参的改变不影响实际参数,传递的是值本身。
- 引用类型作为形式参数,形参的改变影响实际参数,传递的是地址值。
public class OOPDemo {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "老六";
s1.age = 30;
Student s2 = new Student();
s2.name = "老王";
s2.age = 20;
Student s3 = s1;
s3.name = "老李";
s3.age = 50;
System.out.println(s1.name + ", " + s1.age);
System.out.println(s2.name + ", " + s2.age);
System.out.println(s3.name + ", " + s3.age);
}
}
匿名对象:没有名字的对象。
例如:new Person();是对象的一种简化表示形式
匿名对象的特点
- 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象 。
- 作为实际参数传递的时候比较方便,作为实参传递给一个方法调用。
- 匿名对象一旦使用完后自动释放,节约内存资源。
封装的概念
- 对数据进行访问权限控制,主要依赖的就是访问权限修饰符
- 访问权限修饰符: public protected [default] private
1.1 this关键字
this代表当前对象,当局部变量和成员变量重名的时候,可以考虑使用this来区分。
- this特点
- 每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象。
- 当在方法中使用本类的属性时,都会隐含地使用this名称,当然也可以明确指定。
- this可以看作是一个变量,它的值就是当前对象的
2.this使用场景 - 当局部变量和成员变量同名时使用this关键字
- this关键字可以访问本类构造函数
1.2private关键字概述:此关键字是一个访问权限修饰符。
private关键字特点
- 修饰的成员不能被外部直接访问
- 虽然不能被外部访问,但是可以在本类是可以直接访问的。
private的使用:
- 将不需要对外访问的属性加上private关键字,同时给出公有的get/set方法
- 将本类构造方法加上private关键字,放置外界直接创建对象
构造方法
1.构造方法概述:
- 构造方法也叫做构造器/构造函数,主要用于给对象的成员进行初始化。调用构造方法会在内存中开辟一片区域用于存储对象,同时为该对象的属性赋初始值。
2.构造方法格式
- 方法名与类名相同
- 没有返回值类型,连void都没有
3.根据参数不同,构造器可以分为如下两类:
- 隐式无参构造器(系统默认提供)
- 显式定义一个或多个构造器(无参、有参)
4.注 意:
- Java语言中,每个类都至少有一个构造器
- 默认构造器的修饰符与所属类的修饰符一致
- 一旦显式定义了构造器,则系统不再提供默认构造器
- 一个类可以创建多个重载的构造器
- 父类的构造器不可被子类继承
举例:创建Employee类
- 属性:姓名,年龄,性别,工资。
方法:显示对象的属性值,工作。work
要求:属性要封装
创建3个对象
构造函数重载
public class TestEmployee {
public static void main(String[] args) {
Employee e1=new Employee();
//通过set方法初始化
e1.setName("王五");
e1.setAge(18);
e1.setSex("男");
e1.setSalary(2000);
e1.work();
e1.show();
//通过构造方法初始化
Employee e2 = new Employee("张三",18,"男",8000.0);
e2.work();
e2.show();
//通过普通方法
Employee e3 = new Employee();
e3.init("小花", 30, "女", 10000.0);
e3.work();
e3.show();
}
}
class Employee{
private String name;
private int age;
private String sex;
private double salary;
public Employee() {
}
public Employee(String name,int age) {
this.name =name;
this.age =age;
}
public Employee(String name, int age,String sex,double salary ) {
this.name=name;
this.age=age;
this.sex=sex;
this.salary=salary;
}
public void init(String name,int age,String sex,double salary) {
this.name=name;
this.age=age;
this.sex=sex;
this.salary=salary;
}
public void work() {
System.out.println(name+"正在工作!!!");
}
public void show() {
System.out.println("Employee [name=" + name + ", age=" + age + ", sex=" + sex + ", salary=" + salary + "]");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
定义一个长方形类,定义 求周长 和面积 area的方法,然后定义一个测试类,进行测试。长height宽wide
public class TestRectangle {
public static void main(String[] args) {
//实例化矩形对象
Rectangle r1 = new Rectangle(2,3);
System.out.println("周长是:"+r1.getLength()+" "+"面积是:"+r1.getArea());
System.out.println("********************************************");
r1.setWidth(5);
r1.setHeigth(6);
System.out.println("周长是:"+r1.getLength()+" "+"面积是:"+r1.getArea());
}
}
//创建矩形类
class Rectangle {
//矩形的宽
private int width;
//矩形的高,也可以理解为长
private int height;
//无参的构造
public Rectangle(){
}
//带参构造
public Rectangle(int width,int height){
this.width = width;
this.height = height;
}
//设置宽
public void setWidth(int width){
this.width = width;
}
//设置长
public void setHeigth(int height){
this.height = height;
}
//获取周长的方法
public int getLength(){
return (width+height)*2;
}
public int getArea(){
return width*height;
}
}
封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩,封装方法,求总分,平均分,以及打印学生的信息
public class TestStudent {
public static void main(String[] args) {
Student s =new Student();
s.setName("张三");
s.setAge(18);
s.setGender("男");
s.setEnglishGrade(90);
s.setMathGrade(96);
s.setChineseGrade(90);
int calculateTotalGrade = s.calculateTotalGrade();
int calculateAvgGrade = s.calculateAvgGrade();
System.out.println(s.toString());
}
}
class Student {
private String name;
private int age;
private String gender;
private int englishGrade;
private int mathGrade;
private int chineseGrade;
private int totalGrade;
private int avgGrade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getEnglishGrade() {
return englishGrade;
}
public void setEnglishGrade(int englishGrade) {
this.englishGrade = englishGrade;
}
public int getMathGrade() {
return mathGrade;
}
public void setMathGrade(int mathGrade) {
this.mathGrade = mathGrade;
}
public int getChineseGrade() {
return chineseGrade;
}
public void setChineseGrade(int chineseGrade) {
this.chineseGrade = chineseGrade;
}
public int calculateTotalGrade() {
totalGrade = mathGrade + englishGrade + chineseGrade;
return totalGrade;
}
public int calculateAvgGrade() {
avgGrade = (mathGrade + englishGrade + chineseGrade) / 3;
return avgGrade;
}
@Override
public String toString() {
return "姓名:" + name + ",年龄:" + age + ",性别:" + gender + ",数学:" + mathGrade
+ ",语文:" + chineseGrade + ",英语:" + englishGrade + "总分:" + calculateTotalGrade()
+",平均分:" +calculateAvgGrade();
}
}