如何学习Java

一、面向对象设计思想

1.面向对象:开车去新疆,车怎么去的我不管,我只调用车的go() 方法即可。

2.类和对象:类可以看成一类对象的模板,对象可以看成该类的一个具体实例。

3.类和类之间的关系:继承关系,Java只支持单继承;聚合关系(整体和部分,球员和球队);实现关系

4.对象是Java程序的核心,在Java程序中“”万事万物皆对象“”。对象可以看成成员变量和方法的封装体。

5.类的主要有定义有两方面组成:成员变量和方法。

6.变量:需要先声明再赋值,然后才能使用。

  • 成员变量可以使用Java语言中的任何一种数据类型。(包括基本类型和引用类型)
  • 在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。p.s.局部变量不会帮你初始化。
  • 成员变量的作用范围为整个类体

7.引用: 【一小块内存——> 一大块内存】

  • Java语言中除了基本的8种类型之外,变量类型都称之为引用类型。
  • Java种的对象是通过引用对其操作的。 引用类型内存分析:

8.如何在内存中区分类和对象:

  • 类是静态的概念,存放在代码区;
  • 对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中有不同的值(除了静态变量)。而方法只有一份,执行的时候才占用内存。

9.对象的创建和使用:

  • 必须使用new关键字创建对象。
  • 使用对象(引用) 。成员变量 来引用对象的成员变量
  • 使用对象(引用) 。方法(参数列表)来调用对象的方法。
  • 同一类的每个对象有不同的成员变量存储空间。
  • 同一类的每个对象共享该类的方法。非静态方法是针对每个对象进行调用。只要不是静态方法,就必须要new一个对象,然后才能调用。

10.类和对象的关系 【理解了内存,理解了一切】

11.构造方法(构造函数)

  • 使用new+构造方法,创建一个新的对象。
  • 构造函数是定义在Java类中的一个用来初始化对象的函数。
  • 构造函数与类同名且没有返回值。
public class Person {
int id;
int age;
//不能写void
Person(int _id,int _age){
id = _id;
age = _age;
}
}
  • 当没有指定构造函数时,编译器为类自动添加形如 类名(){ } 的构造函数。

12.约定俗成的命名规则:类名首字母大写;变量名和方法名的首字母小写;运用驼驼峰标识。

13.方法重载:一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。 p.s. 构造方法也可以构成重载。

    //重载:方法名相同,参数不同
//参数不同:1.参数个数不同;2.参数类型不同
void max(int a ,int b){
System.out.println(a>b?a:b);
} void max(double a,double b){
System.out.println(a>b?a:b);
}

14.this关键字 【指向当前对象的引用】

  • 在类的方法定义中使用的this关键字代表使用该方法的对象的引用。
  • 当必须指出当前使用方法的对象是谁时要使用this。如:this.x = x;
  • 有时使用this可以处理方法中成员变量和参数重名的情况。
  • this可以看作是一个变量,它的值是当前对象的引用。

    p.s. 当不知道一个变量是谁的变量时,找最近的那个声明变量的。

15.static关键字

  • 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化。对于该类的所有对象来说,static成员变量只有一份。 静态变量存放在内存中的data seg 数据区。
  • 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。p.s. 静态方法不再是针对某个对象调用,所以不能访问非静态成员。
  • 可以通过对象引用或类名(不需要实例化)访问静态成员。

16.package和import语句

  • 为便于管理大型软件系统中数目众多的类,解决类的名名冲突问题,Java引入包package机制,提供类的多重命名空间。
  • package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。若缺省该语句,则指定为无包名。
  • Java编译器把包对应于文件系统的目录管理,package语句中,用‘.’来指明包的层次,例如使用语句 package cn.guet ,则该文件中所有的类位于 .\cn\guet 目录下。

17.类的继承

  • Java中使用extends关键字实现类的继承机制。
  • 通过继承,子类自动拥有父类的所有成员变量和方法。
  • Java只支持单继承,不允许多继承。一个子类只能有一个父类,一个父类可以有多个子类。

18.访问控制

  • private类内部可以访问
  • protected类内部、同一个包、子类可以访问。
  • public类可以在任意地方被访问。
  • default类只可以被同一个包内部的类访问。

19.方法的重写

  • 在子类中可以根据需要对从父类中继承来的方法进行重写。
  • 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
  • 重写方法不能使用比被重写方法更严格的访问权限。

20.super关键字:Java类中使用super来引用父类的成分。指向父类的引用。

21.继承中的构造方法:

  • 子类的构造过程中必须调用父类的构造方法。
  • 子类可以在自己的构造方法中使用 super(arugment_list)调用基类的构造方法。
    • 使用this(arugment_list)调用本类的另外的构造方法
    • 如果调用super,必须写在子类构造方法的第一行。
  • 如果子类的构造方法中没有显示地调用父类的构造方法,则系统默认调用父类无惨的构造方法。
  • 如果子类构造方法中没有显式调用父类构造方法,而父类中又没有无参的构造方法,则编译错误。
    public ChildClass() {
//调用父类的构造方法
super();
System.out.println("子类的构造方法");
}

22.Object类:Object类是所有类的根基类。如果类的声明未使用extends关键字指明其父类,默认父类为Object类。

23.equals方法:对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。在String等类的中,重写了其equals方法。

24.对象转型:

  • 一个基类的引用类型变量可以“指向”其子类的对象。
  • 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
  • 可以使用 引用变量 instanceof 类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
  • 子类的对象可以当做基类的对象来使用称作向上转型,反之则称为向下转型。

