5.1 类与对象

1、类:一类具有相同特性的事物的抽象描述。

对象:类的一个个体,实例,具体的存在。

类是对象的设计模板。

2、如何声明类?

【修饰符】 class 类名{
   成员列表:属性、方法、构造器、代码块、内部类
}

3、如何创建对象?

new 类名();  //匿名对象

类名 对象名 = new 类名(); //有名对象

5.2 类的成员之一:属性

1、如何声明属性?

【修饰符】 class 类名{
   【修饰符】 数据类型  属性名;    //属性有默认值
   【修饰符】 数据类型  属性名 = 值; //属性有初始值
}

说明:属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)

总结:Java的数据类型

(1)基本数据类型

byte,short,int,long,float,double,char,boolean

(2)引用数据类型

①类:

例如:String、Student、Circle、System、Scanner、Math...

②接口:后面讲

③数组:

例如:int[],String[],char[],int[][]

int[] arr = new int[5];
这里把int[]看成数组类型,是一种引用数据类型,右边赋值的是一个数组的对象

元素的数据类型:int
数组的数据类型:int[]

2、如何为属性赋值?

(1)在声明属性时显式赋值

【修饰符】 class 类名{
   【修饰符】 数据类型  属性名 = 值; //属性有初始值
}

代码示例:

class Student{
   String name;
   char gender = '男';//显式赋值
}

class TestStudent{
   public static void main(String[] args){
       Student s1 = new Student();
       System.out.println("姓名:" + s1.name);//null
       System.out.println("性别:" + s1.gender);//男
       
       s1.name = "小薇";//修改属性的默认值
       s1.gender = '女';//修改属性的初始值
       System.out.println("姓名:" + s1.name);//小薇
       System.out.println("性别:" + s1.gender);//女
       
       Student s2 = new Student();
       System.out.println("姓名:" + s2.name);//null
       System.out.println("性别:" + s2.gender);//男
  }
}

(2)创建对象之后赋值

【修饰符】 class 类名{
   【修饰符】 数据类型  属性名; //属性有默认值
}

//创建对象
类名 对象名 = new  类名();

//为对象的属性赋值
对象名.属性名 = 值;

3、如何访问属性的值?

(1)在本类的方法中访问

示例代码:

class Circle{
   double radius;
   
   double getArea(){
       return 3.14 * radius * radius;//直接访问
  }
}

(2)在其他类的方法中访问

class Circle{
   double radius;
}

class TestCircle{
   public static void main(String[] args){
       Circle c1 = new Circle();
       double area = 3.14 * c1.radius * c1.radius;//对象名.属性名
  }
}

4、属性的特点

(1)属性有默认值

基本数据类型:

byte,short,int,long:0

float,double:0.0

char:\u0000

boolean:false

引用数据类型:

null

(2)每一个对象的属性是独立,互不干扰

5、对象属性的内存图

class Student{
   String name;
   char gender = '男';//显式赋值
}

class TestStudent{
   public static void main(String[] args){
       Student s1 = new Student();
       System.out.println("姓名:" + s1.name);//null
       System.out.println("性别:" + s1.gender);//男
       
       s1.name = "小薇";
       s1.gender = '女';
       System.out.println("姓名:" + s1.name);//小薇
       System.out.println("性别:" + s1.gender);//女
       
       Student s2 = new Student();
       System.out.println("姓名:" + s2.name);//null
       System.out.println("性别:" + s2.gender);//男
  }
}

5.4 类的成员之二:方法

5.4.1 方法的概念

方法(method):代表一个独立的可复用的功能

目的/好处:

(1)复用

(2)简化代码

5.4.2 方法的语法

1、方法的声明格式:

【修饰符】 class 类名{
   【修饰符】 返回值类型  方法名(【形参列表】){
       方法体:实现功能的代码
  }
}

说明:

(1)【修饰符】:待讲

(2)返回值类型:

①void:表示无返回值

②非void:所有的Java数据类型都可以

(3)方法名:能很好的体现方法的功能

命名的规范:①见名知意②从第二个单词开始首字母大写

(4)【形参列表】:

