第四章 Java面向对象基础

第四章 Java面向对象基础

面向对象与面向过程

  • 面向过程:用于结局简单问题(仅有 封装性【封装功能】)
  • 面向对象:用于解决复杂问题 时面向过程的集合(封装性【功能,数据】、继承性、多态性)

对象与类

  • 对象:是具体实例
  • 类 :是对象的抽象化模型

类(class)

  • 属性 (field):刻画对象模型特征参数
  • 方法(method):刻画对象的行为特征 以及 实现的功能(就是 的类要实现的功能)
  • 构造方法/构造器(constructor):对 对象的初始化
    对构造方法我个人理解是:(包含构造方法的重载)
    将不定属性包装整合成一个固定 集合 用于以后方法的调用与实现;
    Student stu_0= new Student(sno,'name','sex');
    猜测 :干啥非要包装集合(非要构造方法),个人感觉这样直接传参(可能多个构造方法)可以不用调用类中没有用的属性和方法???

类与构造方法 的几个注意点与特征:

  1. 一个Java文件可以有多个类
  2. 但是一个Java文件 只能包含一个 public class类并且必须 类名与文件名一致
    1. 构造方法名 必须与 类名 一致
  3. 一个类没有自定义 则会自动生成一个 无参的 构造方法
  4. 构造方法通过 new 关键字调用
  5. 构造方法不能定义返回值类型(返回值有 且 类型为 类本身类型 )
  6. 构造方法的重载 规则、限制 与 普通方法一样
    实例:
public class User {
    int id; // id
    String name; // 账户名
    String pwd; // 密码
    public User() {
 
    }
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
    public static void main(String[] args) {
        User u1 = new User();
        User u2 = new User(101, "高小七");
        User u3 = new User(100, "高淇", "123456");     
    }
}

4.8 this关键字以及对象创建过程

this. 当方法参数 和 对象参数 重名时

  • 在一般方法中 指向 对象变量
  • 在构造方法中指向 正要初始化的对象
  • 在调用重载的构造方法,并且必须放在第一位上
  • this不能用于 static

对象的创建过程

  1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显示初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

//一般方法
public class User {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
 
    public User() {
    }
    public User(int id, String name) {
        System.out.println("正在初始化已经创建好的对象:"+this);
        this.id = id;   //不写this,无法区分局部变量id和成员变量id
        this.name = name;
    }
    public void login(){
        System.out.println(this.name+",要登录!");  //不写this效果一样
    }  
     
    public static void main(String[] args) {
        User  u3 = new User(101,"高小七");
        System.out.println("打印高小七对象:"+u3);
        u3.login();
    }
}

//调用重载构造方法
public class TestThis {
    int a, b, c;
 
    TestThis() {
        System.out.println("正要初始化一个Hello对象");
    }
    TestThis(int a, int b) {
        // TestThis(); //这样是无法调用构造方法的!
        this(); // 调用无参的构造方法,并且必须位于第一行!
        a = a;// 这里都是指的局部变量而不是成员变量
// 这样就区分了成员变量和局部变量. 这种情况占了this使用情况大多数!
        this.a = a;
        this.b = b;
    }
    TestThis(int a, int b, int c) {
        this(a, b); // 调用带参的构造方法,并且必须位于第一行!
        this.c = c;
    }
 
    void sing() {
    }
    void eat() {
        this.sing(); // 调用本类中的sing();
        System.out.println("你妈妈喊你回家吃饭!");
    }
 
    public static void main(String[] args) {
        TestThis hi = new TestThis(2, 3);
        hi.eat();
    }
}

4.9 static 关键字

static 修饰的成员变量 为静态成员变量(类变量)生命周期与类一样
成员:方法/属性
特征

  1. 为该类的公用变量,并被该类的所有实例共享
  2. 静态成员变量只有一个,并被所有实例共用
  3. 类名.类属性/类方法

