4.从零开始学习Java-面向对象基础

面向对象:

一、什么是对象?

特征和行为:

特征(属性):称为属性,一般为名词,代表对象有什么。

行为(方法):称为方法,一般为动词,代表对象能做什么。

二、什么是类

类的抽取:在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。

类属于引用类型。

  • 类:定义了对象应具有的特征和行为,类是对象的模板。
  • 对象:拥有多个特征和行为的实体,对象是类的实例。

三、类的组成

public class Dog{
    String breed;//品种
    int age;//年龄
    String furColor;//颜色
    String sex;//性别
    //方法
    //吃
    public void eat(){
        System.out.println("狗狗吃屎!");
    }
    //睡
    public void sleep(){
        System.out.println("狗狗开始睡觉...");
    }
}
public class TestDog{
    public static void main(String[] args){
        //类是对象的模拟
        //创建对象
        Dog xiaohei = new Dog();
        //int num = 10;
        //属性赋值
		xiaohei.breed="哈士奇";
        xiaohei.sex="公";
        xiaohei.age=2;
        xioahie.fuColor="黑色";
        xiaohei.eat();
        xiaohei.sleep();
    }
}
new:开辟空间,属性默认值
drop:复制地址
ivokespecial:执行构造方法
astore_1:把地址赋值给变量
public class Student{
	String name;
	int numb;
	int age;
	String sex;
	public void hello() {
		System.out.println(name+numb+age+sex);
	}
}
public class TextSayHi {

	public static void main(String[] args) {
		Student stu1 = new Student();
		Student stu2 = new Student();
		stu1.name = "zhangsan";
		stu1.age = 12;
		stu1.sex = "男";
		stu1.numb = 123456;
		stu2.name ="lisi";
		stu2.age = 15;
		stu2.sex = "女";
		stu2.numb = 789456;
		stu1.hello();
		stu2.hello();
        //将stu1和stu2存入studens
		Student[] students = new Student[] {stu1,stu2};
		//for增强
		for (Student student : students) {
			System.out.println(student.name + student.age + student.numb +student.sex);
		}
	}
}

四、方法重载(Overload)

在同一个类中,方法名相同,参数列表不同(类型、个数、顺序不同)

//方法的重载和返回值无关。

public class Calculator{
    //类型
    public int add(int num1,int num2){
        int sum = num1 + num2;
        return sum;
    }
    public double add(double d1,double d2){
        double sum = d1+d2;
        return sum;
    }
    
    //顺序
    public double add(int num1,double num2){
        double sum = num1+num2;
        return sum;
    }
    public double add(double num1,int num2){
        double sum = num1+num2;
        return sum;
    }
    //个数
    public int add(){
        int n1 = 100;
        int n2 = 200;
        return n1+n2;
    }
    public int add(int num1){
        int num2 = 200;
        return num1+num2;
    }
    //和名字无关
    //和返回值类型无关
}

public class CalTest {

	public static void main(String[] args) {
        //类是对象的模型,对象是类的实现。
		Calculator calculator = new Calculator();
		System.out.println(calculator.add(1,2));
		System.out.println(calculator.add(1,1.2));
		System.out.println(calculator.add(2.2,10));
		System.out.println(calculator.add());
		System.out.println(calculator.add(100));
		
	}
}

五、构造方法

构造方法:

类中的特殊方法,主要用于创建对象。

如果是已经添加了构造方法,编译器不会再添加无参构造方法。

特点:
• 名称与类名完全相同。
• 没有返回值类型。
• 创建对象时,触发构造方法的调用,不可通过句点手动调用

class xxx{
   public xxx {
       
   }
}

对象的创建过程:

public class TestConstructors{
    public static void main(String[] args){
        //内存中开辟空间
        Student s =new Student();//通过创建对象调用,无法通过句点手动调用
    }
}
class Student{//类名
    //为各个属性赋予默认值
    String name;
    int age;
    String sex;
    double score;
}
	public Student(){//构造方法,1.名称和类名相同 2.没有返回值类型
        //执行构造方法中的代码
        System.out.println("Student() Executed");
    }
对象的创建过程: 
• 内存中开辟对象空间属性赋予初始值 
	• new  
	• dup 
• 执行构造方法中的代码 
	• invokeSpecial 
• 将对象的地址赋值给变量 //=
	• astore_1

默认构造方法:

  1. 编译错误:无参构造方法未定义
  2. 在类中,如果没有显示定义构造方法, 则编译器默认提供无参构造方法。
  3. 如已手动添加有参构造方法,则无参 构造方法不再默认提供,可根据需求 自行添加。(所以需要有参构造和无参构造一起进行。)