在完成这个方法的功能时,需要一些数据,这些数据要由“调用者”来决定,那我们就可以设计形参。

语法格式:

():无参,空参

(数据类型 形参名):一个形参

(数据类型1 形参名1, ......, 数据类型n 形参名n):n个形参

(5)方法体:实现方法的功能,最好一个方法就完成一个独立的功能。

2、方法的调用格式:

//本类同级别方法调用:直接调用
【变量 = 】 方法名(【实参列表】);
//在其他类的方法中调用
【变量 = 】 对象名.方法名(【实参列表】);

(1)是否传实参

看被调用的方法是否有形参

(2)是否接收返回值

看被调用的方法是否是void,如果是void,就不需要也不能接收,如果不是void,就可以接收。

3、方法的声明与调用的代码示例

(1)无参无返回值方法

//本类
class Circle{
   double radius;
   void printInfo(){
       System.out.println("半径:" + radius);
  }
   
   void test(){
       printInfo();//本类中调用无参无返回值方法
  }
}
//其他类
class Circle{
   double radius;
   void printInfo(){
       System.out.println("半径:" + radius);
  }

}
class TestCircle{
   public static void main(String[] args){
       Circle c1 = new Circle();
       c1.printInfo(); //其他类中调用无参无返回值方法
  }
}

(2)无参有返回值方法

//本类
class Circle{
   double radius;
   
   double getArea(){
       return 3.14 * radius * radius();
  }
   
   void printInfo(){
     // System.out.println("半径:" + radius + ",面积:" + getArea());//本类中调用无参有返回值
      double area = getArea();//本类中调用无参有返回值
       System.out.println("半径:" + radius + ",面积:" + area);
  }
}
//其他类
class Circle{
   double radius;
   
   double getArea(){
       return 3.14 * radius * radius();
  }
}
class TestCircle{
   public static void main(String[] args){
       Circle c1 = new Circle();
       double area = c1.getArea();
       System.out.println("面积:" + area);
       //或
       System.out.println("面积:" + c1.getArea());
  }
}

(3)有参无返回值方法

//本类
class GraphicTools{
   void printRectange(int line, int column, char sign){
       for(int i=1; i<=line; i++){
           for(int j=1; j<=column; j++){
               Sytem.out.print(sign);
          }
           System.out.println();
      }
  }
   
   void test(){
       printRectange(5,10,'%');//本类中调用有参无返回值方法
  }
}
//其他类
class GraphicTools{
   void printRectange(int line, int column, char sign){
       for(int i=1; i<=line; i++){
           for(int j=1; j<=column; j++){
               Sytem.out.print(sign);
          }
           System.out.println();
      }
  }
}
class Test{
   public static void main(String[] args){
       GraphicTools tools = new GraphicTools();
       tools.printRectange(5,10,'%');
  }
}

(4)有参有返回值方法

//本类
class MyMath{
   int sum(int a,int b){
       return a+b;
  }
   
   void print(){
       int x = 4;
       int y = 7;
       System.out.println(x + "+" + y + "=" + sum(x,y);//本类中调用有参有返回值的方法
  }
}
//其他类
class MyMath{
   int sum(int a,int b){
       return a+b;
  }
}
class Test{
   public static void main(String[] args){
       MyMath my = new MyMath();
       int x = 4;
       int y = 7;
       
       System.out.println(x + "+" + y + "=" + my.sum(x,y));
  }
}

4、方法声明与调用的原则

(1)方法必须先声明后调用

如果调用方法时,如果方法名写错或调用一个不存在的方法,编译会报错

(2)方法声明的位置必须在类中方法外

正确示例:

类{
   方法1(){
       
  }
   方法2(){
       
  }
}

错误示例:

类{
   方法1(){
       方法2(){  //错误
       
  }
  }
}

(3)方法的调用的位置有要求

正确示例:

类{
   方法1(){
       调用方法
  }
}

错误示例:

类{
   方法1(){
       
  }
   
   调用方法  //错误位置
}

(4)方法的调用格式要与方法的声明格式对应

①是否要加“对象.”:看是否在本类中,还是其他类中

②是否要接收返回值:看被调用方法是否是void

③是否要传实参:看被调用方法是有形参列表

5.4.3 方法的重载Overload

概念:在同一个类中,出现了两个或多个的方法,它们的方法名称相同,形参列表不同,这样的形式称为方法的重载。和返回值类型无关。

示例代码:

