1.概念
对象:客观存在的对象实体和主观抽象的概念
面向对象:以对象作为中心,采用抽象、封装、继承,多态等设计方法来解决问题的一种软件开发方法
2.类和对象的关系
类:事物的描述
对象:该事物的实例,java中通过new关键字创建
类是对象的抽象,对象是类的实例
3.成员变量和局部变量的区别
定义环境不同:成员变量定义在类中,局部变量定义在局部代码块中
定义内存不同:成员变量定义在堆内存中,局部变量定义在栈内存中
生存周期不同:成员变量随着对象的创建而存在随着对象的消失而消失,局部变量随所属区域的执行而存在随着所属区域的消失而释放
默认初始值不同:成员变量都有默认初始值,局部变量没有默认初始值
4.封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:提高程序重用性、安全性
原则:将不需要对外提供的内容都隐藏起来,只提供公共方法对其访问
5.构造函数
作用:给对象初始化
特点:a.函数名与类名相同 b.没有返回值 c.不用定义返回值类型
代码示例
class Person {
private String name;
private int age;
// 自定义构造函数
Person() {// 一个类如果没有自定义构造函数,则该类中会有一个默认的空参数构造函数;如果自定义构造函数,则默认构造函数就不存在了
System.out.print("Person run");
}
}
public class ConsDemo {
public static void main(String[] args) {
Person p = new Person();
}
}
构造函数和一般函数的区别:
调用方式不同:构造函数在对象创建时被调用,一般函数在需要函数功能时被调用
调用次数不同:构造函数只会被调用一次,一般函数会被调用多次
构造代码块
给所有对象初始化
代码示例
class Person {
{// 构造代码块,随着对象的创建而创建
System.out.println("ConsCode...");
}
}
public class ThisDemo {
public static void main(String[] args) {
Person p = new Person();
}
}
6.this关键字
this代表本类对象的引用,当函数内需要用到调用该函数的对象时使用;当成员变量和局部变量重名时,使用this关键字区分
代码示例
class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public void speak() {
System.out.println(name + ":" + age);
}
}
public class ThisDemo {
public static void main(String[] args) {
Person p = new Person("旺财", 12);
p.speak();
}
}
this也可以用于构造函数中调用其他构造函数,
但只能定义在构造函数的第一行因为初始化动作先执行
代码示例
class Person{
private String name;
private int age;
Person(String n,int a){
name=n;
age=a;
}
//判断是否是同龄人
public boolean compare(Person p){
return this.age==p.age;
}
}
public class ThisDemo {
public static void main(String[] args) {
Person p1=new Person("旺财",12);
Person p2=new Person("小 强",12);
boolean b=p2.compare(p1);
System.out.println(b);
}
}
7.static关键字
用于修饰成员变量和成员函数
被修饰的成员的特点:
随着类的加载而加载
优先于对象存在
被所有对象共享
可以直接被类名调用 格式: 类名.静态成员
修饰的是共享数据,对象中存储的是特有数据
使用注意事项:
静态方法只能访问静态成员,非静态方法既可以访问静态成员,又可以访问非静态成员
静态方法不可以写this,super关键字
主函数是静态
成员变量和静态变量的区别:
a. 生命周期不同
成员变量随着对象的创建而存在,随着对象的被回收而释放
静态变量随着类的加载而存在,随着类的消失而消失
b.调用方式不同
成员变量只能被对象调用
静态变量既可以被对象调用,也可以被类名调用
c.别名不同
成员变量也称为实例变量
静态变量也称为类变量
d.数据存储位置不同
成员变量存储在堆内存的对象中
静态变量存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据
代码示例
class Person {
private String name;
static private String sex;
Person(String name, String sex) {
this.name = name;
Person.sex = sex;
}
public void speak() {
System.out.println(this.name + ":" + Person.sex);
}
}
public class ThisDemo {
public static void main(String[] args) {
Person p = new Person("yilong", "male");
p.speak();
}
}
静态代码块
给类进行初始化
代码示例
class StaticCode {
static int num;
static {
num += 10;
System.out.println("haha");
}
static void show() {
System.out.println(num);
}
}
public class StaticDemo {
public static void main(String[] args) {
StaticCode.show();
}
}
当类中有对象时,静态代码块、构造函数、构造代码块的执行顺序:
静态代码块>构造代码块>构造函数
8.单例设计模式
设计模式:解决问题的某种思想
单例设计模式:可以保证一个类在内存中的对象唯一性
步骤:
a.私有化该类构造函数
b.通过new在本类中创建一个本类对象
c.定义一个公有方法,将创建的对象返回
代码示例
class Single {//饿汉式 类一加载,对象就已经建立了
private int num;
static Single s = new Single();
private Single() {
}
public static Single getInstance() {
return s;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
public class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(1);
s2.setNum(2);
System.out.println(s1.getNum());
System.out.println(s2.getNum());
}
}
class Single {// 懒汉式 延迟加载形式, 类加载进来没有对象,只有调用getInstance方法时,才会创建对象
private int num;
private static Single s = null;
private Single() {
}
public static Single getInstance() {
if (s == null)
s = new Single();
return s;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
public class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(1);
s2.setNum(2);
System.out.println(s1.getNum());
System.out.println(s2.getNum());
}
}