栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaBean

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaBean

二:JavaBean

面向对象的三大特性: 封装 继承 多态

javabean规范:
   1.类是公共的
   2.至少提供一个空构造
   3.私有的属性
   4.公共的访问方式
   5.重写toString与equals方法
2.1 构造器

2.1.1 构造函数 构造方法

    作用: 为对象初始化信息(为对象的成员变量赋值)
    使用: 跟随new关键字一起使用,不能单独调用。
   注意:
   方法名称与当前类名一致;
   如果一个类中没有显示的定义构造器,编译器会自动默认提供一个空构造(没有参数的构造器)
   如果存在显示定义的构造器,编译器不会再为类型提供任何构造器了,包括空构造
   
   构造器中可以存在return,根据需求定义,实现提前结束构造器,但是不能带出返回值

public Dog(String dogName,int dogAge,String dogType){
    System.out.println("这是带参造......");
    if(dogAge<0){
        System.out.println("年龄不合法无法初始化...");
        return;
    }
package com.yjxxt.constructor02;

public class Class001_Constructor {
    public static void main(String[] args) {
        //先创建对象,后赋值
        //1.创建对象
        //Dog dog = new Dog();
            //2.赋值
    //dog.name = "花卷";
    //dog.age = 4;
    //dog.type = "二哈";
 
    //创建对象的同时为成员变量赋值
    Dog dog = new Dog("大白",-2,"萨摩");
        dog.lookDoor();
    //为对象的成员重新赋值
    dog.name = "小白";
    dog.lookDoor();
}
}
class Dog{
    public String name;
    public int age;
    public String type;
    //空构造

 
public Dog(String dogName,int dogAge,String dogType){
    System.out.println("这是带参造......");
    if(dogAge<0){
        System.out.println("年龄不合法无法初始化...");
        return;
    }
    name = dogName;
    age = dogAge;
    type = dogType;
}
 
public void lookDoor(){
    System.out.println(name+"正在看家...");
}
}

2.1.2 构造器的重载

两同三不同:

方法名,类名相同

参数列表类型,个数,列表不同

2.2 this
public Person(String name){//李四
    name=pname;
}

将通过带参构造器创建对象时传入的李四作为参数,将其赋值给p2对象的成员变量name。

2.2.1 this.的使用

this.代表当前对象的

this.不可省略,局部变量与成员变量同名的情况下,此时需要通过this.来代表对象的属性(对象的成员变量)

public String name;
public Person(String name){//李四
   this.name=name;//局部对象name,赋值给p2对象的成员变量name;
}

不存在同名问题时候,指代成员直接使用省略this.

public void eat(){
    System.out.println(this.name+"在吃饭");
}

2.2.2 this()的使用

在构造器的首行用来调用本类中其他构造器
    this(参数列表)
注意:
           不能多个构造器之间通过this相互调用
           this存储指代对象的地址
           在构造器中遇到this指代对象,默认代表当前new的对象
           在成员方法中的this默认指代调用成员方法的对象
           this不能使用在static修饰的方法中
2.3 static

2.3.1 static的使用

 
package com.yjxxt.oop;
public class Class01_Static {
    //成员
    static int a=1;
    int b=10;
    public static void main(String[] args){
        //局部
        int c=3;
        //类名调用静态内容
        System.out.println(Class01_Static.a);//a=1 类名.静态变量名
        Class01_Static.testStatic();//输出 静态方法   类名.静态方法名(参数列表)

        //对象
        Class01_Static cs=new Class01_Static();

        //只能通过对象调用成员
        System.out.println(cs.b);//10  对象.静态变量名
        cs.test();//成员方法  a=1,b=10   对象.静态方法名(参数列表)

        //对象调用静态内容
        System.out.println(cs.a);//1
        cs.testStatic();//静态方法

        testStatic();//静态方法
        cs.test();//成员方法  a=1,b=10
    }
    //静态方法
    public static void testStatic(){
        System.out.println("静态方法");
    }
    //成员方法
   public void test(){
       System.out.println("成员方法");
       System.out.println(a);
       System.out.println(b);
   }
}

2.3.2 static测试用例

 

package com.yjxxt.oop;

public class Class01_StaticTest {
    public static int id;
    public int age;
    public static void main(String[] args) {
        Class01_StaticTest cl = new Class01_StaticTest();//0x001

        System.out.println(Class01_StaticTest.id);   //0
        System.out.println(cl.age);   //0

        cl.change(); //id= 1  age= 0   //id= cl.age=1
        System.out.println(Class01_StaticTest.id); //1
        System.out.println(cl.id);  //1
        System.out.println(cl.age);  //age=0
        cl.change();  //
        System.out.println(id);  //2
        System.out.println(cl.age);  //2


    }
    public void change() {
        Class01_StaticTest cl = new Class01_StaticTest();//0x002    //0x003
        cl.age++;  //0
        Class01_StaticTest.id++;  //1
        System.out.println("In change(): id = " + id + " age = " + age);  //id= 1  age=0 //2   0
        System.out.println("In change(): id = " + id + " Class01_StaticTest.age = " +cl.age);
        //id=1  Cl.age= 1  // 2   1
    }
}
2.4 block块
block 块
    {} : 自成作用域
    分类:                                                         执行时机:
        {}定义在方法中|语句块中 --> 局部代码块                         跟随方法的调用
        {}定义在类中方法外 --->     构造块                            跟随new一起使用
        static{}定义在类中方法外--> 静态块                            类第一次加载
        同步块

2.4.1 block 的使用及分析

 
public class Class01_Block {
    static int i=10;
    String name;
    //静态块
    static {
        System.out.println("我是静态块1……");
    }
    static {
        System.out.println("我是静态块2……");
    }
    static {
        System.out.println("我是静态块3……");
    }
    //构造器
    public Class01_Block(){
        System.out.println("我是构造器");
    }
    public Class01_Block(String name){
        System.out.println("我是构造器");
        this.name=name;
    }
    //构造块
    {
        System.out.println("我是构造块1……");
        name="张三";
    }
    {
        System.out.println("我是构造块2……");
    }
    {
        System.out.println("我是构造块3……");
    }
    //main方法
    public static void main(String[] args) {
        //局部
        int i=5;
        //局部代码块
        {
            System.out.println("我是局部代码块中的代码……");
            i=1;
        }
        System.out.println(i);
        System.out.println( new Class01_Block("李四").name);
    }

}

2.4.2 block测试用例

package com.yjxxt.oop;

public class Class01_BlockTest {
    public static int a = 0;

    static {
        a = 6;
        System.out.println(" 、静态代码块执行a=" + a); //6
    }
    public Class01_BlockTest() {
        this(a); //this()是指向带参构造器的
        System.out.println(" 、"+a);  //10
        System.out.println(" 、无参构造方法执行a=" + a); //10
    }

    public Class01_BlockTest(int n) {
        {
            a = 10;
            System.out.println("  、非静态代码块执行a=" + a); //10
        }
        System.out.println(" 、"+n); //6
        System.out.println(" 、"+a);//10
    }
    public static void main(String[] args) {
        //先执行静态块
        System.out.println(" 、main"); //main
        Class01_BlockTest tsc = new Class01_BlockTest();
    }
}

2.5 Debug调试工具

2.5.1 Debug作用

Debug 调试工具 *****
​
作用:
   1.追踪程序的执行流程
   2.定位异常出现的位置
   3.观察程序执行过程中变量的变化情况
   4.根据追踪程序的执行流程学习第三方框架的源码

2.5.2 使用步骤

步骤:
   1.设置断点
      在行号的后面鼠标单击设置断点
   2.Debug运行
   3.debug运行模式下进行调试
      Step over F8 : 下一步跳过|略过
         如果下一步是方法的调用,不会跟随方法的调用执行,直接进入下一步
      Step into F7 : 步入 | 下一步进入
         如果下一步是自定义方法的调用,跟随方法的调用执行每一步
      Step out shift+f8 : 下一步调出
         如果在方法的内部,下一步直接调出到方法调用处
      Force step into alt+shift+f7 : 下一步强制进入
         如果下一步是方法的调用,包括jdk源码方法的调用,强制进入,跟随执行
      Run to Cursor alt+F9 : 直接运行到鼠标光标所在位置
2.6 package、import 包和导包

2.6.1 package

package 与  import :
    包机制:  文件夹
        帮助管理众多的资源
        提供了多重命名空间
​
        包信息: 存在与java文件的最上面首行,标识当前类型所在的包路径

2.6.2 import

导包: 指明要使用类型的位置
    如果要使用其它类型,可能涉及到导包问题
    不需要导包的类:
                1)java.lang包下的内容
                2)同包类
    导包的方式:
        1.使用的位置指定类型的全限定名 : 包名.类名
            只能在当前位置使用一次,简单方便,但是使用频繁的话建议使用import导包
        2.import关键字进行导包
            定义语法 : import 包名.类名;
            位置: 类的上面,package信息下面
        3.模糊匹配
            模糊匹配当前报下要使用的所有类型
            只会降低编译效率,不会降低运行效率
        4.静态导入 import static
            导入一个类型中的静态内容
