Java 基础(二)
类的初始
类中包括:属性,方法。
快速使用
我们都是人,而人的共同特点有很多。
比如:名字,年龄,性别,吃饭,睡觉。。。
// 定义类
public class Person {
// 定义属性
String name, gender;
int age; // 构造方法
public Person(String name, String gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
} // 定义方法
public void eat(){
System.out.println("在吃饭");
}
public void sleep(){
System.out.println("在睡觉");
}
}
类的属性
属性就好像人的特征,如:姓名,年龄,性别
声明:
按照变量的声明规则,进行声明即可。也称之为局部变量
类的方法
在 Java 语法中,函数也被称为方法,因为是定义在类下。
一个类可以有多个方法,但是方法下不能嵌套方法。
声明:
/*
访问修饰符 返回值类型 方法名(参数列表){
逻辑
}
*/
返回值类型,void 表示没有返回值。
构造方法
- 名称与类名相同
- 没有返回值类型,也不需要void
- 创建对象时,自动调用
public class Person {
// 定义属性
String name, gender;
int age; // 构造方法
public Person(String name, String gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
}
}
方法重载
多个方法相同,根据参数类型位置进行传参。
- 允许类中的方法名一致。
- 参数不能相同。
- 和修饰符,返回值无关。
class Person {
public void show() {
System.out.println("没有参数的show方法");
} public void show(String name) {
System.out.println("我叫:" + name);
} public void show(int age) {
System.out.println("今年:" + age);
}
} class Main {
public static void main(String[] args) {
Person person = new Person();
person.show();
person.show("SPC");
person.show(18);
}
}
无限传参
- 将形参变量前加 ... 即可
- 位置必须放在,其它形参之后。
class Demo{
// 程序入口
public static void main(String[] args){
System.out.println(add(1,2,3)); // 6
}
// 多值相加
public static int add(int ...args){
int sum = 0;
for (int i = 0; i < args.length; i++) {
sum += args[i];
}
return sum;
}
}
实例化对象
类:就像一个模板。
对象:根据这个模板,产出的对象。
如:张三,李四,他们的名字不一样,但是他们是人,都有属于自己的名字。
快速使用
Person.java
public class Person {
// 定义属性
String name, gender;
int age; // 构造方法
public Person(String name, String gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
} // 定义方法
public void eat(){
System.out.println(this.name + "在吃饭");
}
public void sleep(){
System.out.println(this.name + "在睡觉");
}
}
Demo.java
public class Demo {
public static void main(String[] args){
Person zhangsan = new Person("张三", "男",22); // 实例化对象
zhangsan.eat(); // 调用 zhangsan 对象的方法
zhangsan.sleep(); Person lisi = new Person("李四", "男", 36); // 实例化对象
lisi.eat(); // 调用 lisi 对象的方法
lisi.sleep();
}
}
this
Person.java
public class Person {
public Person t(){
return this;
}
}
Demo.java
public class Demo {
public static void main(String[] args){
Person zhangsan = new Person(); // 实例化对象
Person lisi = new Person(); // 实例化对象 System.out.println(zhangsan == zhangsan.t()); // true
System.out.println(lisi == lisi.t()); // true
System.out.println(zhangsan.t() == lisi.t()); // false
}
}
总结:
this 是个指向,指向实例化后的对象。
static
可修饰类中属性或方法。
修改静态后由类直接拥有。
静态代码块
特性:
- 初始化类时,会自动执行。
- 只执行一次,不管你创建多少次。
语法:
- static { 初始化一些静态数据 }
怎么才能执行:
- 创建对象
- 创建子类对象
- 访问静态属性
- 调用静态方法
- 主动加载:Class.forName("全限定名")
实例
public class Demo {
public static void main(String[] args){
Student.show(); // 访问静态方法
}
} class Student{
String name;
static int count; // 静态属性 public static void show(){ // 静态方法
System.out.println("学生人数: " + count);
} static { // 静态代码块
count = 50;
} }
abstract
可以修饰类,也可以修饰方法
修饰类
- 被 abstract 修饰的类称为 抽象类。
- 抽象类意为不够完成,不够具体的类。
- 抽象类对象无法独立存在,即不能 new 对象。
何时定义抽象类?
我们拿动物来举例,有动物这个动物,我们所看见的都是动物的子类,而动物只是一个名词,并没有实际的载体。
这时我们可以将动物,改成抽象类。
修饰方法
- 被 abstract 修饰的方法称为抽象方法
- 类必须是抽象类,才可以创建抽象方法
- 继承抽象类的类,必须重写该抽象类所有抽象方法
实例
public class Demo {
public static void main(String[] args){
Animal dog = new Dog("旺财", 6);
Animal bird = new Bird("八哥", 3);
runDemo(dog);
runDemo(bird);
}
// 多态, 父类作为参数
public static void runDemo(Animal animal){
animal.show();
animal.eat();
}
}; // 抽象类
abstract class Animal{
String name;
int age;
public Animal(String name, int age){
this.name = name;
this.age = age;
}
// 抽象方法
public abstract void eat();
// 普通方法
public void show(){
System.out.println(this.name + "今年" + this.age + "岁了");
}
} class Dog extends Animal{
public Dog(String name, int age){
super(name, age);
}
// 必须重写eat, 因为父类eat是抽象方法
@Override
public void eat() {
System.out.println("狗狗正在吃东西。。。");
}
} class Bird extends Animal{
public Bird(String name, int age){
super(name, age);
}
// 必须重写eat, 因为父类eat是抽象方法
@Override
public void eat() {
System.out.println("鸟儿正在吃东西。。。");
}
}
final
- 修饰类 ---> 不能被继承
- 修饰方法 ---> 不能被重写
- 修改变量 ---> 不能被修改 ---> 常量
instanceof
判断对象类型。
public class Demo {
public static void main(String[] args){
Object a = new A();
System.out.println(a instanceof A); // true
System.out.println(a instanceof B); // false
}
} class A{}
class B{}
访问修饰符
类的嵌套
一个类可以嵌套一个类,被嵌套的类我们称它为 内部类。
- 内部类不可以声明:静态属性,静态方法。
- 但是可以声明:静态常量,静态最终方法。也就是 final 关键字。
快速使用
class Outer {
String name = "__Outer__";
int age = 1; class Inner{
int age = 2;
public void show(){
System.out.println(name); // 没有重名, 可以简写。
System.out.println(Outer.this.age); // 如果重名, 可以使用:外部类名 + this + 名。
System.out.println(this.age); // 加 this 可以更好了理解。
}
}
} class Test{
public static void main(String[] args) {
Outer outer = new Outer(); // 实例化外部类对象
Outer.Inner inner = outer.new Inner(); // 实例化内部类独享
inner.show(); // 内部类方法
}
}
静态内部类
- 在内部类前加 static, 正常类是不可以用 static。
- 用法与外部类相同。
class Outer {
String name = "__Outer__";
int age = 1;
// 静态内部类
static class Inner{
int age = 2;
public final void show(){
// 因为是静态内部类, 想要使用外部类的一些属性和方法, 需要实例对象。它相当于一个外部类。
Outer outer = new Outer();
System.out.println(outer.name); // 访问外部类属性
System.out.println(outer.age);
System.out.println(this.age); // 访问内部类属性
}
}
} class Test{
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner(); // 直接调用内部类
inner.show(); // 内部类方法
}
}
局部内部类
class Outer {
String name = "__Outer__";
public void show(){
// 定义局部类
class Inner{
String name = "__Inner__";
public void sayHi(){
System.out.println(Outer.this.name); // 访问外部类属性
System.out.println(this.name); // 访问局部类属性
}
}
// 调用具备类
Inner inner = new Inner();
inner.sayHi();
}
} class Test{
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
匿名内部类
匿名内部类不是类的嵌套,而是定义了一个接口,不用使用implements去实现,用new的方式
public class HelloWorldAnonymousClasses { /**
* 包含两个方法的HelloWorld接口
*/
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
} public void sayHello() { // 1、局部类EnglishGreeting实现了HelloWorld接口
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
} HelloWorld englishGreeting = new EnglishGreeting(); // 2、匿名类实现HelloWorld接口
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
}; // 3、匿名类实现HelloWorld接口
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo";
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
}; englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
} public static void main(String... args) {
HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
Lambda表达式
jdk1.8才出现Lambda表达式,只有函数式接口才可以使用Lambda表达式。可在接口上添加@FunctionalInterface,如果接口报错则不是函数式接口。
语法:()->{ }
当大括号 { } 内只有一条语句是可以去掉大括号
import java.io.IOException; public class T {
public static void main(String[] args) throws IOException {
// 不使用Lambda表达式
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("线程1...");
}
}; // 使用Lambda表达式
Runnable r2 = ()->{
System.out.println("线程2...");
}; // 使用Lambda表达式
Runnable r3 = ()-> System.out.println("线程3..."); // 运行
new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
}
}
Java 基础(二)的更多相关文章
- Java面试题总结之Java基础(二)
Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...
- Java入土--Java基础(二)
Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java基础(二) 基本类型数据类型、包装类及自动拆装箱
我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...
- [ 转载 ] Java基础二
前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...
- Java基础二(变量、运算符)
1.变量2.运算符 ###01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载 ...
- java 基础二 Graphics类
一.处理图形 1.画直线 void drawLine (int startx , int starty , int endx , int endy) 参数列表:直线开始的横坐标.纵坐标,直线结束的横坐 ...
- Java基础--二维数组
1.二维数组的定义 二维数组表示行列二维结构,在栈空间中的二维数组的地址指向堆空间中的一维数组,堆空间中的一维数组的地址又指向一维数组所在的内存空间. 2.二维数组的声明 二维数组声明有3种方式,推荐 ...
- java基础二(阅读Head First Java记录)
写在前面的话 本部分是在语法基础上的一些内容,比如内部java函数库,继承多态等 “与”和“或”运算符 1.短运算符(&&,||) &&与,必须表达式两边都为 ...
- ## Java基础(二):变量类型
Java 变量类型 一.局部变量:类的方法中的变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方语句块中被执行的时候创建,当他们执行完成后,变量被销毁 访问修饰符不能用于局部变量 ...
随机推荐
- 直播软件源码,uniapp滚动条置顶实现
直播软件源码,uniapp滚动条置顶实现 实现功能: uniapp置顶滚动条.自定义页面滚动条的位置 实现代码: uni.pageScrollTo({ scrollTop: 0, dura ...
- 在输入shell命令的list_namespace时,报 :org.apache.hadoop.hbase.PleaseHoldException: Master is initializing。
今天弄了一下午这个问题,弄到了将近十点,终于解决了,终于解决这个问题了,感谢旭旭大佬相助,不再报错了. 本来今天中午,我已经弄好了,结果我午睡了一下再看就报错了,哎.今天本来已经绝望了,后来问了一下大 ...
- python-djanggo 实现读取excel 表格在网页中展示
1.准备读取数据 放到项目文件夹下 2.熟悉表结构 3.准备处理依赖库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas o ...
- VsCode——修改左侧目录缩进
https://code84.com/741691.html https://blog.csdn.net/qq812457115/article/details/124445657
- oracle ebs 账户组合验证
DECLARE l_segment1 GL_CODE_COMBINATIONS.SEGMENT1%TYPE; l_segment2 GL_CODE_COMBINATIONS.SEGMENT2%TYPE ...
- SpringBoot(十五)单个以及多个跨域的配置方法
同源策略是浏览器的一个安全限制,要求域名.协议.端口相同,如果不同则没办法进行数据交互.而跨域配置,则是为了解除这方面的限制.前后端分离的情况下,因为需要分开部署,后台开发基本都需要进行跨域配置了.( ...
- java的排序问题
普通排序 对于基础数据类型的排序,基本只是调用一下方法 如java的 1 Arrays.sort(nums); 那么如何自定义排序规则呢? 自定义排序规则: 假设现在有这么个问题,有n个学生, 每个学 ...
- HFS~HTTP File Server 2.4rc2 20191231
后台,打卡,这有的 电脑 PC 浏览器 打开 安卓平台,浏览器,打开,界面
- QML调用C++程序
QML调用C++程序 1. 添加C++,MouseMemory文件(.h,.cpp) 2. 在main.cpp文件添加, qmlRegisterType<MouseMemory>(&quo ...
- 一 MySQL的架构与历史1.1--1.4
1.1 MySQL逻辑架构 最上层的服务并不是 MySQL 所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构.比如连接处理.授权认证.安全等等. 第二层架构是MySQL比较有意思的 ...