为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
Java入门第二季 升级版_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

Java入门第二季 升级版

IMOOC老齐 全栈工程师
难度入门
时长 4小时 0分
  • 属性 与 变量(方法中)
    查看全部
  • 方法的重写 与 重载
    查看全部
  • 用import导入新的包下的类,如包名:

    com.imoc

    com.imoc.sconed

    且只在新的包中建立一个类

    import导入相同的类

    用语句import com.imoc.seconed.Telphone;可以导入子包中的类,让后创建对象,进行引用;

    但是用语句import.com.imoc.seconed.*运行的并不是import com.imoc.seconed.Telphone;中的类。而是运行import com.imoc.Telphone;

    java中创建对象就是一个实现与该类同名的方法,该方法当没有创建时,系统自动给该类创建一个,


    查看全部
  • 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!

    查看全部
  • 访问控制修饰符

    Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

    • default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

    • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

    • public : 对所有类可见。使用对象:类、接口、变量、方法

    • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

    我们可以通过以下表来说明访问权限:

    访问控制
    修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
    publicYYYYY
    protectedYYYY/N(说明N
    defaultYYYNN
    privateYNNNN

    默认访问修饰符-不使用任何关键字

    使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。

    如下例所示,变量和方法的声明可以不使用任何修饰符。

    实例

    String version = "1.5.1";boolean processOrder() {   return true;}

    私有访问修饰符-private

    私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private

    声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。

    Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。

    下面的类使用了私有访问修饰符:

    public class Logger {   private String format;   public String getFormat() {      return this.format;   }   public void setFormat(String format) {      this.format = format;   }}

    实例中,Logger 类中的 format 变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个 public 方法:getFormat() (返回 format的值)和 setFormat(String)(设置 format 的值)

    公有访问修饰符-public

    被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。

    如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。

    以下函数使用了公有访问控制:

    public static void main(String[] arguments) {   // ...}

    Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类。

    受保护的访问修饰符-protected

    protected 需要从以下两个点来分析说明:

    • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;

    • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。

    protected 可以修饰数据成员,构造方法,方法成员,不能修饰类(内部类除外)

    接口及接口的成员变量和成员方法不能声明为 protected。 可以看看下图演示:

    5cbc12f60001754700020015.jpg

    子类能访问 protected 修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。

    下面的父类使用了 protected 访问修饰符,子类重写了父类的 openSpeaker() 方法。

    class AudioPlayer {   protected boolean openSpeaker(Speaker sp) {      // 实现细节   }} class StreamingAudioPlayer extends AudioPlayer {   protected boolean openSpeaker(Speaker sp) {      // 实现细节   }}

    如果把 openSpeaker() 方法声明为 private,那么除了 AudioPlayer 之外的类将不能访问该方法。

    如果把 openSpeaker() 声明为 public,那么所有的类都能够访问该方法。

    如果我们只想让该方法对其所在类的子类可见,则将该方法声明为 protected。


    查看全部
  • Java 包(package)

    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。

    包的作用

    • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

    • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

    • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

    Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

    包语句的语法格式为:

    package pkg1[.pkg2[.pkg3…]];

    例如,一个Something.java 文件它的内容

    package net.java.util;public class Something{   ...}

    那么它的路径应该是 net/java/util/Something.java 这样保存的。 package(包) 的作用是把不同的 java 程序分类保存,更方便的被其他 java 程序调用。

    一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。

    以下是一些 Java 中的包:

    • java.lang-打包基础的类

    • java.io-包含输入输出功能的函数

    开发者可以自己把一组类和接口等打包,并定义自己的包。而且在实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。

    由于包创建了新的命名空间(namespace),所以不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。


    创建包

    创建包的时候,你需要为这个包取一个合适的名字。之后,如果其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。

    包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。

    如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。

    例子

    让我们来看一个例子,这个例子创建了一个叫做animals的包。通常使用小写的字母来命名避免与类、接口名字的冲突。

    在 animals 包中加入一个接口(interface):

    Animal.java 文件代码:

    /* 文件名: Animal.java */package animals; interface Animal {   public void eat();   public void travel();}

    接下来,在同一个包中加入该接口的实现:

    MammalInt.java 文件代码:

    package animals; /* 文件名 : MammalInt.java */public class MammalInt implements Animal{   public void eat(){      System.out.println("Mammal eats");   }   public void travel(){      System.out.println("Mammal travels");   }   public int noOfLegs(){      return 0;   }   public static void main(String args[]){      MammalInt m = new MammalInt();      m.eat();      m.travel();   }}

    然后,编译这两个文件,并把他们放在一个叫做animals的子目录中。 用下面的命令来运行:

    $ mkdir animals
    $ cp Animal.class  MammalInt.class animals
    $ java animals/MammalIntMammal eatsMammal travel

    import 关键字

    为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 "import" 语句可完成此功能。

    在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为:

    import package1[.package2…].(classname|*);

    如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。

    例子

    下面的 payroll 包已经包含了 Employee 类,接下来向 payroll 包中添加一个 Boss 类。Boss 类引用 Employee 类的时候可以不用使用 payroll 前缀,Boss类的实例如下。

    Boss.java 文件代码:

    package payroll; public class Boss{   public void payEmployee(Employee e)   {      e.mailCheck();   }}

    如果 Boss 类不在 payroll 包中又会怎样?Boss 类必须使用下面几种方法之一来引用其他包中的类。

    使用类全名描述,例如:

    payroll.Employee

    用 import 关键字引入,使用通配符 "*"

    import payroll.*;

    使用 import 关键字引入 Employee 类:

    import payroll.Employee;

    注意:

    类文件中可以包含任意数量的 import 声明。import 声明必须在包声明之后,类声明之前。


    package 的目录结构

    类放在包中会有两种主要的结果:

    • 包名成为类名的一部分,正如我们前面讨论的一样。

    • 包名必须与相应的字节码所在的目录结构相吻合。

    下面是管理你自己 java 中文件的一种简单方式:

    将类、接口等类型的源码放在一个文本中,这个文件的名字就是这个类型的名字,并以.java作为扩展名。例如:

    // 文件名 :  Car.java package vehicle; public class Car {   // 类实现  }

    接下来,把源文件放在一个目录中,这个目录要对应类所在包的名字。

    ....\vehicle\Car.java

    现在,正确的类名和路径将会是如下样子:

    • 类名 -> vehicle.Car

    • 路径名 -> vehicle\Car.java (在 windows 系统中)

    通常,一个公司使用它互联网域名的颠倒形式来作为它的包名.例如:互联网域名是 runoob.com,所有的包名都以 com.runoob 开头。包名中的每一个部分对应一个子目录。

    例如:有一个 com.runoob.test 的包,这个包包含一个叫做 Runoob.java 的源文件,那么相应的,应该有如下面的一连串子目录:

    ....\com\runoob\test\Runoob.java

    编译的时候,编译器为包中定义的每个类、接口等类型各创建一个不同的输出文件,输出文件的名字就是这个类型的名字,并加上 .class 作为扩展后缀。 例如:

    // 文件名: Runoob.java package com.runoob.test;public class Runoob {      }class Google {      }

    现在,我们用-d选项来编译这个文件,如下:

    $javac -d . Runoob.java

    这样会像下面这样放置编译了的文件:

    .\com\runoob\test\Runoob.class.\com\runoob\test\Google.class

    你可以像下面这样来导入所有 \com\runoob\test\ 中定义的类、接口等:

    import com.runoob.test.*;

    编译之后的 .class 文件应该和 .java 源文件一样,它们放置的目录应该跟包的名字对应起来。但是,并不要求 .class 文件的路径跟相应的 .java 的路径一样。你可以分开来安排源码和类的目录。

    <path-one>\sources\com\runoob\test\Runoob.java<path-two>\classes\com\runoob\test\Google.class

    这样,你可以将你的类目录分享给其他的编程人员,而不用透露自己的源码。用这种方法管理源码和类文件可以让编译器和java 虚拟机(JVM)可以找到你程序中使用的所有类型。

    类目录的绝对路径叫做 class path。设置在系统变量 CLASSPATH 中。编译器和 java 虚拟机通过将 package 名字加到 class path 后来构造 .class 文件的路径。

    <path- two>\classes 是 class path,package 名字是 com.runoob.test,而编译器和 JVM 会在 <path-two>\classes\com\runoob\test 中找 .class 文件。

    一个 class path 可能会包含好几个路径,多路径应该用分隔符分开。默认情况下,编译器和 JVM 查找当前目录。JAR 文件按包含 Java 平台相关的类,所以他们的目录默认放在了 class path 中。


    查看全部
  • 局部变量具有优先级,Java中成员变量会被赋予一个初始值,而局部变量没有。

    查看全部
  • Java 封装


    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

    封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

    要访问该类的代码和数据,必须通过严格的接口控制。

    封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

    适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

    封装的优点

    • 1. 良好的封装能够减少耦合。

    • 2. 类内部的结构可以自由修改。

    • 3. 可以对成员变量进行更精确的控制。

    • 4. 隐藏信息,实现细节。


    实现Java封装的步骤

    1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

    public class Person {    private String name;    private int age;}

    这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

    2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

    public class Person{    private String name;    private int age;    public int getAge(){      return age;    }    public String getName(){      return name;    }    public void setAge(int age){      this.age = age;    }    public void setName(String name){      this.name = name;    }}

    采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。


    查看全部
  • 方法可以用类名直接调用,而非静态成员变量只能通过类定义对象在调用。

    查看全部
  • Java 中可以通过初始化块进行数据赋值。如:

    在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

    需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。

    我们来看一段代码:

    运行结果:

    通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。


    查看全部
  • 本小节要点如下:

    1. 类重名时,可以使用package来管理

    2. 可以通过import关键字来引入某一特定类名【不常用】

    3. 通过星号可以引入包下面所有的类

    查看全部
  • 与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如:

    运行结果:

    需要注意:

    1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如:

    如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:

    2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如下所示:

    3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如:


    查看全部
  • //测试类
    package jjj;
    import java.util.Scanner;
    public class Initail {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println("欢迎使用哒哒租车系统");
            System.out.println("您是否要租车:1是 0否");
            Car[] allcar= {new PassengerCar("奥迪A4", 800, 4),new PassengerCar("大金龙", 500, 20),new Trunk("东风", 800, 20),new Trunk("解放",500, 10),new Pickup("皮卡", 800, 4,5)};
           Scanner input =new Scanner(System.in);
           int choice1=input.nextInt();
           if(choice1==1) {
               System.out.println("您可租的汽车及其报价表:");
               System.out.println("号\t汽车名称\t租金\t容量\t");
               for(int i=0;i< allcar.length;i++) {
                   System.out.println((i+1)+"\t"+allcar[i].toString());
               }
           }
           else if(choice1 != 1){
    
                System.out.println("感谢你的使用");
    
            }
           System.out.println("请输入需要租车的数量:");
           int choice2=input.nextInt();
           if(choice2<1) {
               System.out.println("数量有错,请重新输入");
               choice2=input.nextInt();
           }
           Car[] newcar = new Car[choice2];
           double bills =0;
           double zhuo =0;
           int zren =0;
           for(int i = 0; i < choice2; i++){
    
                System.out.println("请输入第"+ (i+1) + "辆车的序号");
    
                int choice3 = input.nextInt();
    
                if(choice3 > 5 || choice3 < 1){
    
                    System.out.println("目标不存在,请重新输入");
    
                    choice3 = input.nextInt();
    
                }
                newcar[i] = allcar[choice3 - 1];
           }
           
            System.out.println("请输入你要租的天数");
    
            int day = input.nextInt();
            for(int i = 0; i < choice2; i++){
    
                bills = newcar[i].getRent() * day + bills;
    
            }
            System.out.println("您的账单信息:");
            
            System.out.println("***可以载人的车有:");
            for(int i=0;i<choice2;i++) {
                if(newcar[i].getManned()!=0) {
                    System.out.print(newcar[i].getName()+"\t");
                    zren=zren+newcar[i].getManned();
                }
            }
            if( zren==0) System.out.println("无");
            else System.out.println("总载客人数:" + zren + "人");
            
            System.out.println("***可以载货的车有:");
    
            for(int i = 0; i < choice2; i++){
    
                if(newcar[i].getCargo() != 0 ){
    
                    System.out.print(newcar[i].getName()+"\t");
    
                    zhuo += newcar[i].getCargo();
    
                }
            }
            if(zhuo==0) System.out.println("无!");
            else System.out.println("总载货数:" + zhuo + "吨");
            
            System.out.println("总金额:"+ bills);
        }
    }
    
    //Car父类
    package jjj;
    
    public abstract class Car {
        private String name;
        private int rent;
        private int manned;
        private double cargo;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getRent() {
            return rent;
        }
        public void setRent(int rent) {
            this.rent = rent;
        }
        public int getManned() {
            return manned;
        }
        public void setManned(int manned) {
            this.manned = manned;
        }
        public double getCargo() {
            return cargo;
        }
        public void setCargo(double cargo) {
            this.cargo = cargo;
        }
        
    }
    
    //子类
    public class PassengerCar extends Car {
        public PassengerCar(String name,int rent,int manned) {
            this.setName(name);
            this.setRent(rent);
            this.setManned(manned);
        }
        public String toString() {
            return this.getName()+"\t"+this.getRent()+"/天 "+"\t"+"载人:"+this.getManned()+"\t";
        }
    }
    package jjj;
    
    public class Pickup extends Car {
        public Pickup(String name,int rent,int manned,double cargo) {
            this.setName(name);
            this.setRent(rent);
            this.setManned(manned);
            this.setCargo(cargo);
        }
        public String toString() {
            return this.getName()+"\t"+this.getRent()+"/天 "+"\t"+"载人:"+this.getManned()+" 载货:"+this.getCargo()+"吨"+"\t";
        }
    }
    
    package jjj;
    
    public class Trunk extends Car {
        public Trunk(String name,int rent,int cargo) {
            this.setName(name);
            this.setRent(rent);
            this.setCargo(cargo);
        }
        public String toString() {
            return this.getName()+"\t"+this.getRent()+"/天 "+"\t"+"载货:"+this.getCargo()+"\t";
        }
    }


    查看全部
  • 我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!

    Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~

    使用 static 可以修饰变量、方法和代码块

    我们先认识一下静态变量。

    例如,我们在类中定义了一个 静态变量 hobby ,操作代码如下所示:

    运行结果:

    要注意哦:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~


    查看全部
  • 成员变量和局部变量的区别

    5cb00d2900017f6112800720.jpg

    查看全部

举报

0/150
提交
取消
课程须知
本课程是Java开发的基础,需要大家:掌握 Java 基本语法的使用。如果您是新手,建议先移步 《Java入门第一季》https://www.imooc.com/learn/85
老师告诉你能学到什么?
• 掌握 Java 编程思路 • 熟练运用面向对象程序设计思想
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!