网站建设与维护成本,wordpress做博客什么主题好,自己开发网站要多少钱,最好的在线影视免费认识类 类是用来对一个实体 ( 对象 ) 来进行描述的#xff0c;主要描述该实体(对象)具有哪些属性(外观尺寸等)#xff0c;哪些功能(用来干啥) 类中包含的内容称为 类的成员。属性主要是用来描述类的#xff0c;称之为 类的成员属性或者 类成员变量。方法主要说明类具有哪些功…认识类 类是用来对一个实体 ( 对象 ) 来进行描述的主要描述该实体(对象)具有哪些属性(外观尺寸等)哪些功能(用来干啥) 类中包含的内容称为 类的成员。属性主要是用来描述类的称之为 类的成员属性或者 类成员变量。方法主要说明类具有哪些功能称为 类的成员方法。 在 java 中定义类时需要用到 class 关键字。 语法 class为定义类的关键字ClassName为类的名字{}中为类的主体。 类名注意采用大驼峰定义 成员前写法统一为 public. 此处写的方法不带 static 关键字. public class Dog { //定义类//类的成员属性public String name;//名字public int age;//年龄public String color;//颜色//类的成员方法//吃饭public void eat(){System.out.println(摇尾巴);}//叫声public void bark(){System.out.println(汪汪汪);}
} 1. 一般一个文件当中只定义 一个类 2. main方法所在的类一般要使用public修饰(注意Eclipse默认会在public修饰的类中找main方法) 3. public修饰的类必须要和文件名相同 类的实例化 定义了一个类就相当于在计算机中定义了一种新的类型与intdouble类似只不过int和double是java语言自带的内置类型而类是 用户自定义了一个新的类型有了这些自定义的类型之后就可以使用这些类来定义实例(或者称为对象)。 用类类型创建对象的过程称为类的实例化在java中采用 new关键字配合类名来实例化对象。 语法 objectName 是为新创建的对象指定的变量名 new 关键字用于创建一个对象的实例. 使用 “ . ”来访问对象中的属性和方法. 对象名.类的成员名 同一个类可以创建多个实例 类和对象的说明 1. 类只是一个 模型一样的东西用来对一个实体进行描述限定了类有哪些成员. 2. 类是一种自定义的类型可以用来定义变量. 3. 一个类可以实例化出多个对象 实例化出的对象 占用实际的物理空间存储类成员变量 类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图。 public static void main(String[] args){//类的实例化2Dog dognew Dog();dog.name大黄;dog.age3;dog.coloryellow;dog.eat();//类的实例化3Dog dog2new Dog();dog2.name黑虎;dog2.age5;dog2.colorblack;dog2.bark();} this引用 当 形参名与成员变量名相同根据 就近原则出现错误 this 引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) 在成员方法中所有成员变量的操作都是通过该 引用去访问。 1. this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型 2. this只能在成员方法中使用 3. 在成员方法中this只能引用当前对象不能再引用其他对象 4. this是“成员方法”第一个隐藏的参数编译器会自动传递在成员方法执行时编译器会负责将调用成员方法对象的引用传递给该成员方法this负责来接收。 对象的构造及初始化 构造方法 构造方法(也称为构造器)是一个特殊的成员方法 完成一个对象的构造分两步 1.分配内存 2.调用合适的构造方法 所以构造方法的作用就是对对象中的成员进行初始化并不负责给对象开辟空间。 名字必须与类名相同 没有返回值类型设置为void也不行 一般情况下使用public修饰 在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用 一次 构造方法之间可以构成方法重载(用户根据自己的需求提供不同参数的构造方法) 名字相同参数列表不同因此构成了方法重载 public class Dog { //定义类//类的成员属性public String name;//名字public int age;//年龄public String color;//颜色//无参构造方法public Dog(){// 1// 无参构造方法--内部给各个成员赋值初始值该部分功能与三个参数的构造方法重复// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法// 但是this(小灰,6,yellow);必须是构造方法中第一条语句this(小灰,6,yellow);// //2// this.name小灰;// this.age6;// this.coloryellow;}//带三个参数的构造方法public Dog(String name,int age,String color){this.namename;this.ageage;this.colorcolor;}//打印public void Print(){System.out.println(name:this.name age:this.age color:this.color);}public static void main(String[] args){//此次创建一个Dog类型的对象并没有显示调用构造方法Dog dog5new Dog();//Dog()构造方法被调用dog5.Print();Dog dog6new Dog(小白,9,black);//Dog(String,int,String)构造方法被调用dog6.Print();}
} this();调用当前类的其他构造方法只能在当前的构造方法内部第一行使用 this.field 访问当前对象的属性 this.method() 调用当前对象的方法 this();调用不能形成环 //errpublic Dog() {this(小灰,6,yellow);}public Dog(String name,int age,String color){this();}//无参构造器调用三个参数的构造器而三个参数构造器有调用无参的构造器形成构造器的递归调用//编译报错java: 递归构造器调用 默认初始化 在Java方法内部定义一个局部变量时必须要初始化否则会编译失败 public static void main(String[] args){int a;System.out.println(a);
}//error java: 可能尚未初始化变量a 但我们发现成员变量未初始化仍然可以编译成功这是为什么 public static void main(String[] args){Dog dog4new Dog();System.out.println(name:dog4.name age:dog4.age color:dog4.color);
} 当成员变量未初始化时 引用类型一般默认为null 基本类型一般为自己的0值 一个类中无构造方法java会自动提供一个不带参数的构造方法 只要有一个构造方法java不提供任何构造方法 我们发现当我们删去无参构造方法时因为有带三个参数构造方法的存在编译器不提供任何构造方法因此在main方法中调用Dog时出现错误 Classname objectname new ClassName() ; 在程序层面只是简单的一条语句在JVM层面需要做好多事情如下 1. 检测对象对应的类是否加载了如果没有加载则加载 2. 为对象分配内存空间 3. 处理并发安全问题 比如多个线程同时申请对象JVM要保证给对象分配的空间不冲突 4. 初始化所分配的空间 即对象空间被申请好之后对象中包含的成员已经设置好了初始值 数据类型 默认值 byte0char \u0000short0int0long0Lbooleanfalsefloat0.0fdouble0.0referencenull 5. 设置对象头信息 6. 调用构造方法给对象中各个成员赋值 就地初始化 在声明成员变量时就直接给出了初始值。 代码编译完成后编译器会将所有给成员初始化的这些语句添加到各个构造函数中 封装 封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互 private 封装对类的成员进行隐藏通过关键字private只是对类外提供公开的接口 意义可以隐藏类的实现细节从而达到安全性。 范围只能在当前类中使用 如果成员被private封装怎样在当前类外使用 可以使用get方法获取set方法修改通过调用get方法和set方法从而达到在类外使用被private封装的成员。 快速生成方法的快捷步骤 public class Dog {private String name;//名字private int age;//年龄public String color;//颜色//获取name成员public String getName() {return name;}//修改name成员public void setName(String name) {this.name name;}//获取age成员public int getAge() {return age;}//修改age成员public void setAge(int age) {this.age age;}
}class test{public static void main(String[] args) {Dog dognew Dog();dog.setName(大黄);//调用setName方法修改name成员System.out.println(dog.getName());//调用getName方法获取name成员dog.setAge(8);//调用setAge方法修改age成员System.out.println(dog.getAge());//调用setAge方法获取age成员}
} 访问限定符 主要限定类或者类中成员能否在类外或者其他包中被访问。 Java中主要通过类和访问权限来实现封装 1. 类可以将数据以及封装数据的方法结合在一起 2. 访问权限用来控制方法或者字段能否直接在类外使用 范围/访问限定符privatedefaultprotectedpublic同一包中的同一类是是是是同一包中的不同类是是是不同包中的子类是是不同包中的非子类是 public可以理解为一个人的外貌特征谁都可以看得到 default: 对于自己家族中(同一个包中)不是什么秘密对于其他人来说就是隐私了 private只能在当前类中使用 protected主要是用在继承中 default权限指什么都不写时的默认权限 访问权限除了可以限定类中成员的可见性也可以控制类的可见性 封装扩展之包 包的概念 为了更好的管理类把 多个类收集在一起成为一组称为软件包。 包是对类、接口等的封装机制的体现是一种对类或者接口等的很好的组织方式 在同一个工程中允许存在 相同名称的类只要处在不同的包中即可 常见包 1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。 2. java.lang.reflect:java 反射编程包; 3. java.net:进行网络编程开发包。 4. java.sql:进行数据库开发的支持包。 5. java.util:是java提供的工具程序包。(集合类等) 非常重要 6. java.io:I/O编程开发包。 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如Date类 1. 使用 完整类名java.util.Date 导入 java.util 这个包中的 Date类 2. 使用 import语句导入包. 3. 如果需要使用 java.util 中的其他类, 可以使用 import java.util.* 但util 和 sql 中都存在一个 Date 这样的类, 同时使用时就会出现歧义, 编译出错 这时我们可以使用 完整的类名解决引用不明确这个问题 使用 import static导入包中静态的方法和字段 import static java.lang.Math.*;//导入java.lang.Math中的所有类
public class Test {public static void main(String[] args) {double x3;double y4;double aMath.sqrt(Math.pow(x,2)Math.pow(y,2)); //a5double bsqrt(pow(x,2)pow(y,2));//静态导入 //b5System.out.println(a);System.out.println(b);
} import 和 C 的 #include 差别很大. C 必须使用 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便. import 更类似于 C 的 namespace 和 using 自定义包 基本规则 1. 在文件的最上方加上一个 package 语句指定该代码在哪个包中. 2. 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ). 3. 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码. 4. 如果一个类没有 package 语句, 则该类被放到一个默认包中. 操作步骤 1. 在 IDEA 中先新建一个包: 右键 src - 新建 - 包 2. 在弹出的对话框中输入包名, 例如 com.bit.demo1 3. 在包中创建类, 右键包名 - 新建 - 类, 然后输入类名即可 包的访问权限控制举例 package com.bit.demo1;public class Dog {private String name;//名字private int age;//年龄public String color;//颜色String sex;//default属性public Dog(String name,int age,String color,String sex){this.namename;this.ageage;this.colorcolor;this.sexsex;}//吃饭private void eat(){System.out.println(摇尾巴);}//叫声public void bark(){System.out.println(汪汪汪);}//睡觉void sep(){System.out.println(睡觉);}public static void main(String[] args) {Dog dognew Dog(大黄,3,yellow,男);System.out.println(dog.name);System.out.println(dog.age);System.out.println(dog.color);System.out.println(dog.sex);dog.eat();dog.bark();dog.sep();}
} package com.bit.demo1;public class TestDog {public static void main(String[] args) {Dog dognew Dog(大黄,3,yellow,男);System.out.println(dog.color);// System.out.println(dog.name);//err name是私有的不允许被其他类访问System.out.println(dog.sex);// sex是default允许被同一包中的不同类访问dog.bark();// dog.eat();//errdog.sep();}
} package com.bit.demo2;
import com.bit.demo1.Dog;
public class TestDog {public static void main(String[] args) {Dog dognew Dog(大黄,3,yellow,男);System.out.println(dog.color);// System.out.println(dog.name);//err name是私有的不允许被其他类访问// System.out.println(dog.sex);//err sex是default不允许被其他包中的类访问dog.bark();// dog.eat();//err// dog.sep();//err}
} static 成员 在Java中 被 static 修饰的成员称之为 静态成员也可以称为 类成员其不属于某个具体的对象是所有对象所 共享的。 public class Dog {//非静态成员变量public String name;//名字public int age;//年龄public String color;//颜色//静态成员变量类成员private static String species;public Dog(String name, int age, String color) {this.name name;this.age age;this.color color;}public void print(){System.out.println(name:this.name age:this.age color:this.color species:Dog.species);}public static void main(String[] args) {Dog.species中华田园犬;Dog dog1 new Dog(大黄,1,yellow);dog1.print();Dog dog2 new Dog(小灰,2,black);dog2.print();Dog dog3 new Dog(小白,3,brown);dog3.print();}
} static只能修饰成员变量 一般类中的数据成员都设置为 private而成员方法设置为public 【静态成员变量类变量特性】 1. 不属于某个具体的对象是 类变量所有对象共享的不存储在某个对象的空间中 2. 既可以通过 对象访问也可以通过 类名访问但一般更推荐使用类名访问 3. 类变量存储在 方法区当中 4. 生命周期伴随类的一生(即随类的加载而创建随类的卸载而销毁) 【静态成员方法特性】 1. 不属于某个具体的对象是 类方法 2. 可以通过 对象调用也可以通过 类名 .静态方法名(...)方式调用更推荐使用后者 3. 不能 直接在 静态方法中访问任何 非静态成员变量或者调用 非静态成员方法。 可以通过 对象在静态方法中访问 非静态成员变量或者调用 非静态成员方法 非静态方法有this参数在静态方法中调用时无法传递this引用所以static方法中不能使用this 4.静态方法无法重写不能用来实现多态 public class Dog {//非静态成员变量public String name;//名字public int age;//年龄public String color;//颜色//静态成员变量类成员private static String species;//非静态成员方法public void eat(){System.out.println(摇尾巴);}//静态成员方法类成员public static void sleep(){System.out.println(睡觉);//age10;//err 无法从静态上下文中引用非静态 变量 age//eat();//err 无法从静态上下文中引用非静态方法 eat()Dog dognew Dog();System.out.println(dog.name小花);dog.eat();}public static void main(String[] args) {//通过对象访问Dog dog0new Dog();System.out.println(dog0.species中华田园犬);dog0.sleep();//通过类名访问System.out.println(Dog.species猎犬);Dog.sleep();}
} 代码块 代码块概念以及分类 使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字又可分为以下四种 1. 普通代码块 普通代码块通常指的是由大括号 {} 包围的一段代码它定义了一组可以一起执行的语句。这种代码块可以出现在方法体内部也可以作为 if、 else、 for、 while、 do-while 等控制流语句的一部分。 2. 构造块 定义在类中的代码块(不加修饰符)。也叫 实例代码块。 构造代码块一般用于初始化实例成员变量 实例代码块只有在 创建对象时才会执行 3. 静态块 使用static定义的代码块称为静态代码块。 一般用于初始化静态成员变量。 静态代码块不管生成多少个对象其 只会执行一次 静态成员变量是类的属性因此是在JVM加载类时开辟空间并初始化的 如果一个类中包含多个静态代码块在编译代码时编译器会按照定义的先后次序依次执行(合并) 静态代码块只要类被加载就会被执行 public class Dog {//非静态成员变量public String name;//名字public int age;//年龄public String color;//颜色//静态成员变量类成员private static String species;//构造代码块(实例代码块{this.name小黑;this.age2;this.coloryellow;System.out.println(这是实例代码块);}//静态代码块static {species牧羊犬;System.out.println(这是静态代码块);}static {species运动犬;System.out.println(这是静态代码块2);}//构造方法public Dog() {this.name name;this.age age;this.color color;System.out.println(这是构造方法);}public void print(){System.out.println(name:this.name age:this.age color:this.color species:Dog.species);}public static void main(String[] args) {Dog dog1 new Dog();dog1.print();Dog dog2 new Dog();dog2.print();
} 根据编译结果我们可以得到 运行时执行顺序为静态代码块 实例代码块 构造方法 静态代码块只执行一次 public static void main(String[] args) {System.out.println(Dog.species);
} 当我们只加载类时静态代码块就会被执行而实例代码块只有在创建对象时才会执行 4. 同步代码块后续讲解多线程部分再谈