类和对象基本概念
面向对象的特征:抽象、封装、继承、多态
类:对现实世界中事物的抽象。Student
对象:现实世界中具体的个体。张三、李四 这些具体的学生
类和对象的总结:
1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。
2、对象:真实存在的对象
3、类中包含:
1)所有对象所共有的特征–属性(静)
2)所有对象所共有的行为–方法(动)
4、类是对象的模板,对象是类的具体实例。
5、一个类可以创建多个对象:同一个类的不同对象,结构相同,数据不同。
一、数据类型的默认值
int类型默认值是:0
double类型默认值是:0.0
boolean类型默认值是:false
String类型默认值是:null
int[]类型默认值是:null
Student[]类型默认值是:null
boolean[]类型默认值是:null
int[] array = new int[3]; 里面的存放默认值是0
boolean[] array = new boolean[3]; 里面的存放默认值是false
Student[] array = new Student[3];里面的存放默认值是null
所有引用数据类型的默认值为:null
例如:
int [] array=new int[3]; array 已经有new赋值 默认值为0
int[] array 默认值为null
Student[] 存放Student类型的数组
//r在方法中定义的变量是:局部变量。
//局部变量必须要初始化: 1、赋默认值2、引用数据类型可以实力话一 个对象
二、面向对象
构造方法
特点:
1、方法名和类名一样
2、没有返回值
//无参构造方法
//如果不写,Java默认提供这样一个无参构造方法.
//如果你写了,Java就不会再提供这个无参构造方法
public Student() {
System.out.println("Student.Student()");
}
this:
//有参构造方法
public Student(int id, String name, int age) {
this.id = id;//把1这个值赋值给当前new出来的student对象的id属性
this.name = name;
this.age = age;
}
Student student = new Student(1, "zhansgan", 20);
this.id = id;
this代表当前对象,把通过构造方法传递过来的值赋值给当前对象的id。
如果不写任何构造方法,系统默认提供一个无参数构造方法,只是我们看不到而已。
如果自己写了任何一个构造方法,系统就不会提供这个默认无参构造方法。所以说如果自己写了一个带参数的构造方法,就要把无参数构造方法也要写上。(后面使用或者学习的一些框架要new这个无参数的构造方法)(只要你写了任何一个构造方法,不管有参没参,系统都不会给你提供默认无参构造方法)
构造方法和一般方法的不同:
1、构造方法是在new对象的时候运行,而一般的方法是在对象调用的时候才执行。
2、一个对象的建立,构造方法只执行一次,而一般方法可以被改对象调用多次。
this关键字是在对象内部指代自身的引用
属性私有,使用属性
如果属性私有,可以通过get、set方法访问:
public void setAge(int age) {
if (age > 0 && age < 130) {
// The assignment to variable age has no effect
// this.age 代表的就是属性age
this.age = age;
}
}
public int getAge() {
// return age;
return this.age;
}
可以右键 Generate --Getter and Setter 快捷创建
三、练习
1、请定义一个交通工具(Vehicle)的类,其中有:属性:速度(speed),体积(size)等等方法:移动(move()),加速speedUp(int speed),减速speedDown(int speed)等等.最后在测试类VehicleTest中的main()中实例化一个交通工具对象,并通过构造方法给它初始化speed,size的值,并且通过get方法打印出来。另外,调用加速,减速的方法对速度进行改变(改变speed的值),改变后的速度值在main()方法中打印出来。
public class Vehicle {
private int speed;
private int size;
public void move(){
System.out.println("交通工具的速度:"+speed+"体积为:"+size);
}
public Vehicle() {
}
public Vehicle(int speed, int size){
this.size=size;
this.speed=speed;
}
public int getSpeed(){
return speed;
}
@Override
public String toString() {
return "Vehicle{" +
"speed=" + speed +
", size=" + size +
'}';
}
public void setSpeed(int speed) {
this.speed = speed;
}
public double getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public void speedDown(int speed){
this.speed += speed;
}
public void speedUp(int speed){
this.speed += speed;
}
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle(100,20);
vehicle.speedUp(10);
System.out.println(vehicle);
}
2、编写Java程序,模拟简单的计算器。定义名为Number的类,其中有两个整型数据成员num1和num2,应声明为私有。编写构造方法,赋予num1和num2初始值,再为该类定义加(add)、减(sub)、乘(multi)、除(div)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。在main方法中创建Number类的对象,调用各个方法,并显示计算结果。
public class Number {
private int num1;
private int num2;
public Number() {
}
public Number(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int add() {
return num1 + num2;
}
public int sub() {
return num1 - num2;
}
public int multi() {
return num1 * num2;
}
public int div() {
return num1 / num2;
}
}
@Test
public void test1(){
// 通过new 构造方法,实例化一个对象
Number number = new Number(3,5);
int add = number.add();
int multi = number.multi();
System.out.println(multi);
System.out.println(number.add());
}
3、定义长方形类,含:属性:宽、高(整型);方法:求周长、面积;构造方法3个:(1)无参——宽、高默认值为1;(2)1个参数——宽、高相等;(3)2个参数——宽、高各为参数值。要求:进行测试计算周长和面积。
//如果一个类没有继承任何一个类,默认继承Object类
//如果不写任何构造方法,默认提供一个无参的构造方法
//super();子类构造方法中,首先实例化父类构造对象,默认会有一个super
public class Rectangle extends Object{
private int height;
private int width;
public Rectangle() {
height = 1;
width = 1;
}
public Rectangle(int high) {
this.height = high;
this.width=high;
}
public Rectangle(int high, int width) {
this.height = high;
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int girth(){
return height *2+width*2;
}
public int area(){
return height *width;
}
@Override
public String toString() {
return "Rectangle{" +
"high=" + height +
", width=" + width +
'}';
}
}
@Test
public void test2(){
Rectangle rectangle = new Rectangle(6,8);
System.out.println(rectangle.area());
System.out.println(rectangle.girth());
}
4、定义一个点类Point,包含两个成员变量x和y,分别表示x和y坐标,2个构造函数Point()和Point(int x, int y),以及一个movePoint(int dx, int dy)方法实现点的移动(参数即为移动的大小),移动完成之后直接打印最新的坐标值。
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public Point() {
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void movePoint(int dx,int dy){
x += dx;
y += dy;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
@Test
public void test3(){
Point point = new Point(2,5);
System.out.println(point);
point.movePoint(1,2);
System.out.println(point);
}