面向对象入门:
面向对象的三大特性:封装、继承、多态
对象与类:对象是具体的,类是总括的,例如Tom和Jarry是对象,而猫和老鼠是类。
类:类是由字段(属性)和方法两部分构成的
(注:对象所拥有的特性为字段,对象执行的操作为方法)
定义类:
[访问修饰符] class 类名{
成员变量声明;
成员方法生命;
}
注:访问修饰符如public、private、protected等是可选的
类的字段(属性):
[访问修饰符] 数据类型 字段名; (访问修饰符可选)
类的方法:
public class Person {
public String name;
String gender;
int age;
public void work(){
System.out.println(this.name+"的性别为"+gender+",今年"+age+"岁");
}
}
创建对象:
类名 对象名 = new 类名();
注: new是关键字,称为实例化 ;
左边的类名为对象的数据类型 ;
右边的类名()称为类的构造方法
eg:Person SongJiang = new Person();
(使用new运算符实例化了一个Person对象;实例化的结果是产生了一个Person类的实例,这个实例的名称是SongJiang)
使用对象:
public class Person {
public String name;
String gender;
int age;
public void info(){
System.out.println(this.name+"的性别为"+gender+",今年"+age+"岁");
}
public static void main(String[] args){
Person p1=new Person();
p1.name="宋江";
p1.gender="男";
p1.age=21;
p1.info();
}
}
对象在计算机中的执行原理:
Person p1 = new Person(); 这句话中“Person p1”表示的是在栈内存中创建了一个Person类型的变量,变量名为p1。而new Person() 会在堆内存中创建一个对象,而对象中包含了人的属性名和属性值,同时系统会为这个Person对象分配一个地址值0x4f3f5b24。当执行
p1.name=“宋江”时,其实就是通过p1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为“宋江”;
成员变量的作用域:
public class Person1 {
public String name;
public String gender="男";
public int age;
public void work(){
int age=0;
}
public void eat(String name){
}
}
在上面的代码中,name、gender既不属于eat()方法,也不属于work()方法,而是属于Person类本身的字段,它们都是Person类的成员变量,成员变量的作用域是整个类。
局部变量的作用域:
例如上面例子 work()方法中的变量就是局部变量,局部变量只能在方法内使用。
成员变量与局部变量的区别:
作用域不同。局部变量的作用域仅限定于定义它的方法,在该方法外无法被访问。成员变量的作用域是在整个类内,所有的成员方法都可以使用它。如果访问权限允许,还可以在类外部使用成员变量。初始值不同。对于成员变量,如果在类定义中没有给它赋予初始值, Java 会给它赋一个默认值, byte 、 short 、 int 、 long 类型的默认值是 0 , boolean 类型的默认值是 false , char 类型的默认值是 '\u0000' (空字符), float 、 double 类型的默认值是0.0 ,引用类型的默认值是 null 。但是 java 不会给局部变量赋初始值,因此局部变量在使用前必须初始化。
Java中的数据类型有两大类:1.基本数据类型:8种:byte、char、short、int、long、float、double、boolean2.引用数据类型:4种:类、数组、接口、枚举
public class DateType {
public static void main(String[] args){
System.out.println("***基本数据类型***");
int num1=11;
int num2=num1;
System.out.println("num1="+num1);
num2=22;
System.out.println("把num1赋值给num2后,修改num2的值,num1="+num1);
System.out.println("***引用数据类型***");
Person person1=new Person();
person1.age=11;
Person person2=person1;
System.out.println("person1.age="+person1.age);
person2.age=22;
System.out.println("把person1对象赋给person2对象,修改person2对象的age属性值后,person1.age="+person1.age);
}
}
上述例子:对于基本数据类型,不同的变量分别在不同的存储空间中,并且存储空间存储的是该变量的值。赋值操作传递的是变量的值,改变一个变量的值不影响另一个变量的值。
但对于引用操作类型,赋值是把原对象的引用(内存地址编号)传递给另一个引用,这两个引用指向同一个内存空间,其中任何一个引用修改了属性的值,另一个也随之被修改。
类和对象的一些注意事项:
1.一个代码文件中,可以写多个class类,但只能有一个是public修饰,且public修饰的类必须和文件名相同。
//public修饰的类Demo1,和文件名Demo1相同
public class Demo1{
}
class Student{
}
2.对象与对象之间的数据不会互相影响,但是多个变量指向同一个对象会互相影响。
s1和s2两个变量记录的是同一个对象的地址值,s1修改对象的属性值,再用s2访问这个属性,会发现已经被修改了。
构造器:
构造器其实是一种特殊的方法,但这个方法没有返回值类型,方法名必须和类名相同。
public class Gzq {
public Gzq(){
System.out.println("无参数构造器被触发执行");
}
public Gzq(String name,int age){
System.out.println("有参数构造器被触发执行");
}
}
构造器何时执行:new对象就是在执行构造方法
构造器应用场景:在创建对象时,可以用构造方法给成员变量赋值
注意事项:
this关键字的作用:
1.区分局部变量和成员变量(this.属性名 指代成员变量)
2.访问本类中的方法,此时谁调用就是谁
3.使用this可以调用重载的构造方法,只能在构造方法的第一行使用
静态成员和实例成员的区别:
1.static在加载类模板的时候初始化,实例成员在创建对象时初始化
2.static可直接通过类名访问属性和方法,实例成员只能通过对象名访问
3.static不能访问实例成员,实例成员都可以访问
4.静态成员不能使用this关键字,但实例成员可以