六、this关键字

类是模板,可服务于此类的所有对象; this是类中的默认引用,代表当前实例; 当类服务于某个对象时,this则指向这个对象

当创建s1对象时,this指向0x0000A001, 访问的name属性即是0x0000A001地址中的name空间; 当创建s2对象时,this指向0x0000B002, 访问的name属性即是0x0000B002地址中的name空间;

//alt+insert

有参构造

无参构造

//getter setter 可以用来对private私有变量进行修改、约束。

第一种用法:

调用实例属性、实例方法。如:this.name、this.sayHi()。

当实例变量和局部变量重名时,**优先访问局部变量**; 此时,如需访问实例变量,需要增加this.前缀。 不存在重名时,则可省略this.
public class TestThisKeyword{
    public static void main(String[] args){
        Student s1 = new Student();
        s1.sayHi();
    }
}
class Student{
    String name = "tom";//实例变量
    public void sayHi(){
        String name ="jack";//局部变量
        System.out.println(name);
        System.out.println(this.name);
    }
}
运行结果:
jack
tom

第二种用法:

this第二种用法:调用本类中的其他构造方法。如:this()、this(实参)//必须在构造方法的首行

class Student{
    String name;
    int age;
    String sex;
    double score;//一个类中可以有多个构造方法
    public Student(String name,int age,String sex){
        this.name = name;//当局部变量和实例变量重名时,优先使用局部变量,要想使用实例变量,需要用到this
        this.age = age;
        this.sex = sex; 
    }
    public Student(String name,int age,String sex,double score){
        //减少了代码的冗余
        this(name,age,sex);//**必须在构造方法的首行**
        this.score = score;
    }
}
  1. 在构造方法中,调用本类的 其他构造方法,即可复用构 造方法中的逻辑代码.
  2. 两个构造方法当中, 包含多条冗余代码
  3. this():调用无参构造 this(实参):调用有参构造 注:必须在构造方法的首行
  4. 四参构造将接收到的实参直接 传递给三参构造进行属性赋值。

this();//调用无参方法?在哪调用,在自身的类吗

this(“xxx”,xx);//调用有参

注意:必须是构造方法的第一条语句,只能调用一次。

public class Car {
		String color;
		String brand;
		double price;
		public void run() {
			System.out.println("go...go...go");
		}
		public void show() {
			System.out.println(this.color+this.brand+this.price);
		}
}
public class TestCar {

	public static void main(String[] args) {
		Car car1 = new Car();
		Car car2 = new Car();
		car1.brand = "110";
		car1.color = "yellow";
		car1.price = 20.0;
		car2.brand = "221";
		car2.color = "red";
		car2.price = 30.0;
		car1.show();
		car2.show();
		Car[] car = new Car [2];
		for (Car i : car) {
			System.out.println(i);
		}
		}

}

七 、JVM虚拟机

getstatic:从类中获取静态字段
new:创建一个对象并将地址放入虚拟机栈
dug:复制一个对象地址放入虚拟机栈
invokespecial:用于调用私有方法及final方法
aload_0:aload_0 is supposed to push 'this' on to the stack 
getfield:从对象中获取字段

八、局部变量和实例变量区别

局部变量实例变量
定义位置方法或方法内的结构当中类的内部,方法的外部
默认值无默认值字面值(与数组相同)
使用范围从定义行到包含其结构结束本类有效
命名冲突不允许与局部变量重名不允许与实例变量重名可与局部变量重名,局部变量优先

实例变量:

属性:通过变量表示,又称实例变量。
语法:数据类型 属性名;
位置:类的内部,方法的外部