注意:
    以后项目中需要先定义包后定义类型

2.6.3 package、import 测试用例

package com.yjxxt.oop;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

import static java.lang.Math.PI;
import static java.lang.Math.round;

public class Class01_Package {
public static void main(String[] args) {
          java.util.Scanner sc = new java.util.Scanner(System.in);
    Scanner sc2 = new Scanner(System.in);

    Random ran = new Random();

    ArrayList list = new ArrayList();

        System.out.println(PI);
                System.out.println(PI);
                System.out.println(PI);
                System.out.println(PI);

                System.out.println(round(1.4));
                System.out.println(round(1.4));
                System.out.println(round(1.4));
               }
      }
2.7 封装

2.7.1 private的使用及分析

 

2.7.2 private测试用例

package com.yjxxt.oop;
public class Class01_Private {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("小徐");
        p.setAge(19);

        p.info();
        System.out.println(p.getAge());

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

    public void setAge(int ane){
        this.age=age;
    }
    public int getAge(){
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Person(){}//JavaBean规范:至少要写一个构造器
    public void info(){
        System.out.println(name+"--->"+age);
    }
}
2.8 继承

2.8.1 extends使用及分析

 

2.8.2 extends测试用例

public class Class_Extends01 {
    public static void main(String[] args) {
    Cat cat=new Cat();
    cat.name="JAVA";
    cat.age=2;
    cat.EatFish();
    cat.run();
        
    Dog dog=new Dog();
    dog.name="大数据";
    dog.age=3;
    dog.EatMeat();
    dog.run();

    }
}
//父类
 class Animal{
     static int age;
     String name;
    public  void run(){
        System.out.println("跑得飞快");
    }
 }
//子类
class Cat extends Animal{
    public Cat(){}
    public void EatFish(){
        System.out.println(age+"岁的"+name+"正在吃鱼");
    }
}
//子类
class Dog extends Animal{

