Java学习记录1——Java入门

位(bit) 一个数字0或者一个数字1 ,代表一位
字节(byte),每逢8位是一个字节,这是数据存储的最小单位。计算机存储单元

1Byte = 8 bit
1 KB = 1024 Byte

命令提示符(cmd)
切换盘符 盘符名称:
cd 文件名 进入
cd 文件夹\文件夹1\文件夹2
cd … 退出
cd \ 返回根路径
dir 查看当前内容
cls 清空
exit 退出

JVM——Java虚拟机
JVM相当于翻译
在这里插入图片描述
JRE:Java程序运行环境
JDK:Java程序开发环境在这里插入图片描述

类是 java当中所有源代码的基本组织单位,类名和文件名一样

public static void main(String[] args)//代表程序的起点

标识符的规则:

1.26字母,0-9,$符号,_
2.不能以数字开头
3.不能是关键字
4.类名规范——首字母大写,后面每个单子首字母都大写
5.变量名,方法名——首字母小写,后面每个单子首字母都大写 

常量的概念:程序运行期间,固定不变的量

面对过程思想思考问题时,首先考虑怎么按步骤实现。适合简单任务,不需要协作的任务,可独立完成。自己开车,写论文就是类似的问题。
对于怎么制造一辆车,既不是简单任务,也不是能单独完成的任务。引出了面向对象思想。
面向对象和面向过程总结:
1.简单问题用面向过程
2.复杂问题:宏观上用面向对象把握,微观上仍是面向过程。

对象的进化史(数据管理和企业管理的共同之处)

1.数据无管理时代

只有几个变量存在。同理企业最初只有几个人,不涉及管理
2.数组管理和企业部门制
企业中员工多了,将类型一致的人放到同一部门中。同理在编程中出现了数组的概念。
3.对象和企业项目制
以项目为区分区域,比如腾讯的微信项目组中也有各种部门存在。同理在编程中出现了对象,对象中有不同类型的变量和方法。大的公司称为集团,集团中的各个公司就是单独的项目组。

对象和类的关系
类可以看成是对象的模板,类是对对象的抽象化。 (注意一个java文件里之只能有一个用public修饰的类)

JVM的内存可以分为三个区域:栈stack,堆heap,方法区method area。
栈的特点

1.描述方法执行的内存模型,每个方法被调用都会创建一个栈帧(**存储局部变量**,操作数,方法出口等)
2.JVM为每个线程创建一个栈,用于存放该线程的执行方法的信息(实参,局部变量等)
3.栈属于线程私有,不能共享
4.先进后出
5.系统自动分配,速度快,连续的内存空间

堆的特点

1.存放创建的对象和数组
2.JVM只有一个堆,所有线程共享
3.不连续的空间,分配灵活 ,速度慢

方法区(也称静态区)

1.实际也是堆,只是用于存储类,常量相关的信息。
2.JVM只有一个方法区,所有线程共享
3.存放程序中永远不变或唯一的内容。(类信息【class对象】,静态变量,字符串常量等)

在这里插入图片描述
构造器也叫构造方法(constructor),用于对象的初始化。
要点:

1.通过new调用
2.构造器有返回值,但不能定义返回值类型(返回值类型肯定是本类)
3.如果未定义构造器,编译器会自动定义一个无参构造器
4.构造方法名必须和类名一致!

垃圾回收机制(Garbage Collection)
任何一种垃圾回收算法一般要做两件基本事情:

1.发现无用的对象
2.回收无用对象占用的内存空间。

通用的分代垃圾回收机制
我们将对象分为三种状态:年轻代、年老代、持久代。
JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。
通用的分代垃圾回收机制

this关键字
this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。
this最常的用法:

1.在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,**this总是指向正要初始化的对象**。
2.使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的**第一句**。
3.this不能用于static方法中。

static关键字
static修饰的成员变量和方法,从属于类;普通变量和方法从属于对象。
要点:
静态方法可以调用静态变量,不可调用非静态。
非静态方法可以自由调用静态/非静态方法,变量。
(有类不一定有对象,有对象一定有类。 )

instanceof 运算符
instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。比如:

public class Test{
    public static void main(String[] args) {
        Student s = new Student("心悦则呈",178,"Java");
        System.out.println(s instanceof Person);
        System.out.println(s instanceof Student);
    }
}

继承
使用要点

1.父类也称作超类、基类、派生类等。
2.Java中类只有单继承,接口有多继承。
3.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
4.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

注意重写与重载的区别
重载的本质是不同的方法,只是同名而已
重写是针对原方法修改。

Object类
Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。Object中的方法可以重写。

‘==’和equals
‘==’代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。

super关键字
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