25.动态绑定和多态

  • 动态绑定是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。就是重写了父类的方法,new的是哪个就去调用哪个的方法。
  • 多态的存在要有三个必要条件: p.s.条件一旦满足,调用父类中被重写的方法的时候,实际当中new的是哪个子类对象,就调哪个子类对象的方法。
    • 要有继承
    • 要有重写
    • 父类引用指向子类对象

26.抽象类:

  • 用abstract关键字来修饰一个类时;这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法。
  • 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承。抽象方法必须被重写。
  • 抽象类不能被实例化。
  • 抽象方法只需声明,而不需实现。

27.final关键字

  • final的变量的值不能够被改变。
  • final的方法不能够被重写。
  • final的类不能够被继承。

28.接口

  • 多个无关的类可以实现同一个接口
  • 一个类可以实现多个无关的接口
  • 与继承关系类似,接口与实现类之间存在多态性。
  • 接口中定义的变量默认是 public static final
  • 接口中的方法只能是抽象方法,写不写abstract都是抽象,而且是public

29.内部类的好处

  • 可以方便的访问包装类的成员。
  • 可以更清晰的组织逻辑,防止不应该被其他类访问的类进行访问。
  • 何时使用:该类不允许或不需要其他类进行访问时。

二、反射机制

1.程序执行的过程

ClassLoader的类加载机制:并非一次加载,需要的时候加载(运行期间动态的加载)。static语句在加载后执行一次,动态语句块每次new新的对象都会执行。

2.JDK内置的ClassLoader

  • bootstrap Class Loader 最顶层的类加载器,用本地语言写的。加载JDK核心的类
  • extesion class loader 从jre/lib/ext 加载类
  • application class loader 加载用户自定义的类
  • other class loaders 其他的类加载器

3.JDK Class Loader的层次关系(不是继承)

        try {
// forName方法会使用类加载器将Person加载进来
Class clazz = Class.forName("cn.guet.Person");
Person person = (Person) clazz.newInstance();
Method[] methods = clazz.getMethods();
for(Method m:methods){
if(m.getName().equals("print")){
// invoke :带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
m.invoke(person);
}
}
} catch (Exception e) {
e.printStackTrace();
}

J2SE学习笔记的更多相关文章

  1. GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  2. 非常详细GC学习笔记

    转载:http://blog.csdn.net/fenglibing/article/details/6321453 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转 ...

  3. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  4. 很具体GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  5. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  6. JVM调优- 学习笔记(转)

    http://blog.csdn.net/fenglibing/article/details/6321453 GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就 ...

  7. [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. Java学习笔记之---入门

    Java学习笔记之---入门 一. 为什么要在众多的编程语言中选择Java? java是一种纯面向对象的编程语言 java学习起来比较简单,适合初学者使用 java可以跨平台,即在Windows操作系 ...

  9. Java程序设计学习笔记(一)

    时间:2015-6-2 23:04 程序员,程序猿,程序媛,码农 -------------------------------------------------------   --Java的应用 ...

随机推荐

  1. Android破解学习之路(十)—— 我们恋爱吧 三色绘恋 二次破解

    前言 好久没有写破解教程了(我不会告诉你我太懒了),找到一款恋爱游戏,像我这样的宅男只能玩玩恋爱游戏感觉一下恋爱的心动了.. 这款游戏免费试玩,但是后续章节得花6元钱购买,我怎么会有钱呢,而且身在吾爱 ...

  2. nginx系列1:认识nginx

    nginx介绍 nginx是什么呢?可以看下官方网站的定义: nginx [engine x] is an HTTP and reverse proxy server, a mail proxy se ...

  3. 深入理解JavaScript作用域和作用域链

    前言 JavaScript 中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! ...

  4. 【20190304】JavaScript-知识点总结:Set,异或

    ES6新特性:Set ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS ...

  5. 小记 xian80 坐标转换 wgs84

    转坐标这个问题是个老生常谈的话题了. 昨天遇到同事求助将 xian80的平面坐标转换到2000下. 想了一下,因为暂时还没有现成的2000的dwg数据可用,只能暂时以wgs84的为准了,然而有个问题, ...

  6. 安卓手机如何快速投屏到windows(10/8.1/7)电脑上

    前提: 手机和电脑连接的网络必须在同一局域网下. 优势: 手机和电脑不需要下载对应平台的应用,完全使用全系统自带功能. 附加: 以下演示是安卓手机和windows操作系统电脑,并且win10和win1 ...

  7. MongoDB:数据库介绍与基础操作

    二.部署在本地服务器 在上次的学习过程中,我们主要进行了MongoDB运行环境的搭建和可视化工具的安装.此次我们将学习MongoDB有关的基本概念和在adminmongo上的基本操作.该文档中的数据库 ...

  8. Kafka相关内容总结(概念和原理)

    说明 主要内容是在网上的一些文章中整理出来: 加粗的字体是比较重要的内容,部分是自己的经验和理解: 整理的目的主要是为了方便查阅: 为什么需要消息系统 解耦: 在项目启动之初来预测将来项目会碰到什么需 ...

  9. 伙伴系统之伙伴系统概述--Linux内存管理(十五)

    在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, ...

  10. easyUI行删除

    function removeRow(target,number) { if (number) { var index = getRowIndex(target); $datagrid.datagri ...