    public Dog(){}
    public void EatMeat(){
        System.out.println(age+"岁的"+name+"正在吃肉");
    }
}

2.8.3 modifier 权限修饰符

    权限修饰符 : 访问权限修饰符
                             本类                  同包类                     不同包类下的子类                不同包下的其他类
    public 公共的              √                       √                               √                           √
    protected 受保护的         √                       √                               √
    default 默认的             √                      √
    private 私有的             √
​
    成员修饰符,只能修饰成员不能修饰局部的
    能够修饰类的: public default
    父类中被protected修饰的成员,在不同包下的子类中通过继承关系可以使用
    常用的: public private

2.8.4 modifier测试用例

public class Class_Modifier02 {
    private String testPrivate = "private";
    String testDefault = "default";
    protected String testProtected = "protected";
    public String testPublic = "public";

    public static void main(String[] args) {

    }
    //本类
    public void test(){
        System.out.println(testPrivate);
        System.out.println(testDefault);
        System.out.println(testProtected);
        System.out.println(testPublic);
    }
}
//同包类
class Demo{
    public static void main(String[] args) {
        Class_Modifier02 cm = new Class_Modifier02();
        System.out.println(cm.testPublic);
        System.out.println(cm.testProtected);
        System.out.println(cm.testDefault);
       // System.out.println(cm.testPrivate);
    }
}

2.8.5 super关键字

super 与 this 之间的区别: 常见的简答题
    this : 指代当前new的对象
        1)能够使用在构造器的首行调用本类中的其他构造器
            this(参数)
​
        2)区分同名的局部与成员问题
​
    super : 指代父类对象
        1)能够在子类构造器的首行调用父类的指定构造器
            super(参数)
            如果没有显示调用父类的指定构造器,默认调用父类空构造
            在 子类构造器的首行不能同时显示定义this()与super()
​
        2) 区分子类与父类同名成员问题
            默认就近原则,有局部找局部,没有局部找子类,都没有顺着继承体系到父类中找成员
            如果想要找子类this.调用子类成员,但是如果没有局部与成员同名问题,this.可以省略
            如果想要找父类super.调用父类成员,如果没有子类与父类与局部同名问题,super.可以省略
