Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

java基础-part1

这一部分我想着重说一下基本的 java 格式搭建与基本运用 如 Scanner的使用与封装与继承的基本概念。学会了这几部分那么java的基本语句就可以自行学习了。

1.框架搭建

1
2
3
4
5
6
7
public class HelloWorld{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}

这是一个简单的java程序,也是所有语言学习第一个代码”hello world“。接下来我将通过这个例子分析java程序的基本框架

第一行代码:

public class HelloWord{}

在程序中定义了一个名为HelloWorld的公共类(public class),该类是程序的入口点。Java程序中的每个类都必须以一个公共类来定义。文件名必须与公共类的名称相同,并以.java作为文件扩展名。换而言之,HelloWorld 指代文件名,它可以是任意的名字(须符合命名规则)且必须与程序文件名相同

第二行代码:

public static viod main(String[] stgs)

  • 其中public static(公共静态方法)它是Java程序的起点。
  • 在程序执行时,从主函数main方法开始执行(与c语言中相同)。
  • viod则指代返回一个空值,即不需要返回值。

String[] args

首先它存在好几种形式String... args,String args[]等,但我们为了避免歧义,主要使用第一种形式来写,但我们遇到到其他形式时也应该认识。

从形状来看,他是一个数组,可以理解为一个数组。那么为什么要存在一个数组呢?

在命令行中比如运行 Test.class 文件,你可以这样写:

java Test abc
相当于给数组传入了一个abc 字符串。也可以打印出来,可以作为简单的输入。

例如:

1
2
3
4
5
public class Test {
public static void main(String[] args) {
System.out.println(args[0]);
}
}

用控制台编译运行:

$ javac Test.java
$ java Test runoob
abc

我们会发现这个数组会记录我们的输入并储存。Java中,main 方法的参数必须是一个 String 类型的数组 String[] args。这是由Java语言规范所定义的,这样设计的目的是为了接收命令行参数。因此,main 方法的参数只能是 String[] args,而不能直接传入其他类型。

2.Scanner的使用

在程序的编写中,我们经常遇到输入的情况。

例如example1

1
2
3
4
5
6
7
8
9
10
import java.util.Scanner;
public class example1{
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入A的数值:");
int A = sc.nextInt();
System.out.println("A的数值为:"+A);
}
}

屏幕截图 2024-10-30 162243

我们可以看出需要在开头引入import java.util.Scanner,它的作用是构建Scanner对象。

import加载已定义好的类或包,导入支持类(可以说JDK基础类或者自己编写的的类),可供本类调用方法和属性。import导入声明可分为两种导入声明:

  • 1>单类型导入单类型导入单类型导入单类型导入(single-type-import)

  • 2>按需类型导入按需类型导入按需类型导入按需类型导入(type-import-on-demand)

“importjava.util.*;”表示的是把util这个包下的全部类导入到程序中;而“importjava.util.Scanner;”表示的是只把util包下的Scanner类导入到程序中;

Scanner sc = new Scanner(System.in)

Scanner类的创建对象: Scanner A=new Scanner(System.in);

int A = sc.nextInt();

中 nextXxx中 的Xxx 可为int Double 等,如果需要判断是否包含下一个字符串,则可省略Xxx。hasNextXxx() 判断是否还有下一个输入项,Xxx与next相同。

Scanner类中常用的方法next()和nextLine()的区别:

next():作为字符串输入的方法,自动屏蔽掉输入的分隔符,如空格、Tab键、回车键,直到遇到有效地字符输入后,则将这些分隔符作为结束标志;

nextLine();则是将从开始运行所输入的所有的字符,包括分隔符,均作为控制台输入,只有在遇到enter回车键时,才结束输入,并将所有的内容作为输入内容传给Scanner;也就是说,next()方法并不能返回带空格、Tab键、回车符的字符串,而nextLine可以;

注意

java 的程序编译中,区分大小写,如上图中Scanner的S必须是大写,Syestem的S,String的S……..

值得注意的是,此时可能会出现黄色报错Resource leak: ‘sc’ is never closed。该报错不影响程序的运行但会占用大量内存空间导致系统资源浪费,所以编译器给出了黄色报错。如需关闭只需在在设置输入内容的代码下一行输入 sc.close;

3.封装与继承

3.1.1封装

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

3.1.2封装的优点

    1. 良好的封装能够减少耦合。
    1. 类内部的结构可以自由修改。
    1. 可以对成员变量进行更精确的控制。
    1. 隐藏信息,实现细节。

3.1.3实现Java封装的步骤

  1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
1
2
3
4
public class Person {
private String name;
private int age;
}

这段代码中,将 nameage 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

  1. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

3.2应用举例

example1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
class Member {
public String name;//公共属性name
public int salary;//公共属性salary
private String sex;//私有属性sex
private String hobby;//私有属性hobby
public void setSex(String sex) {//定义一个公共的方法来设置sex属性
this.sex=sex;
}
public String getSex() {//定义一个公共的方法来获取sex属性
return this.sex;
}
public void setHobby(String hobby) {//定义一个公共的方法来设置hobby属性
this.hobby=hobby;
}
public String getHobby() {//定义一个公共的方法来获取hobby属性
return this.hobby;
}
public void talk() {//定义一个公共的方法talk
System.out.println(name+"聊得非常开心!");
}
}
public class Demo {
public static void main(String[] args) {
Member m=new Member();
m.name="小红";//对公共属性name直接赋值
m.salary=5000;//对公共属性salary也可以直接赋值
m.setSex("女");//对私有属性操作,要通过get来访问、set来更改的方法
m.setHobby("逛街");//同上
System.out.println("姓名:"+m.name+",性别:"+m.getSex()
+",薪水:"+m.salary+",爱好:"+m.getHobby()+"!");
m.talk();//可以调用Member类中的公共方法talk
}
}

