目录
一、元空间、计数器、线程
元空间:jdk1.7之前元空间还不元空间,1.7前是方法区,1.7后改名为元空间,因为类的信息占空间,所以在1.8正式选择将其放入本地内存。
计数器:有指令集,进入操作系统进行操作。
线程:每个线程都会开辟新的区域存放,线程内数据资源不共享,比如线程A内定义一个a,线程B 内也定义一个a,那么输入寻找a的时候程序分不清是A内还是B内的,所以线程内数据资源不共享。
二、属性和成员变量
属性,成员变量和全局变量的概念其实是一样的,只是不同场景的称谓不同
public class Student {
String name;
}
上面代码里的name就是student的属性
package com.svt.boke;
import java.util.Scanner;
public class Student {
String name;
int i;
public static void main(String[] args) {
Student student=new Student();
student.score();
}
Scanner sc=new Scanner(System.in);
public void score(){
System.out.println("请输入学生成绩");
int i =sc.nextInt();
if (i>=60){
System.out.println("及格");
}else
System.out.println("不及格");
}
}
上述代码定义了一个i,是类的成员变量,就不是属性了,因为i是个没意义的字母,不对类造成影响
三、创建对象-克隆
创建对象的方式有很多种,最简单的通过一个new关键字创建对象,其次则是通过方法调用创建对象,在其方法内部创建并返回新的对象,还有反射通过newInstance()创建,下面详细讲一下个人理解的浅薄克隆创建对象知识。
克隆,所有属性方法都会克隆一份(除地址)
package com.svt.clone;
public class A implements Cloneable{
String name;
public static void main(String[] args) {
A a=new A();
a.name="小圆";
try {
A b= (A) a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
在栈堆内的操作则是先将定义的a入栈,在堆内开辟一块新地址空间001,a指向堆内001地址的空间,并且赋值为“小圆”,由于b是克隆的a,那么b则会连带着赋值一起克隆,b指向的002新地址内的值也会成为“小圆”,这就是浅克隆,浅克隆意味着如果修改A的属性值,那么克隆的对象也会受之影响,如果name从小圆变成了小奎,那么002内的“小圆”也会变成“小奎”。
class B{
String name;
}
class A implements Cloneable{
B b;
public A(B test) {
}
public static void main(String[] args) {
B test=new B();
test.name="小圆";
A a=new A(test);
try {
A b= (A) a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
给test赋值name为小圆,然后有参赋值给a,输出b克隆a,此时001指向test新开辟的空间003,所以a输出的也是小圆,而b因为完全克隆a,所以连这个指向地址也是克隆的,所以此时还是浅克隆,下面修改一下当前代码,使之成为深克隆。
package com.svt.clone;
class B{
String name;
}
class A implements Cloneable{
B b;
public A(B test) {
}
@Override
public Object clone(){
this.b=new B();
b.name="小奎";
return null;
}
public static void main(String[] args) {
B test=new B();
test.name="小圆";
A a=new A(test);
A b= (A) a.clone();
}
}
重写了方法,解决了原有对象对克隆对象的影响
克隆可以用于扩展,创建大量对象副本,当你要很多对象的时候,一个一个new的实在是太慢,这时候克隆就派上了大用场
四、总结
- 因为要通过类名调用,所以称为类方法,类方法也叫静态方法
- IO效率:代码写完放在磁盘内,要运行时再从磁盘内放入内存运行
- 接口修饰符不能用protected,接口默认public,但是private、default和static也可以用,但是要在小括号后加上{},也能写代码块,这是jdk1.8后新增的,,但我们通常还是说接口内一般都是抽象方法
- 除了静态(属性)和动态(方法)描述,其余不可再描述类
- 方法重写注释@Override
- 方法重载注释@Overload
- 任何类都有父类,就是object,是隐式的
-
子类独有的属性方法只能在子类的对象上被调用,而不能在父类的对象上被调用
-
一个类只能继承一个类,单继承特性
-
一个类可以实现任意数量的接口
-
接口和接口是多继承关系 比如 interface C extends B,A{}
-
类有多层继承但是没有多继承
-
抽象类实现接口可以不用重写,无意义
-
抽象方法一定需要子类实现
-
常量命名规则需要所有单词全部大写,多个单词下划线隔开
-
代码块执行顺序 静态代码块->初始化块->方法块
-
连接数据库的时候就写在静态代码块内,这样构建一次获取数据库连接就可以一直使用
-
接口是对行为的抽象(接口相当于是一套标准)
-
抽象类是对类的抽象,接口是对方法的抽象
至此Java面向对象的知识点基本总结完毕,有一些是后续会学,先补充学习的!