​
​
创建子类对象,会创建父类对象后创建子类对象--> 先父类后子类
静态内容中不能使用this与super

2.8.6 super测试用例

public class Class_Super03 {
    public static void main(String[] args) {
       Zi zi=new Zi(2);
       System.out.println(zi.i);
       zi.test();

    }
}
class FU{
    int i;
    int j;
    String str = "父类";
    public FU(){
        System.out.println("父类空构造");
    }
    public FU(int i){
        System.out.println("父类一个参数的构造");
    }
    public FU(int i,int j){
        System.out.println("父类两个参数的构造");
    }
}
class Zi extends FU {
    String str = "子类";

    public Zi() {
        System.out.println("子类空构造");
    }

    public Zi(int i) {
        super(i);
        System.out.println("子类一个参数构造");
    }
    void test(){
        String str= "局部str";
        System.out.println(str); //局部就近原则
        System.out.println(this.str);  //子类成员
        System.out.println(super.str);  //父类成员str
}
}

2.8.7 Override 重写

重写 与 重载 : 都是方法的特性
   重载:
       1.同一个类中的多个方法
       2.方法名相同
       3.方法签名(参数列表不同)
​
   重写 :
       1.不同的两个类
       2.继承|实现
       3.方法签名相同
​
   重写前提: 子类对从父类中继承的某功能,功能满意,功能的实现不满意,这个时候可以在子类中对于这个功能进行重写,重新实现
​
   子类中一旦对父类中的某个功能进行重写,在调用时候回对父类的功能进行屏蔽,调用子类中重写的方法
   子类对象在调用的时候,子类有重写调用子类的,子类么有重写,调用父类
​
   不能被重写的方法:
       被private修饰的方法不能被重写,被private修饰的成员可以被继承,但是无权限访问
       被final修饰的方法不能被重写
       被static修饰的方法不能被重写
           如果子类中存在与父类静态方法同名的方法,要求子类中的同名方法也为static才可
​
方法签名: 是方法的唯一标识   方法名+参数列表

2.8.7.1 检查是否为重写的方法

1.在行号的后面存在O重写标识 2.@Override 强制检测方法为重写方法

2.8.7.2 重写的满足条件

重写的满足的三个细节条件: == 方法签名 <= 返回值类型 如果返回值类型为基本数据类型|void,要求完全相等 如果返回值类型为引用数据类型 : 要求子类中的重写方法返回值类型<=父类中被重写方法的返回值类型 >= 权限修饰符 子类中重写方法的权限修饰符>=父类中被重写方法的权限修饰符

2.8.8 Override测试用例

package com.yjxxt.oop01;
public class Class_Override04 {
    public static void main(String[] args) {
        SiCong siCong = new SiCong();
        siCong.words();

        new JianLin().words();
    }
}
class JianLin{
    String name = "健林";

    static SiCong words(){
        System.out.println("先定一个小目标,挣它一个亿!!!");
        return null;
    }
}
class SiCong extends JianLin{
    String name = "思聪";

    public static SiCong words() {
        System.out.println("我不在乎我的朋友有钱没钱,反正没有我有钱...");
        return null;
    }
}

2.8.9 final修饰符

 

2.8.10 final测试用例

public class Class_Final05 {
    static final Person p=new Person();
    static final int I=0;
    static final String NAME="";
    static final int AGE=0;

    public static void main(String[] args) {
        //1) P = new Person();报错
        p.age++;
        System.out.println(p.age);
    }
}
class Person{
    String name;
    int age;
}

2.8.11 Object

Object 老祖宗  java.lang.Object
    是java中所有类的父类
    一个类如果没有显示的继承其他父类,就会默认的继承自Object
    java中所有类都会显示或者隐式的继承自Object
    Object类中定义的成员是所有子类,子类对象都可以使用的(不考虑权限修饰符问题)
​
Object类中常用的方法:
    toString : 返回对象的字符串表现形式
        在打印一个对象的引用时,默认输出为当前对象的toString方法的返回值
         public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
        Object类中toString默认返回对象的包名.类名@十六进制地址值
        在业务需求下,我们想要输出对象的基本信息(成员变量的值)--> 在子类中重写从父类中继承的toString,子类对象调用的时候回调用重写后的方法
