Java学习笔记(一)—— 基础概念篇

1. 方法重载

在Java中通过在类中写多个方法,这类方法的方法名相同,方法的参数列表不同(参数的个数和参数类型的不同)来实现方法的重载。所谓方法重载就是:在一个类中,有一系列的方法具有方法名相同,但参数列表不同,这类方法的实现就是方法重载。

public class Test {
    void f(int i) {
        System.out.println("i=" + i);
    }

    void f(float f) {
        System.out.println("f=" + f);
    }

    void f(String s) {
        System.out.println("s=" + s);
    }

    void f(String s1, String s2){
        System.out.println("s1+s2="+(s1+s2));
    }

    void f(String s, int i){
        System.out.println("s="+s+",i="+i);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.f(3456);
        test.f(34.56f);
        test.f("abc");
        test.f("abc","def");
        test.f("abc",3456);
    }
}

2. 对象

package com.people;

public class People {
//属性(成员变量)有什么
    double height;//身高
    int age;//年龄
    int sex;//性别
//方法 干什么
    void cry() {
        System.out.println("我在哭!");
    }
    void laugh() {
        System.out.println("我在笑!");
    }
    void printBaseMes() {
        System.out.println("我的身高是"+height+"cm");
        System.out.println("我的年龄是"+age+"岁");
        if(this.sex==0)
            System.out.println("我是男性!");
        else 
            System.out.println("我是女性!");
    }
//构造函数,初始化所有属性  
    public People(double h, int a, int s) {
        height = h;
        age = a;
        sex = s;
    }

    public static void main(String[] args) {
        //创建一个People对象LiLei,格式为:类名 对象名=new 类名();
        /*
        People LiLei = new People();
        LiLei.height = 170;
        LiLei.age = 20;
        LiLei.sex = 1;
        */
        
        //创建对象,调用我们自己定义的有参构造方法  ,格式为:类+对象名=new 构造方法/类名(参数);
        People XiaoMing = new People(168, 21, 1);
        XiaoMing.cry();
        XiaoMing.laugh();
        XiaoMing.printBaseMes();
    }
}
运行结果

3. 类

类和对象之间有什么关系吗?在上面的讲解中大家应该有些了解了。类就是对象的抽象(或者模板),对象就是类的具体(或者实例)。比如手机是一个抽象的概念,它代表着类。而一部 iphone 6 便是手机具象化处理的实体,也就是一个对象。

public class People {
//属性(成员变量) 有什么
    double height;  //身高
    int age;     //年龄
    int sex;    //性别,0为男性,非0为女性

//方法 干什么
    void cry(){
        System.out.println("我在哭!");
    }
    void laugh(){
        System.out.println("我在笑!");
    }
    void printBaseMes(){
        System.out.println("我的身高是"+height+"cm");
        System.out.println("我的年龄是"+age+"岁");
        if(this.sex==0)
            System.out.println("我是男性!");
        else 
            System.out.println("我是女性!");

    }
}

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:也叫静态变量,类变量也声明在类中,方法体之外,但必须声明为static类型。

4. Java三大特征之一——封装

  • 什么是封装?

封装是指,一种将抽象性函式接口的实例细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制,通过该类提供的方法来实现对隐藏信息的操作和访问。
我们在开汽车的时候,只用去关注如何开车,我们并不在意车子是如何实现的,这就是封装。

  • 如何实现?
  1. 修改属性的可见性,在属性的前面添加修饰符(private)
  2. 对每个值属性提供对外的公共方法访问,如创建 getter/setter(取值和赋值)方法,用于对私有属性的访问
  3. 在 getter/setter 方法里加入属性的控制语句,例如我们可以加一个判断语句,对于非法输入给予否定。
package com.newpeople;

