对象和类
-对象和类的关系:特殊到一般,具体到抽象。
-类:我们叨做class。
-对象:我们叫做Object, instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。
-类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
-类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性。
-对象是Java程序的核心,在Java程序中“万事万物皆对象”。
-JDK提供了很多类供编程人员使用,编程人员也可定义自己的类。
/*
* 所有类定义的时候可以添加属性和方法,但是不是必须要写的
* 一个java文件中可以定义N多个class,但是只能有一个public class并且public class的类名跟文件名保持一致
* 属性:
* 语法:
* [访问修饰符] 数据类型 属性名称 = 值;
*
* 注意:
* 定义属性的时候可以有值也可以没有值
* 必须要包含类型和名称
*
*
* 方法:表示行为
* 语法:
* [访问修饰符] 返回值类型(任何类型) 方法名称(形参列表){
* 逻辑代码
*
* }
* 注意:
* 1、方法的访问修饰符可以不写
* 2、方法可以有返回值,也可以没有,void表示没有返回值的意思
* 3、形参列表可以有,也可以没有
* 4、java中方法的传参都是值传递(后续会讲)
*
* 对象的创建和使用
* 1、使用new关键字来创建对象
* ClassName objectName = new ClassName();
* 2、对象的使用
* 使用对象的时候可以通过 对象名称.属性 或者 对象名称.方法 来使用属性和方法
*
*
* 计算两点间的距离
* 1.可以设置两个坐标的方法
* 2.设置计算点距离的方法
*
* 交换两点的值
* 1.定义第三个数据
* 2.用加减法
* */
public class Point {
int x;
int y;
/* 自己写的,计算点距离的方法未写出来
public Point(int x,int y){
this.x = x;
this.y = y;
}
public double caledistance(){
return Math.sqrt();
}
public static void main(String[] args) {
Point p1 = new Point(2,2);
Point p2 = new Point(3,3);
System.out.println("距离为:"+Math.sqrt((p2.x-p1.x)*(p2.x-p1.x+(p2.y-p1.y)*(p2.y-p1.y))));
}
*/
public void set(int x,int y){
this.x = x;
this.y = y;
}
//重点
public double calcDistance(Point p){
return Math.sqrt((p.x-x)*(p.x-x+(p.y-y)*(p.y-y)));
}
//交换两个坐标点的值
public void change(Point p){
int xx = p.x;
p.x = x;
x = xx;
int yy = p.y;
p.y = y;
y = yy;
}
public void show() {
System.out.println("["+x+","+y+"]");
}
public static void main(String[] args){
Point p1 = new Point();
p1.set(2,2);
Point p2 = new Point();
p2.set(3,3);
System.out.println(p2.calcDistance(p1));
p1.change(p2);
p1.show();
p2.show();
}
}
内存分析
栈:
– 存放:局部变量
– 先进后出,自下而上存储
– 方法执行完毕,自动释放空间
堆:
– 存放new出来的对象
– 需要垃圾回收器来回收:System.gc()
方法区:
– 存放:类的信息(代码)、 static变量、字符串常量等
构造方法、重载
* 构造方法:
* 创建对象的时候默认会调用构造方法来创建对象,(在堆中开辟空间),可以完成成员变量的某些初始化操作
* 构造方法的语法:
* 方法名称:构造方法的方法名称必须跟类的名称保持一致
* 访问修饰符
* 形参:可以用户自定义添加,跟方法的普通参数一样
* 方法体:完成对象的初始化功能
* 返回值:没有返回值
* 注意:
* 1、创建完类之后,如果没有手动调用构造方法,会有一个默认的无参的构造方法供调用
* 2、当用户自定义了构造方法之后,默认的无参构造方法就不能够使用了,必须要手动定义无参构造方法
* 3、同一个类中可以包含多个同名的构造方法
*
* * 重载:在一个类中可以包含多个重名的方法,但是注意方法的参数列表不能相同
* 三个方面的不同:
* 参数的个数不同
* 参数的类型不同
* 参数的顺序不同
* 注意:
* 一般构造方法都会进行重载(一个类中可能包含多个属性值,当只需要给部分属性初始化的时候需要调用不同的构造方法)
public class Teacher {
String name;
int age;
public void teach(){
System.out.println("上课");
}
public Teacher(){
System.out.println("无参");
}
/* //错误示范
public Teacher(String name,int age) {
System.out.println("有参");
name = name; //错误原因:局部变量是从方法类开始到结束,这里的name会当成局部变量
age = age; //当做局部变量的原因:就近原则
}
*/
//构造方法传递数据方法一
public Teacher(String name1,int age1) {
System.out.println("有参");
name = name1;
age = age1;
}
/* //构造方法传递数据方法二
public Teacher(String name,int age){
System.out.println("有参");
//没有下面两句话会缺少处理逻辑 name和age的值并未改变
this.name = name;
this.age = age;
}*/
public static void main(String[] args){
Teacher teach1 = new Teacher();
teach1.name = "哈哈";
teach1.age = 20;
System.out.println(teach1.age+"\t"+teach1.name);
Teacher teach2 = new Teacher("hy",18);
System.out.println(teach2.age+"\t"+teach2.name);
}
}
变量
* 变量:
* 局部变量:
* 定义在方法中的变量称之为局部变量
* 作用域:从定义的位置开始到整个方法结束
* 局部变量不包含默认值,如果没有使用当前变量的话,可以不赋值
* 注意:局部变量只能在当前方法中使用,其他地方无法使用
* 成员变量:
* 定义在方法外,类内的变量叫做成员变量(全局变量)
* 成员变量包含初始值:int 0 、String null 、boolean false
* 作用域:整个类体内
public class VarDemo {
int age = 20;
public void test(){
System.out.println(age);
age = 10;
System.out.println(age);
int age = 30;
System.out.println(age);
}
public void show(){
//局部变量
int a ;
String name = "zhangsan";
System.out.println(age);
// System.out.println(a);
}
public static void main(String[] args) {
VarDemo vd = new VarDemo();
System.out.println(vd.age);
vd.test();
System.out.println(vd.age);
}
}