​
    equals : 比较两个对象是否相等
        == : 比较是否相等
            比较基本数据类型数据值是否相等
            比较引用数据类型的地址值是否相等
​
       Object类中的equals的实现: 默认比较对象的地址值
        public boolean equals(Object obj) {
            return (this == obj);
        }
       子类中重写equals方法,实现比较对象内容(成员变量的值)非地址值
​
      问: == 与 equals 之间的区别
        ==可以比较基本数据类型|引用数据类型,比对象地址
        equals默认Object类中比较对象地址,因为内部通过==实现比较
            可以通过在子类中重写equals实现比较对象内容
​
     javabean规范:
        1.类是公共的
        2.至少提供一个空构造
        3.私有的属性
        4.公共的访问方式
        5.重写toString与equals方法

2.8.12 Object测试用例

package com.yjxxt.oop01;
public class Class_Object06 {
    public static void main(String[] args) {

        System.out.println(new Class_Override04());

        Cat1 cat1=new Cat1("java","橘猫","黄色");
        Cat1 cat2=new Cat1("java","橘猫","黄色");

        System.out.println(cat1==cat2);//比较地址
        System.out.println(cat1);
        System.out.println(cat2);

        System.out.println(cat1.equals(cat2));
    }
}
class Cat1 {
    String name;
    String type;
    String color;

    public Cat1(String name, String type, String color) {
        this.name = name;
        this.type = type;
        this.color = color;
    }

    @Override
    public String toString() {
        return this.name + "--->" + type + "-->" + color;
    }

    //重写equals
    public boolean equals(Object obj) {
        //第一个对象: this
        //第一个对象: obj
        if (this == obj) {
            return true;
        }
        
        //判断参数引用是否指向Cat类型对象,是返回true,不是返回false
        if (obj instanceof Cat1) {
            //多态  向下转型
            Cat1 objCat = (Cat1) obj;
            //字符串比较是否相等,需要通过equals比较字符串的内容
            if ((this.name).equals(objCat.name) && (this.type).equals(objCat.type) && (this.color).equals(objCat.color));
            return true;
        }
       		return false;
    }
}
2.9 多态
面向对象的特性---> 多态 : 一种事物的多种形态|多种表现形式 ,行为多态
​
多态的表现形式::
    父类的引用指向子类类型的对象
​
多态的前提:
    继承|实现
​
多态调用:
    调用子类中重写的方法
    只能调用父类中存在的成员,对子类新增内容不可见
​
注意: 正常的情况都应该为对应类型的数据赋值给对应类型的变量,除了当前满足多态时候,才能够实现对应类型的数据赋值给了其他类型的引用  要求其他类型必须为对象的父类类型
​
多态调用成员的特点:
    成员变量: --> 不存在多态
        编译运行看父类
        编译运行看左边
        编译运行看类型
​
    成员方法:  --> 行为才有多态
        编译看父类,运行
        编译看类型
        编译看左边
​
 多态如果不配合方法的重写,多态没有意义
 父类引用指向不同的子类对象,当子类中存在重写,对功能实现方式可能不同,这是行为多态的体现,同一个功能的不同实现方式

2.9.1 多态的使用及测试用例

public class Class001_Poly {
    public static void main(String[] args) {
        //对应类型的数据赋值给对应类型的变量
        Person p = new Person();
        Student s = new Student();

        //多态
        Person p2 = new Teacher();
        p2.test();
    }
}
class Person{
    String name = "Person";

    public void test(){
        System.out.println("Person");
    }
}
class Student extends Person{
    //String name = "Student";

    public void test(){
        System.out.println("Student");
    }
}
class Teacher extends Person{

    public void test(){
        System.out.println("Teacher");
    }
}
2.10 快捷键的使用  
package com.yjxxt.entity;

import java.util.Objects;


public class User {
    private int id;
    private String username;
    private String password;

    //构造器
    //空构造 : alt+insert->constructor-->enter-->tab切换选中select none ->enter
    public User() {
    }
    //带参构造 : alt+insert->constructor-->enter-->按住shift多选 ->enter
    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    //设置器与访问器
    //快捷键 : alt+insert ->setter and getter -->enter --> 按住shift多选字段 ->enter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //toString
    //alt+insert->toString->enter->enter
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                '}';
    }

    //equals
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                Objects.equals(username, user.username) &&
                Objects.equals(password, user.password);
    }

}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号