封装
访问控制符
在这里插入图片描述
1.private 表示私有,只有自己类能访问
2.default表示没有修饰符修饰,只有同一个包的类能访问
3.protected表示可以被同一个包的类以及其他包中的子类访问
4.public表示可以被该项目的所有包中的所有类访问

类的属性处理

1.一般使用private访问权限。
2. 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。

多态
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。
多态的要点:

1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象(即调用方法时把子类对象给父类)
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

多态的深度内存分析

public class HttpServlet {//父类
	public void service() {
		System.out.println("HttpServlet.service");
		/*this.*/doget();/这里特别要注意this是被省略了,其实这里的doget是this.doget
	}
	public void doget() {
		System.out.println("HttpServlet.doget");
	}
}
public class MyServlet extends HttpServlet {//子类
	public void doget() {
		System.out.println("MyServlet.doget");
	}
}
public class Test {//测试
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HttpServlet s = new MyServlet();
		s.service();//这里调用service是s.service,再去调用doget是调用this.doget,即MyServlet.doget
	}
}
//运行结果
HttpServlet.service
MyServlet.doget

对象的转型
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换,也就是子类可以自动转型为父类。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型(由父类再转回子类)!

数组
数组变量属引用类型,数组也是对象,数组中的每个元素相当于该对象的成员变量。
数组的三个基本特点:

  1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素必须是相同类型,不允许出现混合类型。
  3. 数组类型可以是任何数据类型,包括基本类型和引用类型。

初始化方式:
1.静态初始化

int[] a = { 1, 2, 3 };// 静态初始化基本类型数组;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;

2.默认初始化
定义好的数组会默认赋值(数字为0,字符为null,布尔为false)
3.动态初始化
数组的遍历
1.采用for循环
2.for-each(仅用于读取数组的值不能修改)

for (Object/*遍历打印数据的类型*/ temp/*临时变量,相当于i*/ : ss/*数组名*/) {
            System.out.println(temp);
        }

数组的拷贝

System.arraycopy(src/*源数组*/, srcPos/*源数组开始拷贝的position*/, dest/*目标数组*/, destPos/*目标数组开始接收的position*/, length/*拷贝长度*/);

抽象方法和抽象类
使用abstract修饰的方法,没有方法体只有声明。包含抽象方法的类就是抽象类。
通过abstract方法定义规范,要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
要点:

1. 有抽象方法的类只能定义成抽象类
2. 抽象类不能实例化,即不能用new来实例化抽象类。
/*Animal是抽象类*/
Animal a = new Cat();//这样是可行的
Animal a = new Animal; //这样编译有错
3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
4. 抽象类只能用来被继承。
5. 抽象方法必须被子类实现。

抽象方法的意义在于把方法的设计和实现分离了!

接口
接口就是比“抽象类”还“抽象”的“抽象类”。
接口中只有:常量,抽象方法。
接口的本质探讨
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。接口可以多继承
区别
1.普通类:具体实现
2.抽象类:具体实现,规范(抽象方法)
3.接口:规范!

内部类的概念
Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
a) 非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)

outer.inner in = new outer().new inner();

1.非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
2.非静态内部类不能有静态方法、静态属性和静态初始化块。
3.外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
4.成员变量访问要点:

1. 内部类里方法的局部变量:变量名。
2. 内部类属性:this.变量名。
3. 外部类属性:外部类名.this.变量名。

b) 静态内部类

outer2.inner2 temp = new outer2.inner2();

匿名内部类
只在特定场合调用一次的情况下使用

new  父类构造器(实参类表) /实现接口 () {
           //匿名内部类类体!
}
//实例1
this.addWindowListener(new WindowAdapter(){
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
);
//实例2
public class TestanonymouseInnerclass {
	public static void test(Inter tempTest) {
		tempTest.aaa();
	}
	
	public static void main(String[] args) {
		TestanonymouseInnerclass.test(new Inter() {//因为接口的方法肯定是要重写的,这里是定义了类体,然后传给test(Inter tempTest)中的tempTest
			@Override
			public void aaa() {
				// TODO Auto-generated method stub
				System.out.println("TestanonymouseInnerclass.main(...).new test() {...}.aaa()");
			}
			
		});
	}
}
interface Inter{
	void aaa();
}

String基础

String str10 = "xyzc";
String str11 = "xyzc";
String str12 = new String("xyzc");

System.out.println(str10 == str11);//true
System.out.println(str10 == str12);//false
System.out.println(str10.equals(str12));//true	

java.util.Arrays
常用于:

1.显示一些常量,如整型
2.排序
3.搜索
4.填充
Arrays.fill(a,2,3,50);//这里是对数组a中将2到3的索引元素替换为50,注意是[2,3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值