如何学习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. java实现字符串数字部分自增

    实现添加员工时对工号进行自增长 思路:后台获取数据库中最后一条员工数据的工号,对其进行自增再传入前端 mybatis映射文件:获取最后一条数据 <select id="getLastN ...

  2. 2019/1.6 Javascript Cookie

    cookie 就是一个1存放数据的东西,存储量很小(只有4KB),存放在客户端和应用设备上. 应用场景 用户注册,用户登录,购物车 chrome浏览器计算机存放cookie的位置 C:\Users\A ...

  3. 支持JSP和Servlet的Web服务器

    支持JSP和Servlet的Web服务器 1.Tomcat 服务器 目前非常流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servle ...

  4. Android注解神器 ButterKnife框架

    前言: 本人是一个只有几个月工作经验的码小渣.这是我写的第一篇博客,如有不足之处还请大家不要介意,还请大佬可以指出问题. 在这几个月的实战开发中自己也遇到了很多问题,真的是举步艰难啊!!! 在实战开发 ...

  5. 07-Vue的基础使用

    vue的介绍 前端框架和库的区别 nodejs的简单使用 vue的起步 指令系统 组件的使用 过滤器的使用 watch和computed 钩子函数 渐进式的JavaScript框架 vue react ...

  6. 使用docker swarm集群心得

    本片关于使用docker swarm 集群心得,也是一些经验吧!过程描述可能简单! 根据一些公司使用经历接收一下问题并针对问题作出应对策略 1.docker swarm集群 主节点数必须是单数,也就是 ...

  7. Django框架【form组件】

    from django.shortcuts import render,redirect # Create your views here. from .models import * from dj ...

  8. kubernetes-核心资源之Ingress

    1.Ingress 在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过Node ...

  9. spark推测执行的坑

    1.spark推测执行开启 设置 spark.speculation=true即可 2.spark开启推测执行的好处 推测执行是指对于一个Stage里面运行慢的Task,会在其他节点的Executor ...

  10. A. Points in Segments(cf a题, 水题)

    没什么好说的 #include<iostream> using namespace std; ], x, y,n, m, ans; int main(){ cin>>n> ...