public class NewPeople {
//属性(成员变量) 前面添加了访问修饰符private, 变成了私有属性,必须通过方法调用
    private double age;
    
//属性封装好后,用户调用属性需要用getter和setter方法调用,自己定义这两种方法
    public double getAge() {
//方法命名是get关键字加属性名(属性名首字母大写)
        return age;
    }
    public void setAge(double newAge) {
        age = newAge;
    }
    public static void main(String[] args) {
        //创建新的对象XiaoBai
        NewPeople XiaoBai = new NewPeople();
        //访问类里面私有的属性
        XiaoBai.setAge(20);
        System.out.println("XiaoBai age is: "+XiaoBai.getAge());
    }
}

5. 包

  • 有何作用?
  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 包采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。
  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
  • 如何使用?

比如我们要导入People这个类。import com.People,同时如果import com.People.*这是将包下的所有文件都导入进来,*是通配符。
注意:包的命名规范是全小写字母拼写。

6. 访问修饰符

修饰符 当前类 同一包内 子孙类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

7. 内部类

  • 什么是内部类?

可以将一个类的定义放在另一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类。

  • 有什么作用?
  • 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
  • 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  • 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
  • 内部类允许继承多个非接口类型
    注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
  • 成员内部类和静态内部类
  • 成员内部类不能含有static的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的。
  • 静态内部类通常被称为嵌套类。
package com.packaging;

//外部类Packaging
public class Packaging {
    private String name = "XiaoLi";     //定义外部类私有属性
    static String ID = "20201212";      //定义静态外部类属性
    
    //成员内部类Student
    public class Student{
        String ID = "20180119";         //定义内部类成员属性
        public void stuInfo() {         //定义内部类方法
            System.out.println("访问成员外部类中的name: " + name);
            System.out.println("访问成员内部类中的ID: " + ID);
        }   
    }
    
    //静态内部类Teacher
    public static class Teacher{
        String ID = "20151314";         //静态内部类属性
        public void teaInfo() {         //静态内部类方法
            //静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
            System.out.println("访问外部类中的name: " + (new Packaging().name));
            //如果外部类的静态成员与内部类的成员名称相同,可通过 类名.静态成员 访问外部类的静态成员
            System.out.println("访问静态外部类中的ID: " + Packaging.ID);
            System.out.println("访问静态内部类中的ID: " + ID);
        }
        
    }
    
    public static void main(String[] args) {
        //测试成员内部类
        Packaging a = new Packaging();  //创建外部类对象,对象名为a
        Student b = a.new Student();    //使用外部类对象创建内部类对象,对象名为b
        b.stuInfo();                    //调用内部对象的suInfo方法
        
        //测试静态内部类
        //创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类()
        Teacher c = new Teacher();      //直接创建内部类对象,对象名为c
        c.teaInfo();                    //调用静态内部类方法
        
    }
}
  • 局部内部类

局部内部类,是指内部类定义在方法和作用域内。

package com.packaging2;

//外部类Packaging2
public class Packaging2 {
    //定义在外部类中的方法内:
    public void peopleInfo() {
        final String sex = "man";       //外部类方法中的常量
        class Student{
            String ID = "20151314";     //内部中的常量
            public void print() {
                System.out.println("访问外部类的方法中的常量sex: " +sex);
                System.out.println("访问内部类中的变量ID:" + ID);
            }
        }
        Student a = new Student();      //创建方法内部类的变量
        a.print();                      //调用内部类的方法
    }
    
    //定义在外部类中的作用域内:
    public void peopleInfo2(boolean b) {
        if(b) {
            final String sex = "man";
            class Student{
                String ID = "20151314";
                public void print() {
                    System.out.println("访问外部类的方法中的常量sex: " +sex);
                    System.out.println("访问内部类中的变量ID:" + ID);
                }
            }
            Student a = new Student();
            a.print();
        }
    }
    
    public static void main(String[] args) {
        Packaging2 b = new Packaging2();
        System.out.println("定义在方法内:----------------");
        b.peopleInfo();
        System.out.println("定义在作用域内:--------------");
        b.peopleInfo2(true);
    }
}
  • 匿名内部类

