类与对象
共同的状态(属性)和行为(方法)提取出来
对象:实际存在的个体
实例变量是一个对象一份
实例变量属于成员变量,如果没有手动赋值 系统会赋默认值
// 实例变量是一个对象一份
// 实例变量属于成员变量,如果没有手动赋值 系统会赋默认值
public class Student {
String name;
int age;
boolean gender;
}
public class Main {
public static void main(String[] args) {
// s1存储student对象的地址
// s1称为引用
// 引用和对象要区分开,引用在JVM栈中,对象在JVM堆中
Student s1 = new Student();
System.out.printf(s1.name);
}
}
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0F |
| double | 0.0 |
| boolean | false |
| char | \u0000 |
| 引用类型 | null |
JVM内存结构
引用一但为null,表示引用不再指向对象了,但通过引用访问属性,编译仍然可以通过,但运行时会报空指针异常
注意:没有什么值传递和引用传递
在调用方法传参,是把变量里面保存的东西传过去,复制一份,基本数据类型,就是值复制过去了,对象就是把那块内存地址复制过去了,内存地址虽然是复制过去的,但值没变指向的还是那个位置
this
this 就是个引用,指代当前对象,this保存当前对象地址,在JVM结构中任何实例方法的局部变量表的0号槽位都存放的是this
封装
属性私有化:
第一步:使用private修饰,private修饰的只能在本类中访问
第二步:提供公开的方法,以便外部访问,setter和getter
构造方法
用于对象的创建、对象初始化,默认无参
构造代码块
对象创建在new的时候,会开辟内存空间,然后给所有属性默认值,完成创建对象,这个过程在执行构造方法之前就完成了
初始化什么时候完成?构造方法体开始执行,标志开始进行对象初始化,构造方法执行完毕,表示初始化完毕
static
static修饰的变量会直接存储在堆中,类加载时初始化
static修饰属性的JVM内存结构图
单例模式
初级单例模式,没有对线程优化
/*
* 单例:
* 第一步:构造方法私有化
* 第二步:提供一个对外静态方法,用这个方法获取单个实例
第三步:定义一个静态变量,在类加载的时候,初始化静态变量
峨汉式:类加载时对象就创建好了,不管用不用
* ** */
public class Person {
private static Person person = new Person();
private Person() {
}
public static Person get() {
return person;
}
}
懒汉式,前面两步都一样,第三步,是需要时再开辟空间
public class LazySingleton {
private static LazySingleton lazySingleton;
private LazySingleton() {
}
public static LazySingleton get() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
继承
有了继承才有方法覆盖和多态
不支持多继承
构造方法不支持继承,私有的不支持继承
Java语言中,一个没有显示继承的类,默认继承Object
Object是JDK中的根类
方法重写
当继承方法不能满足使用时,重写@Override
父类型引用指向子类型对象是多态核心语法
super
super代表的是当前对象的父类特征
super()的作用:1、代码复用 2、通过子类构造方法调用父类构造方法是为了给继承过来的父类特征初始化。
final
修饰类,则类不能继承。修饰方法,则方法不能重写。final 修饰的变量,则只能赋值一次。
final 修饰的实例变量必须在构造方法执行完成之前手动赋值。
static final 修饰实例变量就是常量
final 修饰的引用
抽象
父类不知道应该如何实现某些方法,可以交给子类实行,定义为抽象方法,类也需要定义为抽象类
接口
在Java中是一种规范,定义了一组抽象方法和常量,用来描述 一些实现这个接口的类应该具有哪些属性和行为,接口和类一样,也是一种引用数据类型。
注意:接口间可以多继承
练练手
public interface Usb {
public abstract void read();
public abstract void write();
}
public class Keyboard implements Usb{
@Override
public void read() {
System.out.println("连接键盘read");
}
@Override
public void write() {
System.out.println("连接键盘write");
}
}
public class Mouse implements Usb {
@Override
public void read() {
System.out.println("连接鼠标read");
}
@Override
public void write() {
System.out.println("连接鼠标write");
}
}
public class Computer {
public void conn(Usb usb) {
usb.read();
usb.write();
}
}
public class Test {
public static void main(String[] args) {
Usb usb1 = new Keyboard();
Computer computer = new Computer();
computer.conn(usb1);
}
}
访问控制权限
缺省:包内可访问 protected:子类可以访问
Object类
java.lang.Object是所有类的超类 对象的拷贝 浅拷贝:只拷贝这个指定对象 深拷贝:把指定对象相关联的对象也拷贝过来 一个对象要想clone必须实现标志接口Cloneable,否则异常