运行结果如下:

上面这段代码,我们举例一个相对简单的例子,通过注释可以看到,这就实现了封装,对于公共属性name和salary,我们可以直接对其赋值;但是对于私有属性sex和hobby,我们需要通过使用set方法来为其赋值,再通过get方法来获取其值。

俗话说,概念理解的再多再准确,也不如写一段代码熟悉的更快!下面我们再举一个和上面类似的例子吧!!!

example2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;
class Young {
private String name;
private int age;
private String major;
public void setName(String name) {
this.name=name;
}
public void setAge(int age) {
this.age=age;
}
public void setMajor(String major) {
this.major=major;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public String getMajor() {
return this.major;
}
}
public class Forever {
public static void main(String[] args) {
Young member=new Young();
member.setName("张三");
member.setAge(20);
member.setMajor("计算机科学与技术");
System.out.println("学生姓名:"+member.getName()+
",年龄:"+member.getAge()+
",专业:"+member.getMajor()+"!");
}
}

3.3 继承

3.3.1继承的概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

食草动物和食肉动物又是属于动物类。

所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

3.3.2类的继承格式

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

1
2
3
4
5
class 父类 {
}

class 子类 extends 父类 {
}

3.3.3什么需要继承

接下来我们通过实例来说明这个需求。

开发动物类,其中动物分别为企鹅以及老鼠,要求如下:

  • 企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
  • 老鼠:属性(姓名,id),方法(吃,睡,自我介绍)

企鹅类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Penguin { 
private String name;
private int id;
public Penguin(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}

老鼠类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Mouse { 
private String name;
private int id;
public Mouse(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}

从这两段代码可以看出,代码存在重复,导致代码量大且臃肿,而且维护性不高(主要表现是后期需要修改的时候,需要修改很多的代码,容易出错)。要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类:

公共父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Animal { 
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+"正在吃");
}
public void sleep(){
System.out.println(name+"正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "号" + name + ".");
}
}

这个Animal类就可以作为一个父类,然后企鹅类和老鼠类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码

企鹅类

1
2
3
4
5
public class Penguin extends Animal { 
public Penguin(String myName, int myid) {
super(myName, myid);
}
}

老鼠类

1
2
3
4
5
public class Mouse extends Animal { 
public Mouse(String myName, int myid) {
super(myName, myid);
}
}

3.3.5继承类型

需要注意的是 Java 不支持多继承,但支持多重继承。

![](java-extends-2020-12-08.png (661×671))

3.3.6继承的特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

3.4继承关键字

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。

extends关键字

1
2
3
4
5
6
7
8
9
10
11
12
public class Animal { 
private String name;
private int id;
public Animal(String myName, int myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}

public class Penguin extends Animal{
}

implements关键字

使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

1
2
3
4
5
6
7
8
9
10
11
public interface A {
public void eat();
public void sleep();
}

public interface B {
public void show();
}

public class C implements A,B {
}

super 与 this 关键字

super 关键字:我们可以通过 super 关键字来实现对父类成员的访问,用来引用当前对象的父类。

this 关键字:指向自己的引用,引用当前对象,即它所在的方法或构造函数所属的对象实例。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Animal {
void eat() {
System.out.println("animal : eat");
}
}

class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}

public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}

输出结果为:

1
2
3
animal : eat
dog : eat
animal : eat

在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

final 含义为 “最终的”。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

  • 声明类:

    1
    final class 类名 {//类体}
  • 声明方法:

    1
    修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

注: final 定义的类,其中的属性、方法不是 final 的。

3.5封装与继承实战!

编写描述动物的继承关系程序。动物包括山羊和狼,山羊和狼都具有名称和重量,但它们的行为不同,山羊吃草,狼吃肉,它们的叫声也不同,但走路行为一致。通过继承实现以上需求,并编写测试程序验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
>package ShiZhan;
>abstract class Animal{
private String name;
private double weight;

public Animal (String name, double weight){
this.name = name;
this.weight= weight;
}
public String getName(){
return name;
}
public double getWeight(){
return weight;
}
public abstract void eat();
public abstract void makeSound();

public void walk(){
System.out.println(name+"在奔跑");
}
}
class Goat extends Animal{
public Goat (String name,double weight){
super(name, weight);
}
public void eat(){
System.out.println(getName()+"在吃草");
}
public void makeSound(){
System.out.println(getName()+"说:咩~~~~~");
}
public void weight1(){
System.out.println("体重是:"+getWeight());
}
}
class Wolf extends Animal{
public Wolf (String name, double weight){
super(name, weight);
}
public void eat(){
System.out.println(getName()+"在吃肉");
}
public void makeSound(){
System.out.println(getName()+"说:喔~~~~~~~");
}
public void weight1(){
System.out.println("体重是:"+getWeight());
}

}
>public class AinmalTest {
public static void main(String[] arg){
Goat goat = new Goat("灰太狼",45.0);
Wolf wolf = new Wolf("喜羊羊",30.0);
System.out.println("关于羊:");
goat.eat();
goat.makeSound();
goat.walk();
goat.weight1();

System.out.println();

System.out.println("关于狼");
wolf.eat();
wolf.makeSound();
wolf.walk();
wolf.weight1();
}
>}

运行结果


后记

学习就是不断的学习与借鉴的,没有一蹴而就的天才。希望大家可以自动手研究,也许会在一个很小很小的问题上浪费很长时间,但茶余饭后细细品这这段时光的疲惫与不堪,一种别样的快感涌上心头,是一种看视频打游戏所无法比拟的。

参考: https://www.runoob.com/java/java-tutorial.html)

评论