Java中的类与对象
1.类与对象简介:
1.类
a:简介:
是具有相同特性对象的抽象集合,将相同特征的(如:属性),(行为)对象提取出出来,也是一种自定义的数据类型;
比如:人类,就是将所有人的特性提取出来,组成整个人类。
b:基本格式:
class 类名{
属性;:
行为;
}
c:属性和行为:
属性:1.对象的具体特性:比如猫,猫的名字,年龄;-》:!格式:数据类型+属性名:String name;int year;
2.属性可以是基本数据类型也可以是引用数据类型(如:数组,对象,字符串)
行为:对象的具体行为:比如猫,猫可以跑,可以喵喵,可以跳.....这些都是猫的行为,要通过方法实现;
2.对象:
a:简介:
对象是类的具体化,是具体的事物;对象一般由属性和行为构成;
比如:在"人类"中"坤坤"就是一个具体的事物即对象;
2.创建对象两种形式:
//创建对象两种方法:
//1.先声明再创建
//Cat cat;//声明一个对象cat但并没有分配空间,即cat为空
//cat=new Cat();//new一个空间,并赋给cat
//2.直接创建
//Cat cat=new Cat ();//直接创建一个空间给cat对象//
3.eg:
创建一个数据类型:猫类,将将猫的属性如:name,gender,color,year放进去;
class Cat{
String name;//名字
char gender;//性别 //属性可以是类型可以是基本数据类型,也可是引用类型(字符串,数组,对象)
String color;//颜色 //若属性位赋值,则为默认结果;
double year;//年龄
}
3.方法
a:简介:
方法(成员方法):除了属性之外,用于实现对象的行为;
方法在类中创建;!!!
b:方法基本格式:
1:创建方法:public 返回类型 方法名(形参列表){
方法体:用于实现对象的行为;
}
2.调用方法:
先创建对象:类名 方法名=new 类名();
然后访问:对象.方法();
3.方法创建后调用才会被使用!!!
c:方法入门案例:
import java.util.Random;
import java.util.Scanner;
public class method {
public static void main(String[]ages)
{
Scanner myScanner=new Scanner(System.in);
Person p1=new Person();//创建对象;
p1.name="坤坤";//访问属性;
p1.year=250;//
p1.speak();//方法写好后必须调用才会执行
//先创建对象,再调用即可;
System.out.println("name="+p1.name+"\nyear="+p1.year);
p1.cal01();
p1.cal02(100);//调用方法,传入形参5到下方的方法;
int r=p1.getsum(5,6);//调用getsum方法,并传入两个数据;
System.out.println(r);
}
}
class Person{//创建类;!
int year;
String name;
public void speak(){//方法快速入门1:eg:利用speak成员方法输出”鸡你太美“;
//public表示方法无返回值;,void:无返回值;,speak:方法名;,():形参
System.out.println("鸡你太美");//表示方法体
}
public void cal01(){//方法快速入门2:添加cal01的方法,实现从1+..100的结果
int sum=0;
for(int i=0;i<=100;i++)
{
sum+=i;
}
System.out.println(sum);
}
public void cal02(int n){//添加cal02成员方法,该方法可以接收一个数,计算1+...+n的结果;
int sum=0; //int n为形参;!!!!
for(int i=0;i<=n;i++)
{
sum+=i;
}
System.out.println(sum);
}
public int getsum(int m,int n)//快速入门4:添加getsum的成员方法,计算两个数的和;
{ //用连个形参保存输入的两个数m n值;!!!
int sum=0;
sum=sum+m+n;
return sum;
}
}
方法使用细节1:.若要返回多个值,使用数组;!!!!
//eg:添加arrar方法实现返回两数之和和两数之差;
/*public class method{
public static void main(String[]ages)
{
Arrar m=new Arrar();
int res[]=m.arrar(5,8);
System.out.println("sum="+res[0]);
System.out.println("cha="+res[1]);
}
}
class Arrar{
public int[] arrar(int a, int b) {//创建方法:返回类型设为数组
int m[] = new int[2];
int sum = a + b;//两数之和
m[0] = a;//将两数之和装入数组
int cha = a - b;//两数之差
m[1] = cha;将两数之差装入数组
return m;//返回数组;
}
}
方法使用细节2:跨类中的方法A调用B类方法;需要通过对象名的调用
//exercise1:编写AA类方法:判断一个数是奇数还是偶数,返回boolean
//思路:!!!
//1.方法的返回类型:boolean;
//2.方法名字;
//3.方法形参;输入一个数:n;!!
//4.方法体:判断
public class method{
public static void main(String[]ages)
{
AA pan1=new AA();
if(pan1.pan(4))//调用方法体;
{
System.out.println("是");//如果返回值是true则执行他;
}else{
System.out.println("no");//如果返回值为false则执行她;
}
}
}
class AA{
public boolean pan(int n){
if(n%2==0)//方法体;
{
return true;
}else{
return false;
}
}
}
3.exercise2:根据行,列,字符,打印对应行数和列数的字符
// 比如:行:4,列:4,字符#,则打印相应效果;
//eg:####
// ####
// ####
// ####
//思路:1.行列要用到二维数组,以及for循环;
//考虑这个行为是干什么用的,需要什么:
//2.方法的返回类型:void
// 方法名 print
// 参数列表:1.!!!!!数组的:行长度row,列长度colum;2.输入的字符m;!!!!
// 方法体:循环打印输出图形;
public class method{
public static void main(String[]ages)
{
AA a= new AA();
a.print(4,4,'*');
}
}
class AA{
public void print(int row,int colum,char m){
for(int i=0;i<row;i++)
{
for(int j=0;j<colum;j++)
{
System.out.print(m);
}
System.out.println();
}
}
}
d:方法传参机制练习:
eg1
eg1:使用方法:进行两个数的交换;
//思路:!!!
//返回类型:void
//方法名:swap
//形参:输入的 a,b
//方法体:实现交换;
//1.基本数据类型,传递的是值(值拷贝),形参的任何变化不影响实参!!!
public class MthodParameter0 {
public static void main(String[]ages)//编写main方法;
{
int a=8,b=9;
AA obj=new AA();
obj.swap(a,b);//程序走到这会再栈中再开辟一个空间,其与原来的main栈独立!!!;
//程序之后跳到类中执行swap方法:实现交换,输出的是swap栈·中ab的值,并返回到这里;
System.out.println("main方法中的a="+a+"b="+b);//输出的是main栈中的a b的值,
//因为swap栈完成交换后输出,之后就会退出swap方法,swap方法销毁;
// main栈中的ab值并未发生改变
}
}
class AA{
public void swap(int a,int b){
System.out.println("交换前的a="+a+"交换后的b="+b);
int swap=0;
swap=a;
a=b; //实现两数交换;
b=swap;
System.out.println("交换后的a="+a+"交换后的b="+b);
}
}
2.引用数据类型(数组,对象)传参机制:传递的是地址(址拷贝):可以通过形参改变实参!!!!
eg:在B类中编写一个方法test100, 可以接收一个数组,并在该方法中修改该数组,看看原来数组是否变化;
//思路:
//1.方法返回值:void;
//2.名字
//3.参数列表:数组,
//方法体:输出一个数组;
public class MthodParameter0{
public static void main(String[]ages)
{
int arr[]={1,2,3};
System.out.println("修改之前的数组:");
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
B b=new B();
System.out.println("\n修改之后的数组:");
b.test100(arr);//2.调用方法;
}
}
class B{
public void test100(int arr[]){//1.要修改数组,所以必须把数组当作参数传给test200;!!!!
int i;
arr[0]=666;//修改arr[0];
for(i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
}
eg2
//eg:在B类中编写一个方法test200,可以接收Person(age,sal)对象,在方法中修改对象属性,看看原来对象是否变化;
//!!!!!!修改谁就将他当作所创建方法的参数传过去,然后再调用他;!!!!!!
public class MthodParameter0{
public static void main(String[]ages)
{
Person a=new Person();//创建a对象;
a.age=5;
a.sal=666;
System.out.println("修改前:");
System.out.println(a.age);
B b=new B();//创建b对象;
b.test200(a);//要修改a对象,所以把a对象传过去;!!!!!
System.out.println("\n修改后:");
System.out.println(a.age);
}
}
class Person{
int age;
double sal;
}
class B{
public void test200(Person a){//要修改a对象中的数据,所以要把a对象当作参数传给b对象,再修改;!!!
a.age=500;//修改; //Person是自定义的数据类型;+对象名!!
}
}
eg3:
ex4:编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象;--克隆对象;
//注意:要求得到的对象和原来的对象是两个独立的对象,只是属性相同;
//思路:1.返回类型:/要求得到新对象,所以返回类型应该与person一样,所以为Person类 2.名字:copyPerson
//3.形参:Person,因为要克隆,所以要把Person给他//4.方法体:创建新对象并复制属性并返回即可;!!!!!!!
public class MthodParameter0 {
public static void main(String[]ages)
{
Person p=new Person();
p.name="坤坤";
p.kg=250;
p.year=66;
System.out.println("p的属性:");
System.out.println("name="+p.name+"kg="+p.kg+"year="+p.year);
MyTools tools =new MyTools();//创建tools对象;
tools.copyPerson(p);//调用copy方法;:进行复制!!!!!
Person p2= tools.copyPerson(p);//p2用来接收返回的的p2结果到这里!!!
//到此:p 和p2是Person对象,但他们是连个独立的对象;属性相同;
System.out.println("\tp2的属性");
System.out.println("name="+p2.name+"kg="+p2.kg+"year="+p2.year);
}
}
class Person{
String name;
double kg;
int year;
}
class MyTools{
public Person copyPerson(Person p){//要求得到新对象,所以返回类型应该与person一样,所以为Person类
Person p2=new Person();//1.创建一个对象p2;
p2.name=p.name;
p2.year=p.year; //2.复制属性;
p2.kg=p.kg;
return p2; //3.返回p2;
}
}
*/
4.方法重载:
1.简介:
//一:.重载介绍:
//1.基本介绍:
//java中允许一个类中,多个同名方法的存在,但要求!!!形参列表不一致;!!!
eg:
eg:类:MyCalculator 方法:calculate
//使用相同方法名,求两int和,int double 的和,三个int和
public class OverLoad{
public static void main(String[]ages){
MyCalculator sum=new MyCalculator();
System.out.println(sum.calculate(1,2.8));
System.out.println(sum.calculate(1,8));
System.out.println(sum.calculate(1,7,8));
}
}
class MyCalculator{
public int calculate(int n1,int n2){//两个int;
return (n1+n2);
}
public double calculate(int n1,double n2){//1int 1double;
return (n1+n2);
}
public int calculate(int n1,int n2,int n3){//3int ;
return(n1+n2+n3);
}
}
2.注意细节:
1.前提是:方法名必须一样;!!!
//2.形参列表必须不同(参数的顺序,个数,类型只是有一项不一样);!!!!
//3.但与参数名无关,返回类型无关(返回类型具体看方法的行为);
练习:
public class OverLoad{
public static void main(String[]ages)
{
Methods a=new Methods();
System.out.println(a.m(5));
System.out.println(a.m(5,8));
System.out.println(a.m("kunkun"));
System.out.println(a.max(2.5,5.6));
System.out.println(a.max(7,6)); //上边的三个调用会自动和下边三个方法匹配;
System.out.println(a.max(1.1,1.2,1));
}
}
class Methods {
public int m(int n) { //1
return n * n;
}
public int m(int n, int n1) { //1
return n * n1;
}
public String m(String n) { //1
return n;
}
public int max(int n1, int n2) {
if (n1 > n2) {
return n1; //2.第一个max重载方法:找两个int最大值
} else {
return n2;
}
}
eg:2:找三个数中最大值
public double max(double a, double b) {
if (a > b) {
return a;
} else {
return b;
}
}
public double max(double a, double b, double c) {
double max1=a>b?a:b;
return max1>c?max1:c;
}
}
5.可变参数:
1.简介
/可变参数:
//1.方法名称相同,功能相同,参数个数不同->:可以使用可变参数优化;
eg:
1.int...表示接收的是可变参数,类型是int,即可以接收多个int
2.使用参数时,可以当作数组来使用 即nums可以当作数组;
3.使用参数时,可以当作数组来使用 即nums可以当作数组;
public class Variableparameter {
public static void main(String[]ages) {
T a = new T();
int res=a.sum(4,8,9);
System.out.println(res);
}
}
class T{
public int sum(int...nums){
int m=0;
for(int i=0;i<nums.length;i++)
{
m+=nums[i];
}
return m;
}
}
2.细节:
/可变参数细节:
//1.可变参数的实参可以为0个或多个;
//2.可变参数的实参可以为数组
//3.可变参数本质就是数组
//4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数放在最后;
// 5.一个形参列表只可以出现一个可变参数
//6.属性可以加修饰符,局部变量不能加修饰符;
案例:
public class Variableparameter {
public static void main(String[]ages){
HspMethods hm=new HspMethods();
System.out.println(hm.showscores("kunkun",2.5,2.5));
System.out.println(hm.showscores("kunkun",2.5,2.5,5.6));
}
}
class HspMethods{
//分析:方法名,形参列表(String name,double scores...),!!!!!!!!返回类型”String‘;倒时候返回Sreing直接拼接返回即可;
public String showscores(String name,double...scores){
double sum=0;
for(int i=0;i<scores.length;i++) {
sum = sum + scores[i];
}
return (name+"有"+ scores.length+"门成绩总分是"+scores);
}
}
6.作用域:
注意:
1.局部变量和全局变量可以重名,在访问时遵循就近原则!!!!
2.同一个作用域中不可重复定义,比如在同一个方法中‘:变量名不可相同;
3.属性属于全局变量:可以不赋值,有默认值;
方法中的变量属于局部变量:必须赋值才可使用;
且只能在本方法中使用;
4.属性的生命周期较长,伴随着对象的创建而创建,伴随着对象销毁而销毁;
局部变量生命周期较短,伴随着它的代码块的执行而创建,伴随代码块结束而销毁;//
5.作用范围不同:,
全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用;
案例:
//1.局部变量和全局变量可以重名,在访问时遵循就近原则!!!!
public class scope0{
public static void main(String[]ages){
T t=new T();
t.m();
}
}
class T{
int age=10;//全局变量;
public void m(){
int age=5;//局部变量;
System.out.println(age);//访问时访问最近的即局部变量所以输出5;
}
//2.同一个作用域中不可重复定义,比如在同一个方法中‘:变量名不可相同;
public void hi(){
String adress="北京";
String adress="上海";//(错误:重复定义了)// ;
}
}
//3.
public class scope0 {
public static void main(String[]ages)
{
Cat m=new Cat();
m.age=100;
System.out.println(m.age);
}
}
class Cat{
int age=10;//属性属于全局变量:可以赋值,有默认值
public void cat1(){
int age=10;//方法中的变量属于局部变量:必须赋值才可使用;
//且只能在本方法中使用;
}
}
5.作用范围不同:,
//全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
//局部变量:只能在本类中对应的方法中使用;
/*public class scope0 {
public static void main(String[]ages){
M m=new M();
m.h();
}
}
class T{
int age=5;//全局变量;
public void t1(M t){
System.out.println()
}
}
class M{
public void h(){
T t=new T();
System.out.println(t.age);
}
}
*/
//eg!!!!
/*public class scope0 {
public static void main (String[]ages){
T t1=new T();
t1.test();
}
}
class T{
public void test(){
Person p1=new Person();//创建对象;
System.out.println(p1.name);//调用对象;
}
}
class Person{
String name="jack";
}
*/
//
/*public class scope0 {
public static void main (String[]ages){
T1 t1=new T1(); //1.
t1.test();
Person p =new Person(); //2.
t1.test2(p);
}
}
*/
class Person{
String name="jack";
}
class T{
public void test(){ //1.访问jack:创建一个新的方法;
Person p1=new Person();//创建Person对象;
System.out.println(p1.name);//调用对象;
}
public void test2(Person p ){
System.out.println(p.name);//2.第二种访问方法:将Person类传过去(跨类访问对象属性方式)
}
}