方法:通过方法表示,又称实例方法。
语法: public 返回值类型 方法名(形参){ //方法的主体 }
注意:不再书写static,后续详解

public class Sample {
	private int a = 1; // 实例变量
	public void b() {
		int a = 2; // 局部变量
		System.out.println("局部变量:a=" + a);
		System.out.println("实例变量:a=" + this.a);// 局部变量的作用域内引用实例变量:this.变量名
	}

public static void main(String[] args)
{
new Sample().b();
}
}


运行输出:
局部变量:2
实例变量;1

九、文档注释:

API文档就是用来说明这些程序的入口的。

9.1 cmd生成文档注释:

cmd:cdjava项目中,

javadoc -d doc -encoding utf-8 -charset utf-8 *.java

9.2 使用idea工具生成文档注释:

tools

generate javaDoc

Other command:

-encoding utf-8 -charset utf-8
文档注释:

/**

*

*/
    
可以给自己生成doc文件,也可以为后面的API和方法的引用提供注释。
标签含义
@author类的作者
@version类的版本
@see指定参考的链接或内容
@param说明一个方法的参数
@since指定从哪个JDK版本开始提供支持
@return说明返回值类型

十、四个关键字作用域

作用域当前类同一包内子孙包其他包
public
protected×
[default]××
private×××

十一、调试

Debug:

先打断点

再Debug

下一步 深入 上一步

• 使用调试技巧,帮助开发人员理解程序执行过程,从而发现问题,解决问题。

• 使用IDEA调试程序需要两个步骤:

​ • 添加断点

​ • 单步执行

• 快捷键:

  • F8单步跳过 Step Over

  • F7单步进入 Step Into

  • alt+shift+f7 强制进入

  • F9继续执行 Resume

十二、javap

看运行过程,等同于javap -v .class文件

安装:setting →plugins→搜索并在库中下载jclasslib

打开:重启→view→Show Bytecode With jclasslib

使用:main code

使用edit++查看16进制

十三、IDEA快捷键

1.生成source

//alt+insert

2.Debug

3.do while

//ctrl+alt+t

Ctrl+/ 单行注释 
Ctrl+shift+/ 多行注释 
Ctrl+D 复制行 
Ctrl+X 或 Ctrl+Y 删除行 
Alt+Enter 快速修正 
Alt+/  代码补全 
Ctr+Shift+U 大小写转化 
Ctrl+Alt+O 优化导入的类和包 
Alt+Insert 生成代码(如get,set方法,构造函数等) 
Ctrl+P 方法参数提示 
Ctrl+H 显示类结构图 
Ctrl+Q 显示注释文档 
CTRL+AlT+M  抽取方法 Shift+Enter,向下插入新行 Ctrl+Alt+Enter 向上插一行 
Ctrl+ 鼠标左键点击 查看源码 
Double Shift 全局搜索

idea查看类中所有方法快捷键:
Ctil+F12
Alt+7

Ctrl+Alt+B:查找接口的实现类
Ctrl+Alt+shift+U:查看类继承关系图
Ctr+Alt+L 格式化代码 
Ctrl+Shift+Up/Down 代码向上/下移动。
CTRL+AlT+T  把选中的代码放在 try{} if{} else{}里 
ctrl+alt+v 自动补全返回值,自动补全变量名称和属性名称

十四 、idea代码补全

/*
*psvm sout (soutm、soutv、soutp、xxx.sout)
 *  fori (iter、数组或集合.fori)
 *  inn (ifn 、xxx.nn、xxx.null)
 *  prsf:可生成 private static final
 *  类似的:  
 *  psf:可生成 public static final
 *  psfi:可生成 public static final int
 *  psfs:可生成 public static final String
 */
//fori
//iter
//syso
//main

再比如说,想遍历某个list,可以直接list.for 回车就可以自动生成for (XXX xxx : lsit)的代码结构了。

再比如说,想输出1 + 2 的结果,可以直接1 + 2.sout 回车就可以自动生成System.out.println(1+2)

再比如说,new A(),想要声明一下, 直接new A().var,就会生成 A a = new A()

十五、Int类型不可用length查出长度

String 可以。

    public static void main(String[] args){
        String numb1 = "123456";
        int b = numb1.length();
        System.out.println(b);
    }

十六、double比较

double.compare

十七、传递地址

public class TestConstractors{
    public static void main(String[] args){
        Student s1 = new Student();//实参列表
        System.out.println(s1);//直接打印s1,打印的是地址
    }
}

class Student{
    String name;
    int age;
    String sex;
    double score;
    //没有给构造方法
    
    public void sayHi(){}
    public void study(){}
    public void exam(){}
}

十八、Label打break断点

案例:

//Label打break断点
		Label:do {
			
		System.out.println("=====1.添加动物 2.查询动物 3.遍历动物0退出====");
		System.out.println("请选择");
		int choice = input.nextInt();
		switch (choice) {
		case 1:
			//获得Animal类中的对象中的方法
			Animal animal = getAnimal();
			manager.add(animal);
			System.out.println("添加成功");
			break;
		case 2:
			System.out.println("请输入动物的昵称");
			System.out.println("====");
			String nickname = input.next();
			Animal query = manager.query(nickname);
			if (query!=null) {
				query.show();
			}else {
				System.out.println("没有找到");
			}
			break;
		case 3:
			manager.list();
			 break;
		case 0:
			System.out.println("欢迎下次光临...");
			break Label;

		default:
			System.out.println("输出有误,请重新输入:");
			break;
		}	
	}
	while(true);
}

十九、设置size

//用户的个数
private int size;

二十、面向对象

Table[] array = new Table[2];
class Table {
	private String name;
    private Integer numbs;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值