	//求两个整数的最大值
public int max(int a,int b){
return a>b?a:b;
} //求三个整数的最大值
public int max(int a, int b, int c){
return max(max(a,b),c);
} //求两个小数的最大值
public double max(double a, double b){
return a>b?a:b;
}

5.4.4 方法的参数传递机制

Java中方法的参数传递机制:值传递

(1)形参是基本数据类型时,实参给形参传递数据值,是copy的形式,形参对值的修改不影响实参。 (2)形参是引用数据类型时,实参给形参传递地址值,形参对对象的属性的修改,会影响实参对象的属性值,因为此时形参和实参就是指向同一个对象。 示例代码:

class Test{
   public static void swap(int a, int b){
       int temp = a;
       a = b;
       b = temp;
}

public static void main(String[] args){
       int x = 1;
       int y = 2;
       swap(x,y);//调用完之后,x与y的值不变
  }
}

示例代码:

class Test{
   public static void change(MyData my){
       my.num *= 2;
  }
   
   public static void main(String[] args){
       MyData m = new MyData();
       m.num = 1;
       
       change(m);//调用完之后,m对象的num属性值就变为2
  }
}

class MyData{
   int num;
}

陷阱1:

/*
陷阱1:在方法中,形参 = 新new对象,那么就和实参无关了
*/
class Test{
   public static void change(MyData my){
       my = new MyData();//形参指向了新对象
       my.num *= 2;
  }
   
   public static void main(String[] args){
       MyData m = new MyData();
       m.num = 1;
       
       change(m);//调用完之后,m对象的num属性值仍然为1
  }
}

class MyData{
   int num;
}

陷阱2:见字符串和包装类部分

5.4.5 可变参数的练习

public class srudy {
public static void main(String[] arge) {
MyMath my =new MyMath();
System.out.println("拼接是"+my.con("我是","你","爸爸"));
System.out.println("5的阶乘是"+ my.mutiply(1,2,3,4,5));
}
}
class MyMath{
String con(String...args) {
String str ="";
for(int i=0;i<args.length;i++) {
str+=args[i];
}
return str;
}
long mutiply(int a,int...num) {
long result=a;
for(int i=0;i<num.length;i++) {
result*=num[i];
}
return result;
}
}

  

5.4.6 成员变量与局部变量

1、成员变量:

2、局部变量:

(1)初始化不同

(2)生命周期不同

(3)位置不同

①成员变量在中 ②局部变量在

(4)声明的位置不同

①成员变量在类的方法之 ②局部变量在类的方法之

5.3 对象数组

一维数组:

1、元素是基本数据类型

2、元素是引用数据类型,也称为对象数组,即数组的元素是对象

注意:对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不创建,数组的元素的默认值就是null,所以很容易出现空指针异常NullPointerException。

示例代码:

class MyDate{
int year;
int month;
int day;
}
class Test{
public static void main(String[] args){
MyDate[] arr = new MyDate[3];//创建数组对象本身,指定数组的长度 for(int i=0; i<arr.length; i++){
arr[i] = new MyDate();//每一个元素要创建对象
arr[i].year = 1990 + i;
arr[i].month = 1 + i;
arr[i].day = 1 + i;
}
}
}



public class srudy {
public static void main(String[] arge) {
circle[] arr =new circle[5];
for(int i=0;i<arr.length;i++) {
arr[i]=new circle();
arr[i].R=i+1;
arr[i].py();
}
}
}

class circle{
double R;
double getArea() {
return 3.14*R*R;
}
void py() {
System.out.println("半径是:"+ R +" 面积:"+getArea());
}
}

  

练习

package study;