核心内容

  1. static 修饰的方法内只能调用 static 修饰的成员(方法/属性)
  2. 一般方法可以调用static 修饰的成员
  1. static修饰的成员变量和方法,从属于类。
  2. 普通变量和方法从属于对象的。

4.10 静态初始化块

static{
//只要调用或者创建 static所属的类就会执行 
//这中间的内容
}

例子

public class User3 {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
    static String company; //公司名称
    static {
        System.out.println("执行类的初始化工作");
        company = "北京尚学堂";
        printCompany();
    }  
    public static void printCompany(){
        System.out.println(company);
    }  
    public static void main(String[] args) {
        User3  u3 = new User3();
    }
}

执行结果:在这里插入图片描述

4.11 参数传值机制

总结

  • 传递的是参数的地址 当传递中改变值时 被传递的参数的 值 也将 被改变
  • 当传递过程中 new时 是的地址 改变 不会改变原本的被传递参数的 值
/**
 * 测试参数传值机制
 * @author 高淇
 *
 */
public class User4 {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
       
    public User4(int id, String name) {
        this.id = id;
        this.name = name;
    }
      
    public   void   testParameterTransfer01(User4  u){
        u.name="高小八";
    }
     
    public   void   testParameterTransfer02(User4  u){
        u  =  new  User4(200,"高三");
    }
      
    public static void main(String[] args) {
        User4   u1  =  new User4(100, "高小七");
         
        u1.testParameterTransfer01(u1); 
        System.out.println(u1.name);
 
        u1.testParameterTransfer02(u1);
        System.out.println(u1.name);
    }
}

在这里插入图片描述

4.13.1 JDK中的主要包

表4-3 JDK中的主要包
Java中的常用包 说明
java.lang 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
java.net 包含执行与网络相关的操作的类。
java.io 包含能提供多种输入/输出功能的类。
java.util 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

4.13.2 导入类import

  • 当导入中有重名时:java.util.Date,java.sql.Date使用精确调用
  • 当要调用包中所有类时:java.until *但会加大 编译速度,不会增加运行速度
import java.sql.Date;
import java.util.*;//导入该包下所有的类。会降低编译速度,但不会降低运行速度。
 
public class Test{
    public static void main(String[] args) {
        //这里指的是java.sql.Date
        Date now; 
        //java.util.Date因为和java.sql.Date类同名,需要完整路径
        java.util.Date  now2 = new java.util.Date();
        System.out.println(now2);      
        //java.util包的非同名类不需要完整路径
        Scanner input = new Scanner(System.in);    
    }
}

4.13.3 静态导入

静态导入(static import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。
比如之前我们调用PI需要用到 Math.PI()现在导入后直接使用PI即可

第四章 课后部分练习题

3.在Java中关于静态方法,以下说法中正确的是( )。(选择二项)

A.静态方法中不能直接调用非静态方法

B.非静态方法中不能直接调用静态方法

C.静态方法可以用类名直接调用

D.静态方法里可以使用this
4.下列选项中关于Java中类方法的说法错误的是( )。(选择二项)

A.在类方法中可用this来调用本类的类方法

B.在类方法中调用本类的类方法时可直接调用

C.在类方法中只能调用本类中的类方法

D.在类方法中调用实例方法需要先创建对象
5.分析如下Java程序的代码所示,则编译运行后的输出结果是( )。(选择一项)

public class Test {
    int count=9;
    public void count1(){
        count=10;
        System.out.print("count1="+count);
    }
    public void count2(){
        System.out.print("count2="+count);
    }
    public static void main(String[ ] args) {
        Test t=new Test();
        t.count1();
        t.count2();
    }
}

A.count1=9; count2=9;

B.count1=10;count2=9;

C.count1=10; count2=10;

D.count1=9; count2=10;

发布了55 篇原创文章 · 获赞 1 · 访问量 965

猜你喜欢

转载自blog.csdn.net/weixin_43556527/article/details/103260051