匿名内部类,顾名思义,就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。

8. Java三大特征之一——继承

继承可以看成是类与类之间的衍生关系。比如狗类是动物类,牧羊犬类又是狗类。于是我们可以说狗类继承了动物类,而牧羊犬类就继承了狗类。于是狗类就是动物类的子类(或派生类),动物类就是狗类的父类(或基类)。
继承需要符合的关系是:父类更通用,子类更具体。
语法:class 子类 extends 父类

  • Animal.java
package com.animal;

public class Animal {
    public int legNum;
    
    public void speak(){
        System.out.println("我是动物!");
    }
    
    public Animal() {
        System.out.println("我是父类!");    
    }
}
  • Dog.java
package com.animal;

public class Dog extends Animal {
    
    public void speak(){
        System.out.println("I have " + legNum + " legs!");
        System.out.println("我是藏獒!");
    }
    
    public Dog() {
        System.out.println("我是子类!");
    }
    
    public static void main(String[] args) {
        Animal a = new Animal();
        Dog b = new Dog();
        Animal c = new Dog();
        
        System.out.println("------------");
        a.speak();
        System.out.println("------------");
        b.legNum = 4;
        b.speak();
        System.out.println("------------");
        c.speak();
        System.out.println("------------");
        new Dog();
        System.out.println("------------");
    }
}

运行结果

为什么当程序执行到a.speak();的时候,会有五个输出呢?
断点在1位置时

断点在2位置时.说明调用子类前,先调用父类

断点在3位置时.跟上图同理

9. Java三大特征之一——多态

多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态也称作动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。通俗地讲,多态只通过父类就能够引用不同的子类。
注:不能使用一个子类的引用去指向父类的对象。因此,向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法,也会覆盖与父类中相同的方法——重写。(方法名,参数都相同)

Animal a = new Animal();  //a是父类的引用指向的是本类的对象 
Animal b = new Dog();     //b是父类的引用指向的是子类的对象
  • Java多态实现三个条件:继承、重写和向上转型
  • 多太实现方式:
    继承父类进行方法重写,抽象类和抽象方法,接口实现。
  • 抽象方法&抽象类

抽象方法: 即只声明而没有方法(类似于C语言的在main函数前的函数声明), 例如: abstract void function
抽象类: 含有抽象方法的抽象类, 抽象方法一般在父类, 这里子类就可以去实现这些方法.

  • 创建抽象类:


    勾选abstract
  • Computer.java
package com.computer;
//注意:类声明\方法生命都要加入abstract
public abstract class Computer {
    public abstract void computerNum();
    public abstract void computerType();
    public abstract void computerEffect();
}
  • Laptop.java
package com.computer;

public class Laptop extends Computer{
    public void computerNum() {
        System.out.println("There are three laptop!");
    }
    
    public void computerType() {
        System.out.println("They are notebook computer!");
    }
    
    public void computerEffect() {
        System.out.println("They could be taken anywhere!");
    }
    
    public static void main(String[] args) {
        Computer cp = new Laptop();
        cp.computerNum();
        cp.computerType();
        cp.computerEffect();
    }
}
运行结果

部分内容转自实验楼

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • Unsupported major.minor version 51.0解决办法 具体步骤 解决:项目------...
    晨星资源阅读 596评论 0 1
  • 用这个来作图床,方便插入图片。1、设置环境路径和临时环境路径。set path = ...;%path%2、设置可...
    MikleLi阅读 395评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,632评论 18 399
  • 1.软件开发概述 软件生命周期软件生命周期:软件的产生到报废的整个过程软件生命周期内有:问题定义,可行性分析,总体...
    寒桥阅读 600评论 0 0
  • 每天5分钟,解决一个商业问题。欢迎收听《刘润·5分钟商学院》,实战篇。 又到周五了,今天我们来看一场热点比赛。最近...
    王彬成阅读 228评论 0 0