public class srudy {
public static void main(String[] arge) {
java.util.Scanner input=new java.util.Scanner(System.in);
Student[] arr=new Student[3];
for(int i=0;i<arr.length;i++) {
System.out.print("请输入"+(i+1)+"成员的信息");
arr[i]=new Student();
System.out.print("姓名:");
arr[i].name=input.next();
System.out.print("成绩:");
arr[i].score=input.nextInt(); } for(int i=0;i<arr.length;i++) {
arr[i].printInfo(); }
System.out.println("----------------------------");

for(int i=0;i<arr.length;i++) { //第二种方式
System.out.println(arr[i].pr());
}
} }
class Student{
String name;
int score;
void printInfo(){
System.out.println("姓名"+name+" 成绩:"+score);
}
String pr(){
return "姓名"+name+" 成绩:"+score;
}
}

自学Java第五章——《面向对象基础》的更多相关文章

  1. 自学Java第五章——《面向对象的基本特征》

    面向对象的基本特征: 1.封装 2.继承 3.多态 6.1 封装 1.好处: (1)隐藏实现细节,方便使用者使用 (2)安全,可以控制可见范围 2.如何实现封装? 通过权限修饰符 面试题:请按照可见范 ...

  2. 疯狂JAVA——第五章 面向对象(上)

    5.1类和对象 构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例.通过new关键字来调用构造器,从而返回该类的实例. 类名:每个单词首字母大写,其他字母小写,单词之间不要 ...

  3. java 第五章

    java 第五章   while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行.    while   的执行步骤 (1) 声明 ...

  4. [Effective Java]第五章 泛型

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Java基础语法(10)-面向对象之三大特征

    title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...

  6. 自学Java第五周的总结

    在这周里我在我要自学网上观看视频学习了有关java的基础知识,课程主要介绍JavaSE,这是整个Java体系的基础:课程将由浅入深,并结合案例进行讲解,在那里我将自己已学的知识进行了巩固,并由学习到了 ...

  7. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

  8. java 第七章 面向对象高级特性

    一.类的继承 (一)继承的含义 1.在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化). 2.被继承的类称为父类(超类,基类),新的类称为子类(派生类). ...

  9. 疯狂JAVA——第六章 面向对象(下)

    6.1包装类 java为了照顾程序员的传统习惯,所以提供了八种基本数据类型.但也带来不方便,例如所有引用类型都继承自Object类,都可当做Object类型变量使用.但基本数据类型的变量就不可以.如果 ...

随机推荐

  1. 小程序转uni-app用到的一些方法

    setData: function (obj) { let that = this; Object.keys(obj).forEach(function (key) { that.$set(that. ...

  2. zabbix WebUI自定义Nginx监控项模板

    zabbix webUI自定义Nginx监控项模板 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建模板 1>.如下图所示,依次点击"配置" --- ...

  3. docker学习笔记-04:docker容器数据卷

    一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...

  4. Java笔记--异常

    1.异常分为两类: --1)Error:Java虚拟机无法解决的严重问题(例如资源耗尽等): --2)Exception:其他编程错误或偶然的外在因素导致的一般性问题(例如空指针异常.读取的文件不存在 ...

  5. Metasploit学习笔记——网络服务渗透攻击

    1.内存攻防技术 1.1缓冲区溢出漏洞机理 1.2栈溢出利用机理 1.3缓冲区溢出利用的限制条件 2.网络服务渗透攻击面 3. Windows服务渗透攻击实战案例——MS08-067安全漏洞 示例代码 ...

  6. uboot源码分析1-启动第一阶段

    1.不简单的头文件包含 #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>". # ...

  7. Redis详解(六)——哨兵机制

    Redis详解(六)--哨兵机制 一.概述 Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案.可以在一个架构中运行多个 Sentinel 进程(progress), 这些 ...

  8. 051、Java中使用while循环实现1~100的累加

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  9. Easy Climb UVA - 12170 滚动dp +离散化+ 单调队列优化

    E.Easy Climb Somewhere in the neighborhood we have a very nice mountain that gives a splendid view o ...

  10. linux下安装mysql5.7(centos6.0)

    注:因为网络原因,这个mysql安装是我以前在学校的时候找到的一个安装包,不过也找到了下载的地址:http://www.itmop.com/downinfo/143061.html下载完成后,把文件上 ...